StandardTest   A
last analyzed

Complexity

Total Complexity 24

Size/Duplication

Total Lines 386
Duplicated Lines 0 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
eloc 188
dl 0
loc 386
rs 10
c 4
b 0
f 0
wmc 24

23 Methods

Rating   Name   Duplication   Size   Complexity  
A tearDown() 0 4 1
A testGetMShopException() 0 10 1
A testPost() 0 41 1
A testPostControllerException() 0 12 1
A testGetControllerException() 0 10 1
A testPostNoId() 0 14 1
A controller() 0 10 1
A testPostClientException() 0 12 1
A testGetPaymentForm() 0 17 1
A testPostException() 0 12 1
A testGetException() 0 10 1
A testGet() 0 17 1
A testGetPaymentFormNoPayment() 0 16 1
A testPostNoData() 0 13 1
A testOptions() 0 14 1
A testPostMShopException() 0 12 1
A testGetOrderException() 0 6 1
A setUp() 0 8 1
A getOrderItem() 0 7 1
A access() 0 7 1
A testGetById() 0 33 2
A object() 0 6 1
A testGetOrder() 0 7 1
1
<?php
2
3
/**
4
 * @license LGPLv3, http://opensource.org/licenses/LGPL-3.0
5
 * @copyright Aimeos (aimeos.org), 2017-2025
6
 */
7
8
9
namespace Aimeos\Client\JsonApi\Order;
10
11
12
class StandardTest extends \PHPUnit\Framework\TestCase
13
{
14
	private $context;
15
	private $view;
16
17
18
	protected function setUp() : void
19
	{
20
		\Aimeos\Controller\Frontend::cache( true );
21
22
		$this->context = \TestHelper::context();
23
		$this->view = $this->context->view();
24
25
		$this->context->setUser( \Aimeos\MShop::create( $this->context, 'customer' )->find( '[email protected]' ) );
26
	}
27
28
29
	protected function tearDown() : void
30
	{
31
		\Aimeos\Controller\Frontend::cache( false );
32
		unset( $this->view, $this->context );
33
	}
34
35
36
	public function testGet()
37
	{
38
		$params = array( 'fields' => array( 'order' => 'order.id,order.channel' ) );
39
		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $this->view, $params );
40
		$this->view->addHelper( 'param', $helper );
41
42
		$response = $this->object()->get( $this->view->request(), $this->view->response() );
43
		$result = json_decode( (string) $response->getBody(), true );
44
45
		$this->assertEquals( 200, $response->getStatusCode() );
46
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
47
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
48
49
		$this->assertEquals( 4, $result['meta']['total'] );
50
		$this->assertEquals( 'order', $result['data'][0]['type'] );
51
		$this->assertEquals( 2, count( $result['data'][0]['attributes'] ) );
52
		$this->assertArrayNotHasKey( 'errors', $result );
53
	}
54
55
56
	public function testGetById()
57
	{
58
		$manager = \Aimeos\MShop::create( $this->context, 'order' );
59
		$search = $manager->filter()->slice( 0, 1 );
60
		$search->setConditions( $search->compare( '==', 'order.channel', 'phone' ) );
61
62
		if( ( $item = $manager->search( $search )->first() ) === null ) {
63
			throw new \RuntimeException( 'No order item found' );
64
		}
65
66
		$params = [
67
			'id' => $item->getId(),
68
			'include' => 'order,order.product,order.service,order.address,order.coupon,customer',
69
			'fields' => ['customer' => 'customer.id,customer.email']
70
		];
71
		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $this->view, $params );
72
		$this->view->addHelper( 'param', $helper );
73
74
75
		$response = $this->object()->get( $this->view->request(), $this->view->response() );
76
		$result = json_decode( (string) $response->getBody(), true );
77
78
79
		$this->assertEquals( 200, $response->getStatusCode() );
80
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
81
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
82
83
		$this->assertEquals( 1, $result['meta']['total'] );
84
		$this->assertEquals( 'order', $result['data']['type'] );
85
		$this->assertEquals( 19, count( $result['data']['attributes'] ) );
86
		$this->assertEquals( 5, count( $result['data']['relationships'] ) );
87
		$this->assertEquals( 9, count( $result['included'] ) );
