PluginProbe
Packeta / 2.3.2
Packeta v2.3.2
2.3.2 2.3.1 trunk 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3.0 1.3.1 1.3.2 1.4 1.4.1 1.4.2 1.4.3 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 All 56 releases
packeta / tests / Module / Checkout / OrderUpdaterTest.php

OrderUpdaterTest.php in Packeta 2.3.2, at tests/Module/Checkout/OrderUpdaterTest.php

495 lines 18.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 declare(strict_types=1);
4
5 namespace Tests\Module\Checkout;
6
7 use Packetery\Core\Entity;
8 use Packetery\Module\Carrier;
9 use Packetery\Module\Checkout\CartService;
10 use Packetery\Module\Checkout\CheckoutService;
11 use Packetery\Module\Checkout\CheckoutStorage;
12 use Packetery\Module\Checkout\OrderUpdater;
13 use Packetery\Module\DiagnosticsLogger\DiagnosticsLogger;
14 use Packetery\Module\EntityFactory\SizeFactory;
15 use Packetery\Module\Framework\WcAdapter;
16 use Packetery\Module\Framework\WpAdapter;
17 use Packetery\Module\Options\OptionsProvider;
18 use Packetery\Module\Order;
19 use Packetery\Module\Order\Attribute;
20 use Packetery\Module\Order\AttributeMapper;
21 use Packetery\Module\Order\PacketAutoSubmitter;
22 use PHPUnit\Framework\MockObject\MockObject;
23 use PHPUnit\Framework\TestCase;
24 use Tests\Core\DummyFactory;
25 use WC_Order;
26
27 class OrderUpdaterTest extends TestCase {
28 private Order\Repository&MockObject $orderRepositoryMock;
29 private CheckoutService&MockObject $checkoutServiceMock;
30 private MockObject&CheckoutStorage $checkoutStorageMock;
31 private OptionsProvider&MockObject $optionsProviderMock;
32 private AttributeMapper&MockObject $attributeMapperMock;
33 private Carrier\EntityRepository&MockObject $carrierEntityRepositoryMock;
34 private MockObject&CartService $cartServiceMock;
35 private SizeFactory&MockObject $sizeFactoryMock;
36 private DiagnosticsLogger&MockObject $diagnosticsLogger;
37 private WpAdapter&MockObject $wpAdapterMock;
38 private WcAdapter&MockObject $wcAdapterMock;
39
40 private function createOrderUpdater(): OrderUpdater {
41 $this->wpAdapterMock = $this->createMock( WpAdapter::class );
42 $this->wcAdapterMock = $this->createMock( WcAdapter::class );
43 $this->orderRepositoryMock = $this->createMock( Order\Repository::class );
44 $this->checkoutServiceMock = $this->createMock( CheckoutService::class );
45 $this->checkoutStorageMock = $this->createMock( CheckoutStorage::class );
46 $this->optionsProviderMock = $this->createMock( OptionsProvider::class );
47 $this->attributeMapperMock = $this->createMock( AttributeMapper::class );
48 $this->carrierEntityRepositoryMock = $this->createMock( Carrier\EntityRepository::class );
49 $this->cartServiceMock = $this->createMock( CartService::class );
50 $this->sizeFactoryMock = $this->createMock( SizeFactory::class );
51 $this->diagnosticsLogger = $this->createMock( DiagnosticsLogger::class );
52
53 return new OrderUpdater(
54 $this->wpAdapterMock,
55 $this->wcAdapterMock,
56 $this->orderRepositoryMock,
57 $this->checkoutServiceMock,
58 $this->checkoutStorageMock,
59 $this->optionsProviderMock,
60 $this->attributeMapperMock,
61 $this->carrierEntityRepositoryMock,
62 $this->cartServiceMock,
63 $this->createMock( PacketAutoSubmitter::class ),
64 $this->sizeFactoryMock,
65 $this->diagnosticsLogger,
66 );
67 }
68
69 public static function actionUpdateOrderPickupPointProvider(): array {
70 $carrierRequiresSize = DummyFactory::createCarrierCzechHdRequiresSize();
71
72 $defaultSize = new Entity\Size( 10.0, 20.0, 30.0 );
73 $pickupPoint = new Entity\PickupPoint();
74 $pickupPoint->setId( 'PP1' );
75
76 return [
77 'with defaults' => [
78 'data' => [
79 'resolveChosenMethod' => 'packetery:1',
80 'isPacketeryShippingMethod' => true,
81 'getPostDataIncludingStoredData' => [
82 'packetery:1' => [
83 Attribute::POINT_ID => 'PP1',
84 Attribute::POINT_NAME => 'Point Name',
85 Attribute::POINT_CITY => 'City',
86 Attribute::POINT_ZIP => '10000',
87 Attribute::POINT_STREET => 'Street 1',
88 Attribute::POINT_PLACE => 'Place',
89 Attribute::CARRIER_ID => '106',
90 ],
91 ],
92 'getCarrierIdFromPacketeryShippingMethod' => '106',
93 'isPickupPointOrder' => true,
94 'carrierEntity' => $carrierRequiresSize,
95 'getCartWeightKg' => 0.0,
96 'isDefaultWeightEnabled' => true,
97 'getDefaultWeight' => 1.5,
98 'getPackagingWeight' => 0.5,
99 'isDefaultDimensionsEnabled' => true,
100 'defaultSize' => $defaultSize,
101 'toOrderEntityPickupPoint' => $pickupPoint,
102 'replaceShippingAddressWithPickupPointAddress' => false,
103 ],
104 ],
105 'with address replacement' => [
106 'data' => [
107 'resolveChosenMethod' => 'packetery:1',
108 'isPacketeryShippingMethod' => true,
109 'getPostDataIncludingStoredData' => [
110 'packetery:1' => [
111 Attribute::POINT_ID => 'PP1',
112 Attribute::POINT_NAME => 'Point Name',
113 Attribute::POINT_CITY => 'City',
114 Attribute::POINT_ZIP => '10000',
115 Attribute::POINT_STREET => 'Street 1',
116 Attribute::POINT_PLACE => 'Place',
117 Attribute::CARRIER_ID => '106',
118 Attribute::POINT_URL => 'https://example.com',
119 ],
120 ],
121 'getCarrierIdFromPacketeryShippingMethod' => '106',
122 'isPickupPointOrder' => true,
123 'carrierEntity' => $carrierRequiresSize,
124 'getCartWeightKg' => 0.0,
125 'isDefaultWeightEnabled' => true,
126 'getDefaultWeight' => 1.5,
127 'getPackagingWeight' => 0.5,
128 'isDefaultDimensionsEnabled' => true,
129 'defaultSize' => $defaultSize,
130 'toOrderEntityPickupPoint' => $pickupPoint,
131 'replaceShippingAddressWithPickupPointAddress' => true,
132 // count of $checkoutData keys
133 'expectToWcOrderShippingAddressCalls' => 8,
134 ],
135 ],
136 ];
137 }
138
139 /**
140 * @dataProvider actionUpdateOrderPickupPointProvider
141 */
142 public function testActionUpdateOrderPickupPoint( array $data ): void {
143 $orderUpdater = $this->createOrderUpdater();
144
145 $this->checkoutServiceMock
146 ->method( 'resolveChosenMethod' )
147 ->willReturn( $data['resolveChosenMethod'] ?? null );
148 $this->checkoutServiceMock
149 ->method( 'isPacketeryShippingMethod' )
150 ->willReturn( $data['isPacketeryShippingMethod'] ?? false );
151 $this->checkoutStorageMock
152 ->method( 'getPostDataIncludingStoredData' )
153 ->willReturn( $data['getPostDataIncludingStoredData'][ $data['resolveChosenMethod'] ] ?? [] );
154
155 $this->checkoutServiceMock
156 ->method( 'getCarrierIdFromPacketeryShippingMethod' )
157 ->willReturn( $data['getCarrierIdFromPacketeryShippingMethod'] ?? '' );
158 $this->checkoutServiceMock
159 ->method( 'isPickupPointOrder' )
160 ->willReturn( $data['isPickupPointOrder'] ?? false );
161 $this->carrierEntityRepositoryMock
162 ->method( 'getAnyById' )
163 ->willReturn( $data['carrierEntity'] ?? null );
164 $this->cartServiceMock
165 ->method( 'getCartWeightKg' )
166 ->willReturn( $data['getCartWeightKg'] ?? 0.0 );
167 $this->optionsProviderMock
168 ->method( 'isDefaultWeightEnabled' )
169 ->willReturn( $data['isDefaultWeightEnabled'] ?? false );
170 $this->optionsProviderMock
171 ->method( 'getDefaultWeight' )
172 ->willReturn( $data['getDefaultWeight'] ?? 0.0 );
173 $this->optionsProviderMock
174 ->method( 'getPackagingWeight' )
175 ->willReturn( $data['getPackagingWeight'] ?? 0.0 );
176 $this->optionsProviderMock
177 ->method( 'isDefaultDimensionsEnabled' )
178 ->willReturn( $data['isDefaultDimensionsEnabled'] ?? false );
179 $this->sizeFactoryMock
180 ->method( 'createDefaultSizeForNewOrder' )
181 ->willReturn( $data['defaultSize'] ?? new Entity\Size() );
182 $this->optionsProviderMock
183 ->method( 'replaceShippingAddressWithPickupPointAddress' )
184 ->willReturn( $data['replaceShippingAddressWithPickupPointAddress'] ?? false );
185 $this->attributeMapperMock
186 ->method( 'toOrderEntityPickupPoint' )
187 ->willReturn( $data['toOrderEntityPickupPoint'] ?? new Entity\PickupPoint() );
188
189 if ( isset( $data['expectToWcOrderShippingAddressCalls'] ) ) {
190 $this->attributeMapperMock
191 ->expects( $this->exactly( $data['expectToWcOrderShippingAddressCalls'] ) )
192 ->method( 'toWcOrderShippingAddress' );
193 }
194
195 $capturedOrder = null;
196 $this->orderRepositoryMock->expects( $this->once() )
197 ->method( 'save' )
198 ->with(
199 $this->callback(
200 function ( Entity\Order $order ) use ( &$capturedOrder ): bool {
201 $capturedOrder = $order;
202
203 return true;
204 }
205 )
206 );
207
208 $wcOrderMock = $this->createMock( WC_Order::class );
209 $wcOrderMock->method( 'get_id' )->willReturn( 999 );
210 $wcOrderMock->expects( $this->once() )->method( 'save' );
211
212 $orderUpdater->actionUpdateOrder( $wcOrderMock );
213
214 $this->assertInstanceOf( Entity\Order::class, $capturedOrder );
215 $this->assertSame( '999', $capturedOrder->getNumber() );
216 $this->assertSame( 2.0, $capturedOrder->getWeight() );
217 $this->assertNotNull( $capturedOrder->getSize() );
218 $this->assertSame( 10.0, $capturedOrder->getLength() );
219 $this->assertSame( 106, $capturedOrder->getPickupPointOrCarrierId() );
220 }
221
222 public static function actionUpdateOrderEarlyReturnProvider(): array {
223 $carrier = DummyFactory::createCarrierCzechPp();
224
225 return [
226 'no order' => [
227 'data' => [
228 'nullWcOrder' => true,
229 ],
230 ],
231 'not packetery' => [
232 'data' => [
233 'resolveChosenMethod' => 'other:1',
234 'isPacketeryShippingMethod' => false,
235 ],
236 ],
237 'pickup point without data' => [
238 'data' => [
239 'resolveChosenMethod' => 'packetery:1',
240 'isPacketeryShippingMethod' => true,
241 'getPostDataIncludingStoredData' => [],
242 'getCarrierIdFromPacketeryShippingMethod' => '123',
243 'isPickupPointOrder' => true,
244 'carrierEntity' => $carrier,
245 ],
246 ],
247 'carrier not found' => [
248 'data' => [
249 'resolveChosenMethod' => 'packetery:1',
250 'isPacketeryShippingMethod' => true,
251 'getPostDataIncludingStoredData' => [ 'packetery:1' => [ Attribute::CARRIER_ID => '123' ] ],
252 'getCarrierIdFromPacketeryShippingMethod' => '123',
253 'isPickupPointOrder' => false,
254 'carrierEntity' => null,
255 ],
256 ],
257 ];
258 }
259
260 /**
261 * @dataProvider actionUpdateOrderEarlyReturnProvider
262 */
263 public function testActionUpdateOrderEarlyReturn( array $data ): void {
264 $orderUpdater = $this->createOrderUpdater();
265
266 if ( isset( $data['resolveChosenMethod'] ) ) {
267 $this->checkoutServiceMock
268 ->method( 'resolveChosenMethod' )
269 ->willReturn( $data['resolveChosenMethod'] );
270 }
271 if ( isset( $data['isPacketeryShippingMethod'] ) ) {
272 $this->checkoutServiceMock
273 ->method( 'isPacketeryShippingMethod' )
274 ->willReturn( $data['isPacketeryShippingMethod'] );
275 }
276 if ( isset( $data['getPostDataIncludingStoredData'] ) ) {
277 $this->checkoutStorageMock
278 ->method( 'getPostDataIncludingStoredData' )
279 ->willReturn( $data['getPostDataIncludingStoredData'] );
280 }
281 if ( isset( $data['getCarrierIdFromPacketeryShippingMethod'] ) ) {
282 $this->checkoutServiceMock
283 ->method( 'getCarrierIdFromPacketeryShippingMethod' )
284 ->willReturn( $data['getCarrierIdFromPacketeryShippingMethod'] );
285 }
286 if ( isset( $data['isPickupPointOrder'] ) ) {
287 $this->checkoutServiceMock
288 ->method( 'isPickupPointOrder' )
289 ->willReturn( $data['isPickupPointOrder'] );
290 }
291 if ( isset( $data['carrierEntity'] ) ) {
292 $this->carrierEntityRepositoryMock
293 ->method( 'getAnyById' )
294 ->willReturn( $data['carrierEntity'] );
295 }
296
297 $this->orderRepositoryMock->expects( $this->never() )->method( 'save' );
298
299 $orderId = 1001;
300 if ( $data['nullWcOrder'] ?? false ) {
301 $this->orderRepositoryMock
302 ->method( 'getWcOrderById' )
303 ->willReturn( null );
304 } else {
305 $wcOrderMock = $this->createMock( WC_Order::class );
306 $wcOrderMock->method( 'get_id' )->willReturn( $orderId );
307 $wcOrderMock->expects( $this->never() )->method( 'save' );
308
309 $this->orderRepositoryMock
310 ->method( 'getWcOrderById' )
311 ->willReturn( $wcOrderMock );
312 }
313
314 $orderUpdater->actionUpdateOrderById( $orderId );
315 }
316
317 public static function actionUpdateOrderNonPickupProvider(): array {
318 $carrierHd = DummyFactory::createCarrierCzechHdRequiresSize();
319 $carrierCar = DummyFactory::createCarDeliveryCarrier();
320
321 return [
322 'home delivery validated' => [
323 'data' => [
324 'resolveChosenMethod' => 'packetery:hd1',
325 'isPacketeryShippingMethod' => true,
326 'getPostDataIncludingStoredData' => [
327 'packetery:hd1' => [
328 Attribute::ADDRESS_IS_VALIDATED => '1',
329 Attribute::ADDRESS_HOUSE_NUMBER => '10',
330 Attribute::ADDRESS_STREET => 'Home Street',
331 Attribute::ADDRESS_CITY => 'Praha',
332 Attribute::ADDRESS_POST_CODE => '19000',
333 Attribute::ADDRESS_COUNTY => 'Praha',
334 Attribute::ADDRESS_COUNTRY => 'CZ',
335 Attribute::ADDRESS_LATITUDE => '50.087',
336 Attribute::ADDRESS_LONGITUDE => '14.421',
337 ],
338 ],
339 'getCarrierIdFromPacketeryShippingMethod' => '999',
340 'isPickupPointOrder' => false,
341 'isHomeDeliveryOrder' => true,
342 'areBlocksUsedInCheckout' => false,
343 'carrierEntity' => $carrierHd,
344 ],
345 ],
346 'home delivery validated blocks' => [
347 'data' => [
348 'resolveChosenMethod' => 'packetery:hd1',
349 'isPacketeryShippingMethod' => true,
350 'getPostDataIncludingStoredData' => [
351 'packetery:hd1' => [
352 Attribute::ADDRESS_IS_VALIDATED => '1',
353 Attribute::ADDRESS_HOUSE_NUMBER => '10',
354 Attribute::ADDRESS_STREET => 'Home Street',
355 Attribute::ADDRESS_CITY => 'Praha',
356 Attribute::ADDRESS_POST_CODE => '19000',
357 Attribute::ADDRESS_COUNTY => 'Praha',
358 Attribute::ADDRESS_COUNTRY => 'CZ',
359 Attribute::ADDRESS_LATITUDE => '50.087',
360 Attribute::ADDRESS_LONGITUDE => '14.421',
361 ],
362 ],
363 'getCarrierIdFromPacketeryShippingMethod' => '999',
364 'isPickupPointOrder' => false,
365 'isHomeDeliveryOrder' => true,
366 'areBlocksUsedInCheckout' => true,
367 'carrierEntity' => $carrierHd,
368 ],
369 ],
370 'car delivery' => [
371 'data' => [
372 'resolveChosenMethod' => 'packetery:car1',
373 'isPacketeryShippingMethod' => true,
374 'getPostDataIncludingStoredData' => [
375 'packetery:car1' => [
376 Attribute::CAR_DELIVERY_ID => 'cd_123',
377 Attribute::ADDRESS_STREET => 'Car Street',
378 Attribute::ADDRESS_HOUSE_NUMBER => '1',
379 Attribute::ADDRESS_CITY => 'City',
380 Attribute::ADDRESS_POST_CODE => '19000',
381 Attribute::ADDRESS_COUNTRY => 'CZ',
382 Attribute::EXPECTED_DELIVERY_FROM => '2025-01-01',
383 Attribute::EXPECTED_DELIVERY_TO => '2025-01-02',
384 ],
385 ],
386 'getCarrierIdFromPacketeryShippingMethod' => '25061',
387 'isPickupPointOrder' => false,
388 'isCarDeliveryOrder' => true,
389 'carrierEntity' => $carrierCar,
390 ],
391 ],
392 ];
393 }
394
395 /**
396 * @dataProvider actionUpdateOrderNonPickupProvider
397 */
398 public function testActionUpdateOrderNonPickup( array $data ): void {
399 $orderUpdater = $this->createOrderUpdater();
400
401 $rateId = $data['resolveChosenMethod'];
402 $checkoutData = $data['getPostDataIncludingStoredData'][ $rateId ];
403
404 $this->checkoutServiceMock
405 ->method( 'resolveChosenMethod' )
406 ->willReturn( $data['resolveChosenMethod'] );
407 $this->checkoutServiceMock
408 ->method( 'isPacketeryShippingMethod' )
409 ->willReturn( $data['isPacketeryShippingMethod'] );
410
411 $this->checkoutStorageMock
412 ->method( 'getPostDataIncludingStoredData' )
413 ->willReturn( $checkoutData );
414 $this->checkoutServiceMock
415 ->method( 'getCarrierIdFromPacketeryShippingMethod' )
416 ->willReturn( $data['getCarrierIdFromPacketeryShippingMethod'] );
417 $this->checkoutServiceMock
418 ->method( 'isPickupPointOrder' )
419 ->willReturn( $data['isPickupPointOrder'] );
420 if ( isset( $data['isHomeDeliveryOrder'] ) ) {
421 $this->checkoutServiceMock
422 ->method( 'isHomeDeliveryOrder' )
423 ->willReturn( $data['isHomeDeliveryOrder'] );
424 }
425 if ( isset( $data['areBlocksUsedInCheckout'] ) ) {
426 $this->checkoutServiceMock
427 ->method( 'areBlocksUsedInCheckout' )
428 ->willReturn( $data['areBlocksUsedInCheckout'] );
429 }
430 if ( isset( $data['isCarDeliveryOrder'] ) ) {
431 $this->checkoutServiceMock
432 ->method( 'isCarDeliveryOrder' )
433 ->willReturn( $data['isCarDeliveryOrder'] );
434 }
435 $this->carrierEntityRepositoryMock
436 ->method( 'getAnyById' )
437 ->willReturn( $data['carrierEntity'] );
438
439 if ( isset( $data['isHomeDeliveryOrder'] ) && $data['isHomeDeliveryOrder'] === true ) {
440 $validatedAddress = new Entity\Address(
441 $checkoutData[ Attribute::ADDRESS_STREET ],
442 $checkoutData[ Attribute::ADDRESS_CITY ],
443 $checkoutData[ Attribute::ADDRESS_POST_CODE ]
444 );
445 $validatedAddress->setHouseNumber( $checkoutData[ Attribute::ADDRESS_HOUSE_NUMBER ] );
446 $validatedAddress->setCounty( $checkoutData[ Attribute::ADDRESS_COUNTY ] );
447 $validatedAddress->setLatitude( $checkoutData[ Attribute::ADDRESS_LATITUDE ] );
448 $validatedAddress->setLongitude( $checkoutData[ Attribute::ADDRESS_LONGITUDE ] );
449 $this->attributeMapperMock
450 ->method( 'toValidatedAddress' )
451 ->willReturn( $validatedAddress );
452 }
453
454 if ( isset( $data['isCarDeliveryOrder'] ) && $data['isCarDeliveryOrder'] === true ) {
455 $carAddress = new Entity\Address(
456 $checkoutData[ Attribute::ADDRESS_STREET ],
457 $checkoutData[ Attribute::ADDRESS_CITY ],
458 $checkoutData[ Attribute::ADDRESS_POST_CODE ]
459 );
460 $carAddress->setHouseNumber( $checkoutData[ Attribute::ADDRESS_HOUSE_NUMBER ] );
461 $this->attributeMapperMock
462 ->method( 'toCarDeliveryAddress' )
463 ->willReturn( $carAddress );
464 }
465
466 $capturedOrder = null;
467 $this->orderRepositoryMock->expects( $this->once() )
468 ->method( 'save' )
469 ->with(
470 $this->callback(
471 function ( Entity\Order $order ) use ( &$capturedOrder ): bool {
472 $capturedOrder = $order;
473
474 return true;
475 }
476 )
477 );
478
479 $wcOrderMock = $this->createMock( WC_Order::class );
480 $wcOrderMock->method( 'get_id' )->willReturn( 2002 );
481
482 $orderUpdater->actionUpdateOrder( $wcOrderMock );
483
484 $this->assertInstanceOf( Entity\Order::class, $capturedOrder );
485 if ( isset( $data['isHomeDeliveryOrder'] ) && $data['isHomeDeliveryOrder'] === true ) {
486 $this->assertTrue( $capturedOrder->isAddressValidated() );
487 $this->assertNotNull( $capturedOrder->getValidatedDeliveryAddress() );
488 }
489 if ( isset( $data['isCarDeliveryOrder'] ) && $data['isCarDeliveryOrder'] === true ) {
490 $this->assertTrue( $capturedOrder->isAddressValidated() );
491 $this->assertSame( 'cd_123', $capturedOrder->getCarDeliveryId() );
492 }
493 }
494 }
495