HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/xedaptot/be.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());
});