PluginProbe
Packeta / 2.1.2
Packeta v2.1.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 1.7.0 All 55 releases
packeta / tests / Module / WidgetOptionsBuilderTest.php

WidgetOptionsBuilderTest.php in Packeta 2.1.2, at tests/Module/WidgetOptionsBuilderTest.php

387 lines 13.2 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;
6
7 use Packetery\Core\Entity\Address;
8 use Packetery\Core\Entity\Carrier;
9 use Packetery\Core\Entity\Order;
10 use Packetery\Core\PickupPointProvider\CompoundCarrierCollectionFactory;
11 use Packetery\Core\PickupPointProvider\VendorCollectionFactory;
12 use Packetery\Module\Carrier\OptionPrefixer;
13 use Packetery\Module\Carrier\PacketaPickupPointsConfig;
14 use Packetery\Module\Framework\WpAdapter;
15 use Packetery\Module\Options\FlagManager\FeatureFlagProvider;
16 use Packetery\Module\WidgetOptionsBuilder;
17 use PHPUnit\Framework\TestCase;
18 use Tests\Core\DummyFactory;
19
20 class WidgetOptionsBuilderTest extends TestCase {
21 /**
22 * @return array[]
23 */
24 public static function pickupPointForAdminDataProvider(): array {
25 return [
26 [
27 'order' => new Order( 'dummyNumber123', DummyFactory::createCarrierZpointcz() ),
28 'expectedCountry' => 'cz',
29 'splitActive' => true,
30 'adultContent' => true,
31 'existingKeys' => [ 'language', 'appIdentity', 'weight', 'livePickupPoint', 'vendors' ],
32 'existingVendorKeys' => [ 'selected', 'country', 'group' ],
33 'vendorsSize' => 2,
34 'notExistingKeys' => [ 'carriers' ],
35 ],
36 [
37 'order' => new Order( 'dummyNumber123', DummyFactory::createCarrierZpointcz() ),
38 'expectedCountry' => 'cz',
39 'splitActive' => true,
40 'adultContent' => false,
41 'existingKeys' => [ 'language', 'appIdentity', 'weight', 'vendors' ],
42 'existingVendorKeys' => [ 'selected', 'country', 'group' ],
43 'vendorsSize' => 2,
44 'notExistingKeys' => [ 'carriers', 'livePickupPoint' ],
45 ],
46 [
47 'order' => new Order( 'dummyNumber123', DummyFactory::createCarrierCzechHdRequiresSize() ),
48 'expectedCountry' => 'cz',
49 'splitActive' => true,
50 'adultContent' => false,
51 'existingKeys' => [ 'language', 'appIdentity', 'weight', 'vendors' ],
52 'existingVendorKeys' => [ 'selected', 'carrierId' ],
53 'vendorsSize' => 1,
54 'notExistingKeys' => [ 'carriers', 'livePickupPoint' ],
55 ],
56 [
57 'order' => new Order( 'dummyNumber123', DummyFactory::createCarrierGermanHd() ),
58 'expectedCountry' => 'de',
59 'splitActive' => true,
60 'adultContent' => false,
61 'existingKeys' => [ 'language', 'appIdentity', 'weight', 'vendors' ],
62 'existingVendorKeys' => [ 'selected', 'carrierId' ],
63 'vendorsSize' => 1,
64 'notExistingKeys' => [ 'carriers', 'livePickupPoint' ],
65 ],
66 [
67 'order' => new Order( 'dummyNumber123', DummyFactory::createCarrierGermanHd() ),
68 'expectedCountry' => 'de',
69 'splitActive' => true,
70 'adultContent' => true,
71 'existingKeys' => [ 'language', 'appIdentity', 'weight', 'vendors', 'livePickupPoint' ],
72 'existingVendorKeys' => [ 'selected', 'carrierId' ],
73 'vendorsSize' => 1,
74 'notExistingKeys' => [ 'carriers' ],
75 ],
76 [
77 'order' => new Order( 'dummyNumber123', DummyFactory::createCarrierZpointcz() ),
78 'expectedCountry' => 'cz',
79 'splitActive' => false,
80 'adultContent' => true,
81 'existingKeys' => [ 'language', 'appIdentity', 'weight', 'carriers', 'livePickupPoint' ],
82 'existingVendorKeys' => [],
83 'vendorsSize' => 0,
84 'notExistingKeys' => [ 'vendors' ],
85 'carriersValueValidator' => 'is_string',
86 ],
87 [
88 'order' => new Order( 'dummyNumber123', DummyFactory::createCarrierZpointcz() ),
89 'expectedCountry' => 'cz',
90 'splitActive' => false,
91 'adultContent' => false,
92 'existingKeys' => [ 'language', 'appIdentity', 'weight', 'carriers' ],
93 'existingVendorKeys' => [],
94 'vendorsSize' => 0,
95 'notExistingKeys' => [ 'vendors', 'livePickupPoint' ],
96 'carriersValueValidator' => 'is_string',
97 ],
98 [
99 'order' => new Order( 'dummyNumber123', DummyFactory::createCarrierGermanPp() ),
100 'expectedCountry' => 'de',
101 'splitActive' => false,
102 'adultContent' => false,
103 'existingKeys' => [ 'language', 'appIdentity', 'weight', 'carriers' ],
104 'existingVendorKeys' => [],
105 'vendorsSize' => 0,
106 'notExistingKeys' => [ 'vendors', 'livePickupPoint' ],
107 'carriersValueValidator' => 'is_numeric',
108 ],
109 [
110 'order' => new Order( 'dummyNumber123', DummyFactory::createCarrierCzechHdRequiresSize() ),
111 'expectedCountry' => 'cz',
112 'splitActive' => false,
113 'adultContent' => false,
114 'existingKeys' => [ 'language', 'appIdentity', 'weight', 'carriers' ],
115 'existingVendorKeys' => [],
116 'vendorsSize' => 0,
117 'notExistingKeys' => [ 'vendors', 'livePickupPoint' ],
118 'carriersValueValidator' => 'is_null',
119 ],
120 ];
121 }
122
123 /**
124 * @dataProvider pickupPointForAdminDataProvider
125 */
126 public function testPickupPointForAdmin(
127 Order $order,
128 string $expectedCountry,
129 bool $splitActive,
130 bool $adultContent,
131 array $existingKeys,
132 array $existingVendorKeys,
133 int $vendorsSize,
134 array $notExistingKeys,
135 ?string $carriersValueValidator = null
136 ): void {
137 $wpAdapterMock = $this->createMock( WpAdapter::class );
138 $featureFlagProviderMock = $this->createMock( FeatureFlagProvider::class );
139
140 $config = new PacketaPickupPointsConfig(
141 new CompoundCarrierCollectionFactory(),
142 new VendorCollectionFactory(),
143 $featureFlagProviderMock
144 );
145
146 $builder = new WidgetOptionsBuilder(
147 $config,
148 $featureFlagProviderMock,
149 $wpAdapterMock
150 );
151
152 $featureFlagProviderMock
153 ->method( 'isSplitActive' )
154 ->willReturn( $splitActive );
155
156 $order->setShippingCountry( $order->getCarrier()->getCountry() );
157 $order->setAdultContent( $adultContent );
158 $result = $builder->createPickupPointForAdmin( $order );
159
160 $this->assertSame( $expectedCountry, $result['country'] );
161 foreach ( $existingKeys as $key ) {
162 $this->assertArrayHasKey( $key, $result );
163 }
164
165 foreach ( $notExistingKeys as $key ) {
166 $this->assertArrayNotHasKey( $key, $result );
167 }
168
169 if ( in_array( 'vendors', $existingKeys, true ) ) {
170 $this->assertCount( $vendorsSize, $result['vendors'] );
171 foreach ( $result['vendors'] as $vendor ) {
172 foreach ( $vendor as $key => $value ) {
173 $this->assertContains( $key, $existingVendorKeys );
174 }
175 }
176 } else {
177 $this->assertSame( 0, $vendorsSize, 'vendors key does not exist so its size must be 0' );
178 $this->assertEmpty( $existingVendorKeys, 'vendors key does not exist so existing keys array must be empty' );
179 }
180
181 if ( $carriersValueValidator !== null ) {
182 $this->assertTrue(
183 call_user_func( $carriersValueValidator, $result['carriers'] ),
184 // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_var_export
185 'carriers value "' . var_export( $result['carriers'], true ) . '" do not validate with ' . $carriersValueValidator
186 );
187 }
188 }
189
190 /**
191 * @return array[]
192 */
193 public static function addressForAdminDataProvider(): array {
194 $alwaysPresentKeys = [ 'country', 'language', 'layout', 'appIdentity', 'street', 'city', 'postcode' ];
195
196 return [
197 [
198 'order' => new Order( '123', DummyFactory::createCarrierZpointcz() ),
199 'address' => DummyFactory::createAddress(),
200 'expectedKeys' => $alwaysPresentKeys,
201 'nonExistingKeys' => [ 'houseNumber', 'county', 'carrierId' ],
202 ],
203 [
204 'order' => new Order( '123', DummyFactory::createCarrierZpointcz() ),
205 'address' => DummyFactory::createAddress( '123' ),
206 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'houseNumber' ] ),
207 'nonExistingKeys' => [ 'carrierId', 'county' ],
208 ],
209 [
210 'order' => new Order( '123', DummyFactory::createCarrierZpointcz() ),
211 'address' => DummyFactory::createAddress( '123', 'county' ),
212 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'houseNumber', 'county' ] ),
213 'nonExistingKeys' => [ 'carrierId' ],
214 ],
215 [
216 'order' => new Order( '123', DummyFactory::createCarrierCzechHdRequiresSize() ),
217 'address' => DummyFactory::createAddress( '123', 'county' ),
218 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'houseNumber', 'county', 'carrierId' ] ),
219 'nonExistingKeys' => [],
220 ],
221 [
222 'order' => new Order( '123', DummyFactory::createCarrierCzechHdRequiresSize() ),
223 'address' => DummyFactory::createAddress( '123' ),
224 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'houseNumber', 'carrierId' ] ),
225 'nonExistingKeys' => [],
226 ],
227 [
228 'order' => new Order( '123', DummyFactory::createCarrierCzechHdRequiresSize() ),
229 'address' => DummyFactory::createAddress(),
230 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'carrierId' ] ),
231 'nonExistingKeys' => [],
232 ],
233 ];
234 }
235
236 /**
237 * @dataProvider addressForAdminDataProvider
238 */
239 public function testAddressForAdmin(
240 Order $order,
241 Address $address,
242 array $expectedKeys,
243 array $nonExistingKeys
244 ): void {
245 $wpAdapterMock = $this->createMock( WpAdapter::class );
246 $featureFlagProviderMock = $this->createMock( FeatureFlagProvider::class );
247
248 $config = new PacketaPickupPointsConfig(
249 new CompoundCarrierCollectionFactory(),
250 new VendorCollectionFactory(),
251 $featureFlagProviderMock
252 );
253
254 $builder = new WidgetOptionsBuilder(
255 $config,
256 $featureFlagProviderMock,
257 $wpAdapterMock
258 );
259
260 $order->setDeliveryAddress( $address );
261 $result = $builder->createAddressForAdmin( $order );
262
263 foreach ( $expectedKeys as $key ) {
264 $this->assertArrayHasKey( $key, $result );
265 }
266
267 foreach ( $nonExistingKeys as $key ) {
268 $this->assertArrayNotHasKey( $key, $result );
269 }
270
271 $this->assertSame( 'hd', $result['layout'] );
272 }
273
274 /**
275 * @return array[]
276 */
277 public static function getCarrierForCheckoutDataProvider(): array {
278 $alwaysPresentKeys = [ 'id', 'is_pickup_points' ];
279
280 return [
281 [
282 'carrier' => DummyFactory::createCarrierCzechHdRequiresSize(),
283 'splitActive' => true,
284 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'address_validation' ] ),
285 'nonExistingKeys' => [ 'vendors', 'carriers' ],
286 'addressValidation' => 'optional',
287 ],
288 [
289 'carrier' => DummyFactory::createCarrierCzechHdRequiresSize(),
290 'splitActive' => false,
291 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'address_validation' ] ),
292 'nonExistingKeys' => [ 'vendors', 'carriers' ],
293 'addressValidation' => 'optional',
294 ],
295 [
296 'carrier' => DummyFactory::createCarrierGermanHd(),
297 'splitActive' => true,
298 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'address_validation' ] ),
299 'nonExistingKeys' => [ 'vendors', 'carriers' ],
300 'addressValidation' => 'none',
301 ],
302 [
303 'carrier' => DummyFactory::createCarrierGermanHd(),
304 'splitActive' => false,
305 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'address_validation' ] ),
306 'nonExistingKeys' => [ 'vendors', 'carriers' ],
307 'addressValidation' => 'none',
308 ],
309 [
310 'carrier' => DummyFactory::createCarrierZpointcz(),
311 'splitActive' => true,
312 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'vendors' ] ),
313 'nonExistingKeys' => [ 'address_validation', 'carriers' ],
314 ],
315 [
316 'carrier' => DummyFactory::createCarrierZpointcz(),
317 'splitActive' => false,
318 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'carriers' ] ),
319 'nonExistingKeys' => [ 'address_validation', 'vendors' ],
320 ],
321 [
322 'carrier' => DummyFactory::createCarrierCzzpoint(),
323 'splitActive' => true,
324 'expectedKeys' => array_merge( $alwaysPresentKeys, [ 'vendors' ] ),
325 'nonExistingKeys' => [ 'address_validation', 'carriers' ],
326 ],
327 ];
328 }
329
330 /**
331 * @dataProvider getCarrierForCheckoutDataProvider
332 */
333 public function testGetCarrierForCheckout(
334 Carrier $carrier,
335 bool $splitActive,
336 array $expectedKeys,
337 array $nonExistingKeys,
338 ?string $addressValidation = null
339 ): void {
340 $wpAdapterMock = $this->createMock( WpAdapter::class );
341 $featureFlagProviderMock = $this->createMock( FeatureFlagProvider::class );
342
343 $config = new PacketaPickupPointsConfig(
344 new CompoundCarrierCollectionFactory(),
345 new VendorCollectionFactory(),
346 $featureFlagProviderMock
347 );
348
349 $builder = new WidgetOptionsBuilder(
350 $config,
351 $featureFlagProviderMock,
352 $wpAdapterMock
353 );
354
355 $optionId = OptionPrefixer::getOptionId( $carrier->getId() );
356 $wpAdapterMock
357 ->method( 'getOption' )
358 ->willReturn(
359 [
360 'address_validation' => $addressValidation,
361 ]
362 );
363
364 $featureFlagProviderMock
365 ->method( 'isSplitActive' )
366 ->willReturn( $splitActive );
367
368 $result = $builder->getCarrierForCheckout(
369 $carrier,
370 $optionId
371 );
372
373 foreach ( $expectedKeys as $key ) {
374 $this->assertArrayHasKey( $key, $result );
375 }
376
377 foreach ( $nonExistingKeys as $key ) {
378 $this->assertArrayNotHasKey( $key, $result );
379 }
380
381 if ( $addressValidation !== null ) {
382 $this->assertContains( 'address_validation', $expectedKeys, 'address_validation key must be present in expectedKeys' );
383 $this->assertSame( $addressValidation, $result['address_validation'] );
384 }
385 }
386 }
387