88
		$this->assertArrayNotHasKey( 'errors', $result );
89
	}
90
91
92
	public function testGetControllerException()
93
	{
94
		$this->controller( 'parse' )->expects( $this->once() )->method( 'parse' )
95
			->will( $this->throwException( new \Aimeos\Controller\Frontend\Exception() ) );
96
97
		$response = $this->object()->get( $this->view->request(), $this->view->response() );
98
		$result = json_decode( (string) $response->getBody(), true );
99
100
		$this->assertEquals( 403, $response->getStatusCode() );
101
		$this->assertArrayHasKey( 'errors', $result );
102
	}
103
104
105
	public function testGetMShopException()
106
	{
107
		$this->controller( 'parse' )->expects( $this->once() )->method( 'parse' )
108
			->will( $this->throwException( new \Aimeos\MShop\Exception() ) );
109
110
		$response = $this->object()->get( $this->view->request(), $this->view->response() );
111
		$result = json_decode( (string) $response->getBody(), true );
112
113
		$this->assertEquals( 404, $response->getStatusCode() );
114
		$this->assertArrayHasKey( 'errors', $result );
115
	}
116
117
118
	public function testGetException()
119
	{
120
		$this->controller( 'parse' )->expects( $this->once() )->method( 'parse' )
121
			->will( $this->throwException( new \Exception() ) );
122
123
		$response = $this->object()->get( $this->view->request(), $this->view->response() );
124
		$result = json_decode( (string) $response->getBody(), true );
125
126
		$this->assertEquals( 500, $response->getStatusCode() );
127
		$this->assertArrayHasKey( 'errors', $result );
128
	}
129
130
131
	public function testPost()
132
	{
133
		$order = \Aimeos\MShop::create( $this->context, 'order' )->create();
134
135
		$form = new \Aimeos\MShop\Common\Helper\Form\Standard();
136
		$templatePaths = \TestHelper::getTemplatePaths();
0 ignored issues
show
Unused Code introduced by
The assignment to $templatePaths is dead and can be removed.
Loading history...
137
138
		$manager = $this->getMockBuilder( \Aimeos\MShop\Order\Manager\Standard::class )
139
			->setConstructorArgs( [$this->context] )
140
			->onlyMethods( ['save'] )
141
			->getMock();
142
143
		$manager->expects( $this->once() )->method( 'save' )->willReturnArgument( 0 );
144
145
		\Aimeos\MShop::inject( \Aimeos\MShop\Order\Manager\Standard::class, $manager );
146
147
		$object = $this->getMockBuilder( \Aimeos\Client\JsonApi\Order\Standard::class )
148
			->setConstructorArgs( [$this->context, 'order'] )
149
			->onlyMethods( ['getOrder', 'getPaymentForm'] )
150
			->getMock();
151
152
		$object->setView( $this->view );
153
154
		$object->expects( $this->once() )->method( 'getOrder' )->willReturn( $order );
155
		$object->expects( $this->once() )->method( 'getPaymentForm' )->willReturn( $form );
156
157
		$body = '{"data": {"attributes": {"order.id": -1}}}';
158
		$request = $this->view->request()->withBody( $this->view->response()->createStreamFromString( $body ) );
159
160
161
		$response = $object->post( $request, $this->view->response() );
162
		$result = json_decode( (string) $response->getBody(), true );
163
164
		$this->assertEquals( 201, $response->getStatusCode() );
165
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
166
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
167
168
		$this->assertEquals( 1, $result['meta']['total'] );
169
		$this->assertEquals( 'order', $result['data']['type'] );
170
		$this->assertEquals( 19, count( $result['data']['attributes'] ) );
171
		$this->assertArrayNotHasKey( 'errors', $result );
172
	}
173
174
175
	public function testPostNoData()
176
	{
177
		$request = $this->view->request()->withBody( $this->view->response()->createStreamFromString( '{"data": []}' ) );
178
179
		$response = $this->object()->post( $request, $this->view->response() );
180
		$result = json_decode( (string) $response->getBody(), true );
181
182
		$this->assertEquals( 400, $response->getStatusCode() );
183
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
184
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
185
186
		$this->assertEquals( 0, $result['meta']['total'] );
187
		$this->assertArrayHasKey( 'errors', $result );
188
	}
