diff --git a/packages/table-rate-shipping/config/shipping-tables.php b/packages/table-rate-shipping/config/shipping-tables.php index b11a7c328b..9badb4badf 100644 --- a/packages/table-rate-shipping/config/shipping-tables.php +++ b/packages/table-rate-shipping/config/shipping-tables.php @@ -1,5 +1,7 @@ env('LUNAR_SHIPPING_TABLES_ENABLED', true), @@ -9,4 +11,9 @@ * or 'highest' to select the highest tax rate in the cart */ 'shipping_rate_tax_calculation' => 'default', + + 'resolvers' => [ + 'postcode' => PostcodeResolver::class, + ], + ]; diff --git a/packages/table-rate-shipping/src/Interfaces/PostcodeResolverInterface.php b/packages/table-rate-shipping/src/Interfaces/PostcodeResolverInterface.php new file mode 100644 index 0000000000..e47e31b7cf --- /dev/null +++ b/packages/table-rate-shipping/src/Interfaces/PostcodeResolverInterface.php @@ -0,0 +1,10 @@ +postcodeLookup) { $builder->orWhere(function ($qb) { $qb->whereHas('postcodes', function ($query) { - $postcodeParts = (new PostcodeResolver)->getParts( + $postcodeResolver = config('lunar.shipping-tables.resolvers.postcode', PostcodeResolver::class); + + $postcodeParts = (new $postcodeResolver)->getParts( $this->postcodeLookup->postcode ); $query->whereIn('postcode', $postcodeParts); diff --git a/tests/shipping/Stubs/Resolvers/TestCustomPostcodeResolver.php b/tests/shipping/Stubs/Resolvers/TestCustomPostcodeResolver.php new file mode 100644 index 0000000000..5a8e1656bc --- /dev/null +++ b/tests/shipping/Stubs/Resolvers/TestCustomPostcodeResolver.php @@ -0,0 +1,22 @@ +filter()->unique()->values(); + } +} diff --git a/tests/shipping/Unit/Drivers/ShippingMethods/CollectionTest.php b/tests/shipping/Unit/Drivers/ShippingMethods/CollectionTest.php index c4c83582af..952a4ff340 100644 --- a/tests/shipping/Unit/Drivers/ShippingMethods/CollectionTest.php +++ b/tests/shipping/Unit/Drivers/ShippingMethods/CollectionTest.php @@ -1,6 +1,7 @@ group('shipping', 'shipping-driver', 'shipping-driver-collection'); use Lunar\DataTypes\ShippingOption; use Lunar\Models\Currency; diff --git a/tests/shipping/Unit/Drivers/ShippingMethods/FlatRateTest.php b/tests/shipping/Unit/Drivers/ShippingMethods/FlatRateTest.php index 9c1fba6e42..9aae879625 100644 --- a/tests/shipping/Unit/Drivers/ShippingMethods/FlatRateTest.php +++ b/tests/shipping/Unit/Drivers/ShippingMethods/FlatRateTest.php @@ -1,6 +1,7 @@ group('shipping', 'shipping-driver', 'shipping-driver-flatrate'); use Lunar\DataTypes\ShippingOption; use Lunar\Models\Currency; diff --git a/tests/shipping/Unit/Drivers/ShippingMethods/FreeShippingTest.php b/tests/shipping/Unit/Drivers/ShippingMethods/FreeShippingTest.php index 904bf6907c..7bb68dfdd0 100644 --- a/tests/shipping/Unit/Drivers/ShippingMethods/FreeShippingTest.php +++ b/tests/shipping/Unit/Drivers/ShippingMethods/FreeShippingTest.php @@ -1,6 +1,7 @@ group('shipping', 'shipping-driver', 'shipping-driver-freeshiping'); use Lunar\DataTypes\ShippingOption; use Lunar\Models\Currency; diff --git a/tests/shipping/Unit/Drivers/ShippingMethods/ShipByTest.php b/tests/shipping/Unit/Drivers/ShippingMethods/ShipByTest.php index feb8f1fc8b..9a1c617d92 100644 --- a/tests/shipping/Unit/Drivers/ShippingMethods/ShipByTest.php +++ b/tests/shipping/Unit/Drivers/ShippingMethods/ShipByTest.php @@ -1,6 +1,7 @@ group('shipping', 'shipping-driver', 'shipping-driver-shipby'); use Lunar\DataTypes\ShippingOption; use Lunar\Models\Currency; diff --git a/tests/shipping/Unit/Managers/ShippingManagerTest.php b/tests/shipping/Unit/Managers/ShippingManagerTest.php index fc836a0792..64322a78b4 100644 --- a/tests/shipping/Unit/Managers/ShippingManagerTest.php +++ b/tests/shipping/Unit/Managers/ShippingManagerTest.php @@ -1,6 +1,7 @@ group('shipping', 'shipping-manager'); use Lunar\Models\CartAddress; use Lunar\Models\Country; diff --git a/tests/shipping/Unit/Models/ShippingZonePostcodeTest.php b/tests/shipping/Unit/Models/ShippingZonePostcodeTest.php index 854899b92a..6e6c6c666b 100644 --- a/tests/shipping/Unit/Models/ShippingZonePostcodeTest.php +++ b/tests/shipping/Unit/Models/ShippingZonePostcodeTest.php @@ -1,6 +1,7 @@ group('shipping', 'shipping-zone-postcode'); use Lunar\Shipping\Models\ShippingZone; use Lunar\Shipping\Models\ShippingZonePostcode; diff --git a/tests/shipping/Unit/Observers/OrderObserverTest.php b/tests/shipping/Unit/Observers/OrderObserverTest.php index 226d55f175..b5af181b81 100644 --- a/tests/shipping/Unit/Observers/OrderObserverTest.php +++ b/tests/shipping/Unit/Observers/OrderObserverTest.php @@ -3,7 +3,8 @@ use Lunar\Models\Order; use Lunar\Shipping\Observers\OrderObserver; -uses(\Lunar\Tests\Shipping\TestCase::class); +uses(\Lunar\Tests\Shipping\TestCase::class) + ->group('shipping', 'shipping-order'); uses(\Illuminate\Foundation\Testing\RefreshDatabase::class); uses(\Lunar\Tests\Shipping\TestUtils::class); diff --git a/tests/shipping/Unit/Resolvers/PostcodeResolverTest.php b/tests/shipping/Unit/Resolvers/PostcodeResolverTest.php index e8622ed00e..ed161845a4 100644 --- a/tests/shipping/Unit/Resolvers/PostcodeResolverTest.php +++ b/tests/shipping/Unit/Resolvers/PostcodeResolverTest.php @@ -1,6 +1,7 @@ group('shipping', 'shipping-postcode'); use Lunar\Shipping\Resolvers\PostcodeResolver; diff --git a/tests/shipping/Unit/Resolvers/ShippingOptionResolverTest.php b/tests/shipping/Unit/Resolvers/ShippingOptionResolverTest.php index c12fd40998..426bf3ee26 100644 --- a/tests/shipping/Unit/Resolvers/ShippingOptionResolverTest.php +++ b/tests/shipping/Unit/Resolvers/ShippingOptionResolverTest.php @@ -1,6 +1,7 @@ group('shipping', 'shipping-option'); use Lunar\Models\CartAddress; use Lunar\Models\Country; diff --git a/tests/shipping/Unit/Resolvers/ShippingRateResolverTest.php b/tests/shipping/Unit/Resolvers/ShippingRateResolverTest.php index cbbf503f48..59f31bdacd 100644 --- a/tests/shipping/Unit/Resolvers/ShippingRateResolverTest.php +++ b/tests/shipping/Unit/Resolvers/ShippingRateResolverTest.php @@ -1,6 +1,7 @@ group('shipping', 'shipping-rate'); use Lunar\Models\CartAddress; use Lunar\Models\Country; diff --git a/tests/shipping/Unit/Resolvers/ShippingZoneResolverTest.php b/tests/shipping/Unit/Resolvers/ShippingZoneResolverTest.php index 98d51c6a8f..15652e1feb 100644 --- a/tests/shipping/Unit/Resolvers/ShippingZoneResolverTest.php +++ b/tests/shipping/Unit/Resolvers/ShippingZoneResolverTest.php @@ -1,12 +1,15 @@ group('shipping', 'shipping-zone'); +use Illuminate\Support\Facades\Config; use Lunar\Models\Country; use Lunar\Models\State; use Lunar\Shipping\DataTransferObjects\PostcodeLookup; use Lunar\Shipping\Models\ShippingZone; use Lunar\Shipping\Resolvers\ShippingZoneResolver; +use Lunar\Tests\Shipping\Stubs\Resolvers\TestCustomPostcodeResolver; uses(\Illuminate\Foundation\Testing\RefreshDatabase::class); @@ -109,3 +112,45 @@ expect($zones->first()->id)->toEqual($shippingZone->id); }); + +test('can use custom postcode resolver', function () { + $country = Country::factory()->create(); + + $shippingZone = ShippingZone::factory()->create([ + 'type' => 'postcodes', + ]); + + $shippingZone->countries()->attach($country); + + $shippingZone->postcodes()->createMany([[ + 'postcode' => '390*', + ], [ + 'postcode' => '391*', + ]]); + + $shippingZone2 = ShippingZone::factory()->create([ + 'type' => 'postcodes', + ]); + + $shippingZone2->countries()->attach($country); + + $shippingZone2->postcodes()->create([ + 'postcode' => '393*', + ]); + + expect($shippingZone->refresh()->countries)->toHaveCount(1); + expect($shippingZone->refresh()->postcodes)->toHaveCount(2); + + $postcode = new PostcodeLookup( + $country, + '39100' + ); + + Config::set('lunar.shipping-tables.resolvers.postcode', TestCustomPostcodeResolver::class); + + $zones = (new ShippingZoneResolver)->postcode($postcode)->get(); + + expect($zones)->toHaveCount(1); + + expect($zones->first()->id)->toEqual($shippingZone->id); +})->group('shipping-postcode'); diff --git a/tests/shipping/Unit/ShippingModifierTest.php b/tests/shipping/Unit/ShippingModifierTest.php index f0f9ceb24b..ed84d984be 100644 --- a/tests/shipping/Unit/ShippingModifierTest.php +++ b/tests/shipping/Unit/ShippingModifierTest.php @@ -6,7 +6,8 @@ use Lunar\Shipping\Models\ShippingMethod; use Lunar\Shipping\Models\ShippingZone; -uses(\Lunar\Tests\Shipping\TestCase::class); +uses(\Lunar\Tests\Shipping\TestCase::class) + ->group('shipping', 'shipping-modifier'); uses(\Illuminate\Foundation\Testing\RefreshDatabase::class); uses(\Lunar\Tests\Shipping\TestUtils::class); @@ -76,4 +77,4 @@ $option = $cart->refresh()->getShippingOption(); expect($option->price->value)->toBe(0); -})->group('shipping-modifier'); +});