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 / Integration / Api / Internal / CheckoutControllerTest.php

CheckoutControllerTest.php in Packeta 2.3.2, at tests/Integration/Api/Internal/CheckoutControllerTest.php

189 lines 7.4 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\Integration\Api\Internal;
6
7 use Packetery\Module\Api\Internal\CheckoutRouter;
8 use Packetery\Module\Api\Registrar;
9 use Packetery\Module\Checkout\CheckoutStorage;
10 use Packetery\Module\Order\Attribute;
11 use ReflectionClass;
12 use Tests\Integration\AbstractIntegrationTestCase;
13 use WP_REST_Request;
14
15 class CheckoutControllerTest extends AbstractIntegrationTestCase {
16 /**
17 * @return array{CheckoutRouter, CheckoutStorage}
18 */
19 private function registerRoutes(): array {
20 /** @var Registrar $registrar */
21 $registrar = $this->container->getByType( Registrar::class );
22 add_action( 'rest_api_init', [ $registrar, 'registerRoutes' ] );
23 /**
24 * Register routes on the required WordPress hook to avoid notices and trigger the hook so routes are actually registered for this test run.
25 */
26 do_action( 'rest_api_init' ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingSinceComment
27
28 /** @var CheckoutRouter $router */
29 $router = $this->container->getByType( CheckoutRouter::class );
30 /** @var CheckoutStorage $storage */
31 $storage = $this->container->getByType( CheckoutStorage::class );
32
33 $storage->deleteTransient();
34
35 return [ $router, $storage ];
36 }
37
38 protected function tearDown(): void {
39 remove_all_actions( 'rest_api_init' );
40 parent::tearDown();
41 }
42
43 private function buildPickupPointPayload( string $rateId ): array {
44 return array_merge(
45 [
46 'packetery_rate_id' => $rateId,
47 ],
48 [
49 Attribute::POINT_ID => 'PP123',
50 Attribute::POINT_NAME => 'Point Name',
51 Attribute::POINT_CITY => 'City',
52 Attribute::POINT_ZIP => '12345',
53 Attribute::POINT_STREET => 'Street 1',
54 Attribute::POINT_PLACE => 'Business XYZ',
55 Attribute::CARRIER_ID => 'carrier_1',
56 Attribute::POINT_URL => 'dummyUrl',
57 ]
58 );
59 }
60
61 private function buildValidatedAddressPayload( string $rateId ): array {
62 return [
63 'packetery_rate_id' => $rateId,
64 Attribute::ADDRESS_IS_VALIDATED => '1',
65 Attribute::ADDRESS_HOUSE_NUMBER => '10',
66 Attribute::ADDRESS_STREET => 'Home Street',
67 Attribute::ADDRESS_CITY => 'Praha',
68 Attribute::ADDRESS_POST_CODE => '19000',
69 Attribute::ADDRESS_COUNTY => 'Praha',
70 Attribute::ADDRESS_COUNTRY => 'CZ',
71 Attribute::ADDRESS_LATITUDE => '50.087',
72 Attribute::ADDRESS_LONGITUDE => '14.421',
73 ];
74 }
75
76 private function buildCarDeliveryPayload( string $rateId ): array {
77 return [
78 'packetery_rate_id' => $rateId,
79 Attribute::CAR_DELIVERY_ID => 'cd_123',
80 Attribute::ADDRESS_STREET => 'Car Street',
81 Attribute::ADDRESS_HOUSE_NUMBER => '1',
82 Attribute::ADDRESS_CITY => 'City',
83 Attribute::ADDRESS_POST_CODE => '19000',
84 Attribute::ADDRESS_COUNTRY => 'CZ',
85 Attribute::EXPECTED_DELIVERY_FROM => '2025-01-01',
86 Attribute::EXPECTED_DELIVERY_TO => '2025-01-02',
87 ];
88 }
89
90 public function testRegisterRoutesAndEndpointsReturn200(): void {
91 [ $router ] = $this->registerRoutes();
92
93 $request1 = new WP_REST_Request( 'POST', '/packeta/internal' . $router->getRoute( CheckoutRouter::PATH_SAVE_SELECTED_PICKUP_POINT ) );
94 $request1->set_body_params( $this->buildPickupPointPayload( 'rate_pickup_ok' ) );
95 $response1 = rest_do_request( $request1 );
96 $this->assertSame( 200, $response1->get_status() );
97
98 $request2 = new WP_REST_Request( 'POST', '/packeta/internal' . $router->getRoute( CheckoutRouter::PATH_SAVE_VALIDATED_ADDRESS ) );
99 $request2->set_body_params( $this->buildValidatedAddressPayload( 'rate_addr_ok' ) );
100 $response2 = rest_do_request( $request2 );
101 $this->assertSame( 200, $response2->get_status() );
102
103 $request3 = new WP_REST_Request( 'POST', '/packeta/internal' . $router->getRoute( CheckoutRouter::PATH_SAVE_DELIVERY_ADDRESS ) );
104 $request3->set_body_params( $this->buildCarDeliveryPayload( 'rate_car_ok' ) );
105 $response3 = rest_do_request( $request3 );
106 $this->assertSame( 200, $response3->get_status() );
107
108 $request4 = new WP_REST_Request( 'POST', '/packeta/internal' . $router->getRoute( CheckoutRouter::PATH_REMOVE_SAVED_DATA ) );
109 $response4 = rest_do_request( $request4 );
110 $this->assertSame( 200, $response4->get_status() );
111 }
112
113 public function testSaveSelectedPickupPointPersistsAndIsReadableFromTransient(): void {
114 [ $router, $storage ] = $this->registerRoutes();
115
116 $rateId = 'rate_123';
117 $payload = $this->buildPickupPointPayload( $rateId );
118
119 $request = new WP_REST_Request( 'POST', '/packeta/internal' . $router->getRoute( CheckoutRouter::PATH_SAVE_SELECTED_PICKUP_POINT ) );
120 $request->set_body_params( $payload );
121 $response = rest_do_request( $request );
122 $this->assertSame( 200, $response->get_status() );
123
124 $saved = $storage->getFromTransient();
125 $this->assertIsArray( $saved );
126 $this->assertArrayHasKey( $rateId, $saved );
127 foreach ( Attribute::$pickupPointAttributes as $attributeProperties ) {
128 $name = $attributeProperties['name'];
129 $this->assertSame( $payload[ $name ], $saved[ $rateId ][ $name ] ?? null, 'Saved value mismatch for ' . $name );
130 }
131 }
132
133 public function testRemoveSavedDataBehaviourAllSpecificAndInvalidState(): void {
134 [ $router, $storage ] = $this->registerRoutes();
135
136 $storage->setTransient(
137 [
138 'rate_1' => [ Attribute::POINT_ID => 'A' ],
139 'rate_2' => [ Attribute::POINT_ID => 'B' ],
140 ]
141 );
142
143 $requestSpecific = new WP_REST_Request( 'POST', '/packeta/internal' . $router->getRoute( CheckoutRouter::PATH_REMOVE_SAVED_DATA ) );
144 $requestSpecific->set_body_params( [ 'carrierId' => 'rate_1' ] );
145 $responseSpecific = rest_do_request( $requestSpecific );
146 $this->assertSame( 200, $responseSpecific->get_status() );
147 $afterSpecific = $storage->getFromTransient();
148 $this->assertIsArray( $afterSpecific );
149 $this->assertArrayNotHasKey( 'rate_1', $afterSpecific );
150 $this->assertArrayHasKey( 'rate_2', $afterSpecific );
151
152 $requestAll = new WP_REST_Request( 'POST', '/packeta/internal' . $router->getRoute( CheckoutRouter::PATH_REMOVE_SAVED_DATA ) );
153 $responseAll = rest_do_request( $requestAll );
154 $this->assertSame( 200, $responseAll->get_status() );
155 $this->assertFalse( $storage->getFromTransient() );
156
157 // Invalid state: transient contains empty string -> endpoint should still return 200 and clear it.
158 $reflection = new ReflectionClass( $storage );
159 $method = $reflection->getMethod( 'getTransientNamePacketaCheckoutData' );
160 $method->setAccessible( true );
161 $transientName = $method->invoke( $storage );
162 // Set invalid transient value directly via WordPress function, because the dedicated setter should not work.
163 set_transient( $transientName, '', DAY_IN_SECONDS );
164
165 $requestInvalid = new WP_REST_Request( 'POST', '/packeta/internal' . $router->getRoute( CheckoutRouter::PATH_REMOVE_SAVED_DATA ) );
166 $requestInvalid->set_body_params( [ 'carrierId' => 'any' ] );
167 $responseInvalid = rest_do_request( $requestInvalid );
168 $this->assertSame( 200, $responseInvalid->get_status() );
169 $this->assertFalse( $storage->getFromTransient() );
170 }
171
172 public function testEndpointsReturn404WhenGetUsed(): void {
173 [ $router ] = $this->registerRoutes();
174
175 $paths = [
176 CheckoutRouter::PATH_SAVE_SELECTED_PICKUP_POINT,
177 CheckoutRouter::PATH_SAVE_VALIDATED_ADDRESS,
178 CheckoutRouter::PATH_SAVE_DELIVERY_ADDRESS,
179 CheckoutRouter::PATH_REMOVE_SAVED_DATA,
180 ];
181
182 foreach ( $paths as $path ) {
183 $request = new WP_REST_Request( 'GET', '/packeta/internal' . $router->getRoute( $path ) );
184 $response = rest_do_request( $request );
185 $this->assertSame( 404, $response->get_status(), 'Expected 404 for GET on ' . $path );
186 }
187 }
188 }
189