File: /home/xedaptot/ai.naniguide.com/tests/Unit/OrderFulfillment/OrderHandlerResolverTest.php
<?php
/**
* OrderHandlerResolverTest — type code -> handler mapping.
*
* See docs/payment-order-plan-subscription-saas/ORDER-SYSTEM.md §5 (handler interface) + §3 (type catalog).
*/
use App\Library\OrderFulfillment\Handlers\CreditSendingTopupHandler;
use App\Library\OrderFulfillment\Handlers\CreditVerificationTopupHandler;
use App\Library\OrderFulfillment\Handlers\CustomFeeHandler;
use App\Library\OrderFulfillment\Handlers\SubscriptionChangePlanHandler;
use App\Library\OrderFulfillment\Handlers\SubscriptionNewHandler;
use App\Library\OrderFulfillment\Handlers\SubscriptionRenewHandler;
use App\Library\OrderFulfillment\OrderHandlerResolver;
use App\Library\OrderFulfillment\OrderItemHandler;
use App\Library\OrderFulfillment\OrderItemTypes;
use Tests\TestCase;
uses(TestCase::class);
it('resolves every known type to its handler instance', function (string $type, string $expectedClass) {
$resolver = app(OrderHandlerResolver::class);
$handler = $resolver->resolve($type);
expect($handler)->toBeInstanceOf(OrderItemHandler::class);
expect($handler)->toBeInstanceOf($expectedClass);
})->with([
[OrderItemTypes::SUBSCRIPTION_NEW, SubscriptionNewHandler::class],
[OrderItemTypes::SUBSCRIPTION_RENEW, SubscriptionRenewHandler::class],
[OrderItemTypes::SUBSCRIPTION_CHANGE_PLAN, SubscriptionChangePlanHandler::class],
[OrderItemTypes::CREDIT_SENDING_TOPUP, CreditSendingTopupHandler::class],
[OrderItemTypes::CREDIT_VERIFICATION_TOPUP, CreditVerificationTopupHandler::class],
[OrderItemTypes::FEE_CUSTOM, CustomFeeHandler::class],
]);
it('throws InvalidArgumentException with type in message for unknown type', function () {
$resolver = app(OrderHandlerResolver::class);
$resolver->resolve('not.a.real.type');
})->throws(\InvalidArgumentException::class, 'not.a.real.type');
it('lists all known types via knownTypes()', function () {
$resolver = app(OrderHandlerResolver::class);
$types = $resolver->knownTypes();
expect($types)->toEqualCanonicalizing(OrderItemTypes::all());
});