189
190
191
	public function testPostNoId()
192
	{
193
		$body = '{"data": {"attributes": {}}}';
194
		$request = $this->view->request()->withBody( $this->view->response()->createStreamFromString( $body ) );
195
196
		$response = $this->object()->post( $request, $this->view->response() );
197
		$result = json_decode( (string) $response->getBody(), true );
198
199
		$this->assertEquals( 400, $response->getStatusCode() );
200
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
201
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
202
203
		$this->assertEquals( 0, $result['meta']['total'] );
204
		$this->assertArrayHasKey( 'errors', $result );
205
	}
206
207
208
	public function testPostClientException()
209
	{
210
		$request = $this->getMockBuilder( 'Psr\Http\Message\ServerRequestInterface' )->getMock();
211
212
		$request->expects( $this->once() )->method( 'getBody' )
213
			->will( $this->throwException( new \Aimeos\Client\JsonApi\Exception( '', 400 ) ) );
214
215
		$response = $this->object()->post( $request, $this->view->response() );
216
		$result = json_decode( (string) $response->getBody(), true );
217
218
		$this->assertEquals( 400, $response->getStatusCode() );
219
		$this->assertArrayHasKey( 'errors', $result );
220
	}
221
222
223
	public function testPostControllerException()
224
	{
225
		$request = $this->getMockBuilder( 'Psr\Http\Message\ServerRequestInterface' )->getMock();
226
227
		$request->expects( $this->once() )->method( 'getBody' )
228
			->will( $this->throwException( new \Aimeos\Controller\Frontend\Exception() ) );
229
230
		$response = $this->object()->post( $request, $this->view->response() );
231
		$result = json_decode( (string) $response->getBody(), true );
232
233
		$this->assertEquals( 403, $response->getStatusCode() );
234
		$this->assertArrayHasKey( 'errors', $result );
235
	}
236
237
238
	public function testPostMShopException()
239
	{
240
		$request = $this->getMockBuilder( 'Psr\Http\Message\ServerRequestInterface' )->getMock();
241
242
		$request->expects( $this->once() )->method( 'getBody' )
243
			->will( $this->throwException( new \Aimeos\MShop\Exception() ) );
244
245
		$response = $this->object()->post( $request, $this->view->response() );
246
		$result = json_decode( (string) $response->getBody(), true );
247
248
		$this->assertEquals( 404, $response->getStatusCode() );
249
		$this->assertArrayHasKey( 'errors', $result );
250
	}
251
252
253
	public function testPostException()
254
	{
255
		$request = $this->getMockBuilder( 'Psr\Http\Message\ServerRequestInterface' )->getMock();
256
257
		$request->expects( $this->once() )->method( 'getBody' )
258
			->will( $this->throwException( new \Exception() ) );
259
260
		$response = $this->object()->post( $request, $this->view->response() );
261
		$result = json_decode( (string) $response->getBody(), true );
262
263
		$this->assertEquals( 500, $response->getStatusCode() );
264
		$this->assertArrayHasKey( 'errors', $result );
265
	}
266
267
268
	public function testOptions()
269
	{
270
		$response = $this->object()->options( $this->view->request(), $this->view->response() );
271
		$result = json_decode( (string) $response->getBody(), true );
272
273
		$this->assertEquals( 200, $response->getStatusCode() );
274
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
275
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
276
277
		$this->assertEquals( null, $result['meta']['prefix'] );
278
		$this->assertEquals( 1, count( $result['meta']['attributes'] ) );
279
		$this->assertArrayNotHasKey( 'filter', $result['meta'] );
280
		$this->assertArrayNotHasKey( 'sort', $result['meta'] );
281
		$this->assertArrayNotHasKey( 'errors', $result );
282
	}
283
284
285
	public function testGetOrder()
286
	{
287
		$orderId = $this->getOrderItem()->getId();
288
		$this->context->session()->set( 'aimeos/order.id', $orderId );
289
290
		$result = $this->access( 'getOrder' )->invokeArgs( $this->object(), [$orderId] );
291
		$this->assertInstanceOf( \Aimeos\MShop\Order\Item\Iface::class, $result );
292
	}
293
294
295
	public function testGetOrderException()
