From 393ad70e9a2cf48e40ded20c387da91ce8767c9b Mon Sep 17 00:00:00 2001 From: Nabil Azahaf Date: Thu, 6 Aug 2026 16:08:18 +0200 Subject: [PATCH 1/3] fix(checkout): guard invalid carrier settings (#513) * Guard carrier settings * test: clean carrier guard * fix: validate carrier entries * fix: ignore malformed carrier settings * refactor: simplify carrier settings guard --- .../Service/DeliveryOptionsService.php | 13 +++- .../Service/CapabilitiesValidationService.php | 7 +- .../AbstractPdkSettingsRepository.php | 14 +++- .../Model/DeliveryOptionsConfigTest.php | 5 ++ ...DeliveryOptionsServiceCapabilitiesTest.php | 38 ++++++++++- ...tionsServiceInvalidCarrierSettingsTest.php | 66 +++++++++++++++++++ .../AbstractSettingsRepositoryTest.php | 22 +++++++ 7 files changed, 159 insertions(+), 6 deletions(-) create mode 100644 tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceInvalidCarrierSettingsTest.php diff --git a/src/App/DeliveryOptions/Service/DeliveryOptionsService.php b/src/App/DeliveryOptions/Service/DeliveryOptionsService.php index fb6480d28..a57db58de 100644 --- a/src/App/DeliveryOptions/Service/DeliveryOptionsService.php +++ b/src/App/DeliveryOptions/Service/DeliveryOptionsService.php @@ -15,6 +15,7 @@ use MyParcelNL\Pdk\Base\Support\Collection; use MyParcelNL\Pdk\Base\Support\SettingKey; use MyParcelNL\Pdk\Base\Support\Utils; +use MyParcelNL\Pdk\Carrier\Collection\CarrierCollection; use MyParcelNL\Pdk\Carrier\Contract\CarrierRepositoryInterface; use MyParcelNL\Pdk\Carrier\Model\Carrier; use MyParcelNL\Pdk\Carrier\Service\CapabilitiesValidationService; @@ -229,8 +230,18 @@ private function getBaseSettings(CarrierSettings $carrierSettings, PdkCart $cart */ private function getValidCarrierOptions(PdkCart $cart): array { + $carrierSettings = Settings::get(CarrierSettings::ID); + + $carrierSettings = array_filter( + is_array($carrierSettings) ? $carrierSettings : [], + static fn($settings): bool => is_array($settings) + ); + + if (empty($carrierSettings)) { + return [DeliveryOptions::DEFAULT_PACKAGE_TYPE_NAME, new CarrierCollection()]; + } + $allCarriers = $this->carrierRepository->all(); - $carrierSettings = Settings::get(CarrierSettings::ID); $shippingAddress = $cart->shippingMethod->shippingAddress; $cc = $shippingAddress->cc ?? null; $isBusiness = $shippingAddress->isBusiness; diff --git a/src/Carrier/Service/CapabilitiesValidationService.php b/src/Carrier/Service/CapabilitiesValidationService.php index 4c8299018..2dc6d942d 100644 --- a/src/Carrier/Service/CapabilitiesValidationService.php +++ b/src/Carrier/Service/CapabilitiesValidationService.php @@ -133,11 +133,16 @@ private function getEnabledCarrierNames(): array { $carrierSettings = Settings::get(CarrierSettings::ID) ?? []; + if (! is_array($carrierSettings)) { + return []; + } + return array_keys( array_filter( $carrierSettings, static function ($settings): bool { - return ! empty($settings[CarrierSettings::DELIVERY_OPTIONS_ENABLED]); + return is_array($settings) + && ! empty($settings[CarrierSettings::DELIVERY_OPTIONS_ENABLED]); } ) ); diff --git a/src/Settings/Repository/AbstractPdkSettingsRepository.php b/src/Settings/Repository/AbstractPdkSettingsRepository.php index 121ba1da3..7e61f9db1 100644 --- a/src/Settings/Repository/AbstractPdkSettingsRepository.php +++ b/src/Settings/Repository/AbstractPdkSettingsRepository.php @@ -137,10 +137,18 @@ protected function updateSettingsFromCollection( ): Settings { $category = $this->get($this->createSettingsKey($settingsId)) ?? []; - foreach ($category as $key => $item) { - $values = ['id' => $key] + $this->get($this->createSettingsKey("$settingsId.$key")); + if (! is_array($category)) { + $category = []; + } + + foreach (array_keys($category) as $key) { + $values = $this->get($this->createSettingsKey("$settingsId.$key")); + + if (! is_array($values)) { + continue; + } - $collection->offsetSet($key, $values); + $collection->offsetSet($key, ['id' => $key] + $values); } $settings->setAttribute($settingsId, $collection); diff --git a/tests/Unit/App/Context/Model/DeliveryOptionsConfigTest.php b/tests/Unit/App/Context/Model/DeliveryOptionsConfigTest.php index 24712d07e..49d46340c 100644 --- a/tests/Unit/App/Context/Model/DeliveryOptionsConfigTest.php +++ b/tests/Unit/App/Context/Model/DeliveryOptionsConfigTest.php @@ -15,6 +15,7 @@ use MyParcelNL\Pdk\Facade\Pdk; use MyParcelNL\Pdk\Facade\Settings; use MyParcelNL\Pdk\Proposition\Proposition; +use MyParcelNL\Pdk\Settings\Model\CarrierSettings; use MyParcelNL\Pdk\Settings\Model\CheckoutSettings; use MyParcelNL\Pdk\Tests\Bootstrap\MockPdkProductRepository; use MyParcelNL\Pdk\Tests\Bootstrap\TestBootstrapper; @@ -135,6 +136,10 @@ ->withAllowPickupLocationsViewSelection(true) ->store(); + factory(CarrierSettings::class, RefCapabilitiesSharedCarrierV2::POSTNL) + ->withDeliveryOptionsEnabled(true) + ->store(); + /** @var \MyParcelNL\Pdk\Tests\Bootstrap\MockPdkProductRepository $productRepository */ $productRepository = Pdk::get(PdkProductRepositoryInterface::class); diff --git a/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceCapabilitiesTest.php b/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceCapabilitiesTest.php index 36c791420..6c4df49a8 100644 --- a/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceCapabilitiesTest.php +++ b/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceCapabilitiesTest.php @@ -13,6 +13,7 @@ use MyParcelNL\Pdk\Carrier\Model\Carrier; use MyParcelNL\Pdk\Facade\FrontendData; use MyParcelNL\Pdk\Facade\Pdk; +use MyParcelNL\Pdk\Settings\Contract\PdkSettingsRepositoryInterface; use MyParcelNL\Pdk\Settings\Model\CarrierSettings; use MyParcelNL\Pdk\Settings\Model\Settings; use MyParcelNL\Pdk\Shipment\Model\DeliveryOptions; @@ -307,6 +308,42 @@ function enqueueCapabilitiesPerType(array $responsesPerType): void ->and($result['carrierSettings'])->not->toHaveKey($disabledId); }); +it('keeps valid carriers when another carrier setting is malformed', function () { + $carrierName = RefCapabilitiesSharedCarrierV2::getAllowableEnumValues()[0]; + + storeCarrierSettings([$carrierName => true]); + + /** @var \MyParcelNL\Pdk\Settings\Contract\PdkSettingsRepositoryInterface $settingsRepository */ + $settingsRepository = Pdk::get(PdkSettingsRepositoryInterface::class); + $settingsKey = Pdk::get('createSettingsKey')(CarrierSettings::ID); + $carrierSettings = $settingsRepository->get($settingsKey); + + $settingsRepository->store($settingsKey, array_merge($carrierSettings, ['invalid' => 'invalid'])); + + factory(Shop::class) + ->withCarriers( + factory(CarrierCollection::class) + ->push(factory(Carrier::class) + ->withCarrier($carrierName) + ->withCapabilityPackageTypes(['PACKAGE'])) + ) + ->store(); + + resetStorageCache(); + + enqueueCapabilitiesPerType([ + 'PACKAGE' => [capabilityResult($carrierName, 100, ['PACKAGE'])], + ]); + + /** @var DeliveryOptionsServiceInterface $service */ + $service = Pdk::get(DeliveryOptionsServiceInterface::class); + $result = $service->createAllCarrierSettings(makeCart('NL')); + + $carrierId = FrontendData::getLegacyCarrierIdentifier($carrierName); + + expect($result['carrierSettings'])->toHaveKey($carrierId); +}); + it('passes contract ID from capabilities to carrier settings output', function () { storeCarrierSettings([RefCapabilitiesSharedCarrierV2::POSTNL => true]); @@ -476,4 +513,3 @@ function enqueueCapabilitiesPerType(array $responsesPerType): void expect($result['packageType'])->toBe(DeliveryOptions::PACKAGE_TYPE_MAILBOX_NAME); }); - diff --git a/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceInvalidCarrierSettingsTest.php b/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceInvalidCarrierSettingsTest.php new file mode 100644 index 000000000..21df8e139 --- /dev/null +++ b/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceInvalidCarrierSettingsTest.php @@ -0,0 +1,66 @@ +group('checkout'); + +usesShared(new UsesMockPdkInstance(), new UsesAccountMock()); + +it('does not expose carriers when carrier settings are missing or invalid', function ($carrierSettings) { + $settingsManager = Mockery::mock(SettingsManagerInterface::class); + $settingsManager + ->shouldReceive('get') + ->andReturnUsing(static function ( + string $key, + ?string $namespace = null, + $default = null + ) use ($carrierSettings) { + return CarrierSettings::ID === $key && null === $namespace + ? $carrierSettings + : $default; + }); + Pdk::set(SettingsManagerInterface::class, $settingsManager); + + /** @var DeliveryOptionsServiceInterface $service */ + $service = Pdk::get(DeliveryOptionsServiceInterface::class); + + $result = $service->createAllCarrierSettings(new PdkCart([ + 'shippingMethod' => [ + 'shippingAddress' => ['cc' => 'NL'], + ], + 'lines' => [ + [ + 'quantity' => 1, + 'product' => [ + 'weight' => 1000, + 'isDeliverable' => true, + ], + ], + ], + ])); + + expect($result['packageType'])->toBe(DeliveryOptions::DEFAULT_PACKAGE_TYPE_NAME) + ->and($result['carrierSettings'])->toBe([]); +})->with([ + 'missing' => [null], + 'empty array' => [[]], + 'malformed carrier entry' => [['carrier' => 'invalid']], + 'boolean value' => [false], + 'string value' => ['invalid'], +]); diff --git a/tests/Unit/Settings/Repository/AbstractSettingsRepositoryTest.php b/tests/Unit/Settings/Repository/AbstractSettingsRepositoryTest.php index eb66121ad..efb1d5b13 100644 --- a/tests/Unit/Settings/Repository/AbstractSettingsRepositoryTest.php +++ b/tests/Unit/Settings/Repository/AbstractSettingsRepositoryTest.php @@ -49,6 +49,28 @@ assertMatchesJsonSnapshot(json_encode($settings->toArrayWithoutNull())); }); +it('skips malformed entries when retrieving collection settings', function () { + /** @var \MyParcelNL\Pdk\Settings\Contract\PdkSettingsRepositoryInterface $repository */ + $repository = Pdk::get(PdkSettingsRepositoryInterface::class); + $createSettingsKey = Pdk::get('createSettingsKey'); + + $currentCarrierSettings = $repository->get($createSettingsKey(CarrierSettings::ID)); + + try { + $repository->store($createSettingsKey(CarrierSettings::ID), array_merge($currentCarrierSettings, [ + 'valid' => [CarrierSettings::DELIVERY_OPTIONS_ENABLED => true], + 'invalid' => 'invalid', + ])); + + $carrierSettings = $repository->all()->carrier; + + expect($carrierSettings->has('valid'))->toBeTrue() + ->and($carrierSettings->has('invalid'))->toBeFalse(); + } finally { + $repository->store($createSettingsKey(CarrierSettings::ID), $currentCarrierSettings); + } +}); + it('retrieves a single setting from a category', function (string $key, $expected) { /** @var \MyParcelNL\Pdk\Settings\Contract\PdkSettingsRepositoryInterface $repository */ $repository = Pdk::get(PdkSettingsRepositoryInterface::class); From d3bde6230ddbcd9ee49b6f5a5b8a7fc3b2e067cb Mon Sep 17 00:00:00 2001 From: Joeri van Veen Date: Thu, 6 Aug 2026 17:26:41 +0200 Subject: [PATCH 2/3] fix: respect insure from setting (#515) INT-1781 --- .../General/InsuranceCalculator.php | 12 +++- .../GetDeliveryOptionsEndpointTest.php | 9 +-- .../General/InsuranceCalculatorTest.php | 71 +++++++++++++++++++ 3 files changed, 85 insertions(+), 7 deletions(-) diff --git a/src/App/Order/Calculator/General/InsuranceCalculator.php b/src/App/Order/Calculator/General/InsuranceCalculator.php index bf2305fef..84528d590 100644 --- a/src/App/Order/Calculator/General/InsuranceCalculator.php +++ b/src/App/Order/Calculator/General/InsuranceCalculator.php @@ -66,8 +66,9 @@ public function calculate(): void * use those shipment-specific bounds. * * - NULL or DISABLED (0): use carrier minimum. - * - INHERIT (-1): fall back to settings; if settings do not enable insurance, use carrier default. - * - Explicit amount: resolve to nearest valid tier. + * - INHERIT (-1) or ENABLED (1): fall back to settings; if settings do not enable insurance, + * use carrier default. + * - Explicit amount (> 1): resolve to nearest valid tier. * * @param null|int $amount * @@ -93,7 +94,12 @@ private function calculateInsurance(?int $amount): int return $carrierMin; } - if (TriStateService::INHERIT === $amount) { + // ENABLED means "insurance is on, derive the amount from the carrier settings" — never a + // literal insured amount of 1 cent. TriStateOptionCalculator resolves INHERIT to ENABLED + // from the exportInsurance setting before this calculator runs, and + // CapabilitiesOptionCalculator forces ENABLED for required options, so this is the value + // real exports arrive with. + if (TriStateService::INHERIT === $amount || TriStateService::ENABLED === $amount) { return $this->calculateFromSettings($carrier, $carrierMin, $carrierMax, $carrierDefault); } diff --git a/tests/Unit/App/Endpoint/GetDeliveryOptionsEndpointTest.php b/tests/Unit/App/Endpoint/GetDeliveryOptionsEndpointTest.php index 6dc71410b..a6ef22275 100644 --- a/tests/Unit/App/Endpoint/GetDeliveryOptionsEndpointTest.php +++ b/tests/Unit/App/Endpoint/GetDeliveryOptionsEndpointTest.php @@ -351,10 +351,11 @@ $content = json_decode($response->getContent(), true); - // After TriStateOptionCalculator resolves INHERIT → ENABLED (1), InsuranceCalculator treats - // the value as an explicit amount. Tier lookup: first capabilities tier ≥ 1 = 10000 (€100 floor). - // 10000 cents (€100) → 100_000_000 micros - expect($content['shipmentOptions']['insurance']['amount'])->toBe(10000 * 10_000); + // TriStateOptionCalculator resolves INHERIT → ENABLED (1), which InsuranceCalculator reads as + // "derive the amount from the carrier settings" rather than as a literal 1-cent amount. + // Order price 100000 → nearest tier in [0,10000,25000,50000,100000] = 100000, capped by + // exportInsuranceUpTo (50000). 50000 cents (€500) → 500_000_000 micros. + expect($content['shipmentOptions']['insurance']['amount'])->toBe(50000 * 10_000); Pdk::get(PdkSettingsRepositoryInterface::class)->reset(); }); diff --git a/tests/Unit/App/Order/Calculator/General/InsuranceCalculatorTest.php b/tests/Unit/App/Order/Calculator/General/InsuranceCalculatorTest.php index 222b4d715..c095db8ef 100644 --- a/tests/Unit/App/Order/Calculator/General/InsuranceCalculatorTest.php +++ b/tests/Unit/App/Order/Calculator/General/InsuranceCalculatorTest.php @@ -8,6 +8,7 @@ use MyParcelNL\Pdk\App\Options\Definition\InsuranceDefinition; use MyParcelNL\Pdk\App\Order\Calculator\General\InsuranceCalculator; +use MyParcelNL\Pdk\App\Order\Calculator\General\TriStateOptionCalculator; use MyParcelNL\Pdk\App\Order\Contract\PdkOrderOptionsServiceInterface; use MyParcelNL\Pdk\App\Order\Contract\PdkProductRepositoryInterface; use MyParcelNL\Pdk\App\Order\Model\PdkOrder; @@ -756,3 +757,73 @@ // orderPrice 5000 < fromAmount 10000 → would return 0, but carrier min=50000 takes precedence expect($newOrder->deliveryOptions->shipmentOptions->insurance)->toBe(50000); }); + +/** + * Every other test in this file runs InsuranceCalculator in isolation, which leaves + * shipmentOptions->insurance at INHERIT. In production TriStateOptionCalculator runs first and + * resolves it from the exportInsurance setting to ENABLED (1), so the ENABLED branch — not the + * INHERIT one — is what real exports take. These cases run both calculators together to cover it. + */ +it('applies the insure-from threshold when insurance is enabled via carrier settings', function ( + array $input, + int $result +) { + mockPdkProperty('orderCalculators', [TriStateOptionCalculator::class, InsuranceCalculator::class]); + + factory(Settings::class) + ->withCarrier(RefCapabilitiesSharedCarrierV2::POSTNL, [ + (new InsuranceDefinition())->getCarrierSettingsKey() => true, + CarrierSettings::EXPORT_INSURANCE_FROM_AMOUNT => 700, + CarrierSettings::EXPORT_INSURANCE_PRICE_PERCENTAGE => 100, + CarrierSettings::EXPORT_INSURANCE_UP_TO => $input['upTo'], + ]) + ->store(); + + factory(PdkProduct::class) + ->withExternalIdentifier('threshold-product') + ->withPrice($input['orderPrice']) + ->store(); + + $order = factory(PdkOrder::class) + ->withShippingAddress(factory(ShippingAddress::class)->withCc('NL')) + ->withDeliveryOptions(factory(DeliveryOptions::class)->withCarrier(RefCapabilitiesSharedCarrierV2::POSTNL)) + ->withLines([ + factory(PdkOrderLine::class) + ->withProduct('threshold-product') + ->withPrice($input['orderPrice']), + ]) + ->make(); + + /** @var \MyParcelNL\Pdk\App\Order\Contract\PdkOrderOptionsServiceInterface $service */ + $service = Pdk::get(PdkOrderOptionsServiceInterface::class); + $newOrder = $service->calculate($order); + + expect($newOrder->deliveryOptions->shipmentOptions->insurance)->toBe($result); +}) + ->with([ + 'value € 100, insured from € 700 -> not insured' => [ + [ + 'orderPrice' => 10000, + 'upTo' => 500000, + ], + 'result' => 0, + ], + + 'value € 800, insured from € 700 -> rounded up to € 1000' => [ + [ + 'orderPrice' => 80000, + 'upTo' => 500000, + ], + 'result' => 100000, + ], + + // € 0,00 is the lowest option of the "insure up to" select, so selecting it is an explicit + // merchant choice to cap insurance at zero rather than an unconfigured value to ignore. + 'value € 800, insured up to € 0 -> not insured' => [ + [ + 'orderPrice' => 80000, + 'upTo' => 0, + ], + 'result' => 0, + ], + ]); From d7dab1569543d6d1a7894c5e4b92a001a37c215e Mon Sep 17 00:00:00 2001 From: Nabil Azahaf Date: Fri, 7 Aug 2026 10:11:30 +0200 Subject: [PATCH 3/3] revert: "fix(checkout): guard invalid carrier settings" (#513) Reverts squash commit 393ad70. The change was merged prematurely and still needs to be tested. Temporary revert to keep main releasable (the scheduled release workflow would otherwise publish this untested change). Re-land after testing by reverting this revert or re-applying the branch. Co-Authored-By: Claude Fable 5 --- .../Service/DeliveryOptionsService.php | 13 +--- .../Service/CapabilitiesValidationService.php | 7 +- .../AbstractPdkSettingsRepository.php | 14 +--- .../Model/DeliveryOptionsConfigTest.php | 5 -- ...DeliveryOptionsServiceCapabilitiesTest.php | 38 +---------- ...tionsServiceInvalidCarrierSettingsTest.php | 66 ------------------- .../AbstractSettingsRepositoryTest.php | 22 ------- 7 files changed, 6 insertions(+), 159 deletions(-) delete mode 100644 tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceInvalidCarrierSettingsTest.php diff --git a/src/App/DeliveryOptions/Service/DeliveryOptionsService.php b/src/App/DeliveryOptions/Service/DeliveryOptionsService.php index a57db58de..fb6480d28 100644 --- a/src/App/DeliveryOptions/Service/DeliveryOptionsService.php +++ b/src/App/DeliveryOptions/Service/DeliveryOptionsService.php @@ -15,7 +15,6 @@ use MyParcelNL\Pdk\Base\Support\Collection; use MyParcelNL\Pdk\Base\Support\SettingKey; use MyParcelNL\Pdk\Base\Support\Utils; -use MyParcelNL\Pdk\Carrier\Collection\CarrierCollection; use MyParcelNL\Pdk\Carrier\Contract\CarrierRepositoryInterface; use MyParcelNL\Pdk\Carrier\Model\Carrier; use MyParcelNL\Pdk\Carrier\Service\CapabilitiesValidationService; @@ -230,18 +229,8 @@ private function getBaseSettings(CarrierSettings $carrierSettings, PdkCart $cart */ private function getValidCarrierOptions(PdkCart $cart): array { - $carrierSettings = Settings::get(CarrierSettings::ID); - - $carrierSettings = array_filter( - is_array($carrierSettings) ? $carrierSettings : [], - static fn($settings): bool => is_array($settings) - ); - - if (empty($carrierSettings)) { - return [DeliveryOptions::DEFAULT_PACKAGE_TYPE_NAME, new CarrierCollection()]; - } - $allCarriers = $this->carrierRepository->all(); + $carrierSettings = Settings::get(CarrierSettings::ID); $shippingAddress = $cart->shippingMethod->shippingAddress; $cc = $shippingAddress->cc ?? null; $isBusiness = $shippingAddress->isBusiness; diff --git a/src/Carrier/Service/CapabilitiesValidationService.php b/src/Carrier/Service/CapabilitiesValidationService.php index 2dc6d942d..4c8299018 100644 --- a/src/Carrier/Service/CapabilitiesValidationService.php +++ b/src/Carrier/Service/CapabilitiesValidationService.php @@ -133,16 +133,11 @@ private function getEnabledCarrierNames(): array { $carrierSettings = Settings::get(CarrierSettings::ID) ?? []; - if (! is_array($carrierSettings)) { - return []; - } - return array_keys( array_filter( $carrierSettings, static function ($settings): bool { - return is_array($settings) - && ! empty($settings[CarrierSettings::DELIVERY_OPTIONS_ENABLED]); + return ! empty($settings[CarrierSettings::DELIVERY_OPTIONS_ENABLED]); } ) ); diff --git a/src/Settings/Repository/AbstractPdkSettingsRepository.php b/src/Settings/Repository/AbstractPdkSettingsRepository.php index 7e61f9db1..121ba1da3 100644 --- a/src/Settings/Repository/AbstractPdkSettingsRepository.php +++ b/src/Settings/Repository/AbstractPdkSettingsRepository.php @@ -137,18 +137,10 @@ protected function updateSettingsFromCollection( ): Settings { $category = $this->get($this->createSettingsKey($settingsId)) ?? []; - if (! is_array($category)) { - $category = []; - } - - foreach (array_keys($category) as $key) { - $values = $this->get($this->createSettingsKey("$settingsId.$key")); - - if (! is_array($values)) { - continue; - } + foreach ($category as $key => $item) { + $values = ['id' => $key] + $this->get($this->createSettingsKey("$settingsId.$key")); - $collection->offsetSet($key, ['id' => $key] + $values); + $collection->offsetSet($key, $values); } $settings->setAttribute($settingsId, $collection); diff --git a/tests/Unit/App/Context/Model/DeliveryOptionsConfigTest.php b/tests/Unit/App/Context/Model/DeliveryOptionsConfigTest.php index 49d46340c..24712d07e 100644 --- a/tests/Unit/App/Context/Model/DeliveryOptionsConfigTest.php +++ b/tests/Unit/App/Context/Model/DeliveryOptionsConfigTest.php @@ -15,7 +15,6 @@ use MyParcelNL\Pdk\Facade\Pdk; use MyParcelNL\Pdk\Facade\Settings; use MyParcelNL\Pdk\Proposition\Proposition; -use MyParcelNL\Pdk\Settings\Model\CarrierSettings; use MyParcelNL\Pdk\Settings\Model\CheckoutSettings; use MyParcelNL\Pdk\Tests\Bootstrap\MockPdkProductRepository; use MyParcelNL\Pdk\Tests\Bootstrap\TestBootstrapper; @@ -136,10 +135,6 @@ ->withAllowPickupLocationsViewSelection(true) ->store(); - factory(CarrierSettings::class, RefCapabilitiesSharedCarrierV2::POSTNL) - ->withDeliveryOptionsEnabled(true) - ->store(); - /** @var \MyParcelNL\Pdk\Tests\Bootstrap\MockPdkProductRepository $productRepository */ $productRepository = Pdk::get(PdkProductRepositoryInterface::class); diff --git a/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceCapabilitiesTest.php b/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceCapabilitiesTest.php index 6c4df49a8..36c791420 100644 --- a/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceCapabilitiesTest.php +++ b/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceCapabilitiesTest.php @@ -13,7 +13,6 @@ use MyParcelNL\Pdk\Carrier\Model\Carrier; use MyParcelNL\Pdk\Facade\FrontendData; use MyParcelNL\Pdk\Facade\Pdk; -use MyParcelNL\Pdk\Settings\Contract\PdkSettingsRepositoryInterface; use MyParcelNL\Pdk\Settings\Model\CarrierSettings; use MyParcelNL\Pdk\Settings\Model\Settings; use MyParcelNL\Pdk\Shipment\Model\DeliveryOptions; @@ -308,42 +307,6 @@ function enqueueCapabilitiesPerType(array $responsesPerType): void ->and($result['carrierSettings'])->not->toHaveKey($disabledId); }); -it('keeps valid carriers when another carrier setting is malformed', function () { - $carrierName = RefCapabilitiesSharedCarrierV2::getAllowableEnumValues()[0]; - - storeCarrierSettings([$carrierName => true]); - - /** @var \MyParcelNL\Pdk\Settings\Contract\PdkSettingsRepositoryInterface $settingsRepository */ - $settingsRepository = Pdk::get(PdkSettingsRepositoryInterface::class); - $settingsKey = Pdk::get('createSettingsKey')(CarrierSettings::ID); - $carrierSettings = $settingsRepository->get($settingsKey); - - $settingsRepository->store($settingsKey, array_merge($carrierSettings, ['invalid' => 'invalid'])); - - factory(Shop::class) - ->withCarriers( - factory(CarrierCollection::class) - ->push(factory(Carrier::class) - ->withCarrier($carrierName) - ->withCapabilityPackageTypes(['PACKAGE'])) - ) - ->store(); - - resetStorageCache(); - - enqueueCapabilitiesPerType([ - 'PACKAGE' => [capabilityResult($carrierName, 100, ['PACKAGE'])], - ]); - - /** @var DeliveryOptionsServiceInterface $service */ - $service = Pdk::get(DeliveryOptionsServiceInterface::class); - $result = $service->createAllCarrierSettings(makeCart('NL')); - - $carrierId = FrontendData::getLegacyCarrierIdentifier($carrierName); - - expect($result['carrierSettings'])->toHaveKey($carrierId); -}); - it('passes contract ID from capabilities to carrier settings output', function () { storeCarrierSettings([RefCapabilitiesSharedCarrierV2::POSTNL => true]); @@ -513,3 +476,4 @@ function enqueueCapabilitiesPerType(array $responsesPerType): void expect($result['packageType'])->toBe(DeliveryOptions::PACKAGE_TYPE_MAILBOX_NAME); }); + diff --git a/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceInvalidCarrierSettingsTest.php b/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceInvalidCarrierSettingsTest.php deleted file mode 100644 index 21df8e139..000000000 --- a/tests/Unit/App/DeliveryOptions/Service/DeliveryOptionsServiceInvalidCarrierSettingsTest.php +++ /dev/null @@ -1,66 +0,0 @@ -group('checkout'); - -usesShared(new UsesMockPdkInstance(), new UsesAccountMock()); - -it('does not expose carriers when carrier settings are missing or invalid', function ($carrierSettings) { - $settingsManager = Mockery::mock(SettingsManagerInterface::class); - $settingsManager - ->shouldReceive('get') - ->andReturnUsing(static function ( - string $key, - ?string $namespace = null, - $default = null - ) use ($carrierSettings) { - return CarrierSettings::ID === $key && null === $namespace - ? $carrierSettings - : $default; - }); - Pdk::set(SettingsManagerInterface::class, $settingsManager); - - /** @var DeliveryOptionsServiceInterface $service */ - $service = Pdk::get(DeliveryOptionsServiceInterface::class); - - $result = $service->createAllCarrierSettings(new PdkCart([ - 'shippingMethod' => [ - 'shippingAddress' => ['cc' => 'NL'], - ], - 'lines' => [ - [ - 'quantity' => 1, - 'product' => [ - 'weight' => 1000, - 'isDeliverable' => true, - ], - ], - ], - ])); - - expect($result['packageType'])->toBe(DeliveryOptions::DEFAULT_PACKAGE_TYPE_NAME) - ->and($result['carrierSettings'])->toBe([]); -})->with([ - 'missing' => [null], - 'empty array' => [[]], - 'malformed carrier entry' => [['carrier' => 'invalid']], - 'boolean value' => [false], - 'string value' => ['invalid'], -]); diff --git a/tests/Unit/Settings/Repository/AbstractSettingsRepositoryTest.php b/tests/Unit/Settings/Repository/AbstractSettingsRepositoryTest.php index efb1d5b13..eb66121ad 100644 --- a/tests/Unit/Settings/Repository/AbstractSettingsRepositoryTest.php +++ b/tests/Unit/Settings/Repository/AbstractSettingsRepositoryTest.php @@ -49,28 +49,6 @@ assertMatchesJsonSnapshot(json_encode($settings->toArrayWithoutNull())); }); -it('skips malformed entries when retrieving collection settings', function () { - /** @var \MyParcelNL\Pdk\Settings\Contract\PdkSettingsRepositoryInterface $repository */ - $repository = Pdk::get(PdkSettingsRepositoryInterface::class); - $createSettingsKey = Pdk::get('createSettingsKey'); - - $currentCarrierSettings = $repository->get($createSettingsKey(CarrierSettings::ID)); - - try { - $repository->store($createSettingsKey(CarrierSettings::ID), array_merge($currentCarrierSettings, [ - 'valid' => [CarrierSettings::DELIVERY_OPTIONS_ENABLED => true], - 'invalid' => 'invalid', - ])); - - $carrierSettings = $repository->all()->carrier; - - expect($carrierSettings->has('valid'))->toBeTrue() - ->and($carrierSettings->has('invalid'))->toBeFalse(); - } finally { - $repository->store($createSettingsKey(CarrierSettings::ID), $currentCarrierSettings); - } -}); - it('retrieves a single setting from a category', function (string $key, $expected) { /** @var \MyParcelNL\Pdk\Settings\Contract\PdkSettingsRepositoryInterface $repository */ $repository = Pdk::get(PdkSettingsRepositoryInterface::class);