296
	{
297
		$orderId = $this->getOrderItem()->getId();
298
299
		$this->expectException( \Aimeos\Client\JsonApi\Exception::class );
300
		$this->access( 'getOrder' )->invokeArgs( $this->object(), [$orderId] );
301
	}
302
303
304
	public function testGetPaymentForm()
305
	{
306
		$order = $this->getOrderItem();
307
308
		$cntl = $this->getMockBuilder( \Aimeos\Controller\Frontend\Service\Standard::class )
309
			->setConstructorArgs( [$this->context] )
310
			->onlyMethods( ['process'] )
311
			->getMock();
312
313
		$cntl->expects( $this->once() )->method( 'process' )
314
			->willReturn( new \Aimeos\MShop\Common\Helper\Form\Standard() );
315
316
		\Aimeos\Controller\Frontend::inject( '\Aimeos\Controller\Frontend\Service\Standard', $cntl );
317
		$result = $this->access( 'getPaymentForm' )->invokeArgs( $this->object(), [$order, []] );
318
		\Aimeos\Controller\Frontend::inject( '\Aimeos\Controller\Frontend\Service\Standard', null );
319
320
		$this->assertInstanceOf( \Aimeos\MShop\Common\Helper\Form\Iface::class, $result );
321
	}
322
323
324
	public function testGetPaymentFormNoPayment()
325
	{
326
		$order = \Aimeos\MShop::create( $this->context, 'order' )->create();
327
328
		$cntl = $this->getMockBuilder( \Aimeos\Controller\Frontend\Order\Standard::class )
329
			->setConstructorArgs( [$this->context] )
330
			->onlyMethods( ['save'] )
331
			->getMock();
332
333
		$cntl->expects( $this->once() )->method( 'save' );
334
335
		\Aimeos\Controller\Frontend::inject( '\Aimeos\Controller\Frontend\Order\Standard', $cntl );
336
		$result = $this->access( 'getPaymentForm' )->invokeArgs( $this->object(), [$order, []] );
337
		\Aimeos\Controller\Frontend::inject( '\Aimeos\Controller\Frontend\Order\Standard', null );
338
339
		$this->assertInstanceOf( \Aimeos\MShop\Common\Helper\Form\Iface::class, $result );
340
	}
341
342
343
	protected function access( $name )
344
	{
345
		$class = new \ReflectionClass( \Aimeos\Client\JsonApi\Order\Standard::class );
346
		$method = $class->getMethod( $name );
347
		$method->setAccessible( true );
348
349
		return $method;
350
	}
351
352
353
	/**
354
	 * Returns a stored order
355
	 *
356
	 * @return \Aimeos\MShop\Order\Item\Iface Order object
357
	 */
358
	protected function getOrderItem()
359
	{
360
		$manager = \Aimeos\MShop::create( $this->context, 'order' );
361
		$search = $manager->filter()->add( 'order.price', '==', '672.00' );
362
		$ref = ['order/address', 'order/coupon', 'order/product', 'order/service'];
363
364
		return $manager->search( $search, $ref )->first( new \Exception( 'No order item found' ) );
365
	}
366
367
368
	/**
369
	 * Returns a mocked order controller
370
	 *
371
	 * @param array|string $methods Order controller method name to mock
372
	 * @return \Aimeos\Controller\Frontend\Order\Standard Mocked order controller
373
	 */
374
	protected function controller( $methods )
375
	{
376
		$cntl = $this->getMockBuilder( \Aimeos\Controller\Frontend\Order\Standard::class )
377
			->setConstructorArgs( [$this->context] )
378
			->onlyMethods( (array) $methods )
379
			->getMock();
380
381
		\Aimeos\Controller\Frontend::inject( \Aimeos\Controller\Frontend\Order\Standard::class, $cntl );
382
383
		return $cntl;
384
	}
385
386
387
	/**
388
	 * Returns the JSON API client object
389
	 *
390
	 * @return \Aimeos\Client\JsonApi\Order\Standard JSON API client object
391
	 */
392
	protected function object()
393
	{
394
		$object = new \Aimeos\Client\JsonApi\Order\Standard( $this->context );
395
		$object->setView( $this->view );
396
397
		return $object;
398
	}
399
}
400