StandardTest   A
last analyzed

Complexity

Total Complexity 25

Size/Duplication

Total Lines 505
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 25
eloc 257
c 1
b 0
f 0
dl 0
loc 505
rs 10

25 Methods

Rating   Name   Duplication   Size   Complexity  
A testPatchDenied() 0 23 1
A testOptions() 0 14 1
A testGetControllerException() 0 17 1
A testDelete() 0 27 1
A testPostMShopException() 0 8 1
A testPostException() 0 8 1
A testPatch() 0 44 1
A testGetMShopException() 0 17 1
A getReviewItem() 0 11 1
A tearDown() 0 4 1
A setUp() 0 9 1
A testPatchMShopException() 0 8 1
A testPostControllerException() 0 8 1
A testGetException() 0 17 1
A testPostMultiple() 0 38 1
A object() 0 6 1
A testDeleteException() 0 9 1
A testPatchControllerException() 0 8 1
A testPost() 0 44 1
A testGetById() 0 32 1
A testGet() 0 18 1
A testDeleteMShopException() 0 9 1
A testPatchException() 0 8 1
A testDeleteById() 0 24 1
A testDeleteControllerException() 0 9 1
1
<?php
2
3
/**
4
 * @license LGPLv3, http://opensource.org/licenses/LGPL-3.0
5
 * @copyright Aimeos (aimeos.org), 2020-2025
6
 */
7
8
9
namespace Aimeos\Client\JsonApi\Customer\Review;
10
11
12
class StandardTest extends \PHPUnit\Framework\TestCase
13
{
14
	private $context;
15
	private $object;
16
	private $view;
17
18
19
	protected function setUp() : void
20
	{
21
		\Aimeos\Controller\Frontend::cache( true );
22
23
		$this->context = \TestHelper::context();
24
		$this->view = $this->context->view();
25
26
		$this->object = new \Aimeos\Client\JsonApi\Customer\Review\Standard( $this->context );
27
		$this->object->setView( $this->view );
28
	}
29
30
31
	protected function tearDown() : void
32
	{
33
		\Aimeos\Controller\Frontend::cache( false );
34
		unset( $this->view, $this->object, $this->context );
35
	}
36
37
38
	public function testDelete()
39
	{
40
		$manager = \Aimeos\MShop::create( $this->context, 'review' );
41
		$item = $manager->create( ['review.domain' => 'product', 'review.refid' => '-1', 'review.customerid' => '-1'] );
42
		$item = $manager->save( $item->setId( null ) );
43
44
		$this->context->setUser( \Aimeos\MShop::create( $this->context, 'customer' )->create()->setId( -1 ) );
45
46
47
		$params = ['id' => -1, 'related' => 'review'];
48
		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $this->view, $params );
49
		$this->view->addHelper( 'param', $helper );
50
51
		$body = '{"data": [{"type": "review", "id": "' . $item->getId() . '"}]}';
52
		$request = $this->view->request()->withBody( $this->view->response()->createStreamFromString( $body ) );
53
54
55
		$response = $this->object->delete( $request, $this->view->response() );
56
		$result = json_decode( (string) $response->getBody(), true );
57
58
59
		$this->assertEquals( 200, $response->getStatusCode() );
60
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
61
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
62
63
		$this->assertEquals( 0, $result['meta']['total'] );
64
		$this->assertArrayNotHasKey( 'errors', $result );
65
	}
66
67
68
	public function testDeleteById()
69
	{
70
		$manager = \Aimeos\MShop::create( $this->context, 'review' );
71
		$item = $manager->create( ['review.domain' => 'product', 'review.refid' => '-1', 'review.customerid' => '-1'] );
72
		$item = $manager->save( $item->setId( null ) );
73
74
		$this->context->setUser( \Aimeos\MShop::create( $this->context, 'customer' )->create()->setId( -1 ) );
75
76
77
		$params = ['id' => -1, 'related' => 'review', 'relatedid' => $item->getId()];
78
		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $this->view, $params );
79
		$this->view->addHelper( 'param', $helper );
80
81
82
		$response = $this->object->delete( $this->view->request(), $this->view->response() );
83
		$result = json_decode( (string) $response->getBody(), true );
84
85
86
		$this->assertEquals( 200, $response->getStatusCode() );
87
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
88
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
89
90
		$this->assertEquals( 0, $result['meta']['total'] );
91
		$this->assertArrayNotHasKey( 'errors', $result );
92
	}
93
94
95
	public function testDeleteControllerException()
96
	{
97
		$mock = $this->object( 'getBody', $this->throwException( new \Aimeos\Controller\Frontend\Review\Exception() ) );
98
		$response = $this->object->delete( $mock, $this->view->response() );
99
		$result = json_decode( (string) $response->getBody(), true );
100
101
102
		$this->assertEquals( 403, $response->getStatusCode() );
103
		$this->assertArrayHasKey( 'errors', $result );
104
	}
105
106
107
	public function testDeleteMShopException()
108
	{
109
		$mock = $this->object( 'getBody', $this->throwException( new \Aimeos\MShop\Exception() ) );
110
		$response = $this->object->delete( $mock, $this->view->response() );
111
		$result = json_decode( (string) $response->getBody(), true );
112
113
114
		$this->assertEquals( 404, $response->getStatusCode() );
115
		$this->assertArrayHasKey( 'errors', $result );
116
	}
117
118
119
	public function testDeleteException()
120
	{
121
		$mock = $this->object( 'getBody', $this->throwException( new \Exception() ) );
122
		$response = $this->object->delete( $mock, $this->view->response() );
123
		$result = json_decode( (string) $response->getBody(), true );
124
125
126
		$this->assertEquals( 500, $response->getStatusCode() );
127
		$this->assertArrayHasKey( 'errors', $result );
128
	}
129
130
131
	public function testGet()
132
	{
133
		$customer = \Aimeos\MShop::create( $this->context, 'customer' )->find( '[email protected]' );
134
		$this->context->setUser( $customer );
135
136
		$response = $this->object->get( $this->view->request(), $this->view->response() );
137
		$result = json_decode( (string) $response->getBody(), true );
138
139
		$this->assertEquals( 200, $response->getStatusCode() );
140
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
141
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
142
143
		$this->assertEquals( 4, $result['meta']['total'] );
144
		$this->assertEquals( 'review', $result['data'][0]['type'] );
145
		$this->assertNotNull( $result['data'][0]['id'] );
146
		$this->assertGreaterThan( 3, count( $result['data'][0]['attributes'] ) );
147
148
		$this->assertArrayNotHasKey( 'errors', $result );
149
	}
150
151
152
	public function testGetById()
153
	{
154
		$customer = \Aimeos\MShop::create( $this->context, 'customer' )->find( '[email protected]' );
155
		$this->context->setUser( $customer );
156
157
		$manager = \Aimeos\MShop::create( $this->context, 'review' );
158
		$item = $manager->search( $manager->filter()->add( 'review.customerid', '==', $customer->getId() ) )->first();
159
160
161
		$params = array(
162
			'id' => $customer->getId(),
163
			'related' => 'review',
164
			'relatedid' => $item->getId(),
165
			'fields' => ['review' => 'review.id,review.rating'],
166
		);
167
		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $this->view, $params );
168
		$this->view->addHelper( 'param', $helper );
169
170
171
		$response = $this->object->get( $this->view->request(), $this->view->response() );
172
		$result = json_decode( (string) $response->getBody(), true );
173
174
		$this->assertEquals( 200, $response->getStatusCode() );
175
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
176
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
177
178
		$this->assertEquals( 1, $result['meta']['total'] );
179
		$this->assertEquals( 'review', $result['data']['type'] );
180
		$this->assertEquals( 2, count( $result['data']['attributes'] ) );
181
		$this->assertNotNull( $result['data']['id'] );
182
183
		$this->assertArrayNotHasKey( 'errors', $result );
184
	}
185
186
187
	public function testGetControllerException()
188
	{
189
		$cntl = $this->getMockBuilder( \Aimeos\Controller\Frontend\Review\Standard::class )
190
			->setConstructorArgs( [$this->context] )
191
			->onlyMethods( ['list'] )
192
			->getMock();
193
194
		$cntl->expects( $this->once() )->method( 'list' )
195
			->will( $this->throwException( new \Aimeos\Controller\Frontend\Review\Exception() ) );
196
197
		\Aimeos\Controller\Frontend::inject( \Aimeos\Controller\Frontend\Review\Standard::class, $cntl );
198
199
		$response = $this->object->get( $this->view->request(), $this->view->response() );
200
		$result = json_decode( (string) $response->getBody(), true );
201
202
		$this->assertEquals( 403, $response->getStatusCode() );
203
		$this->assertArrayHasKey( 'errors', $result );
204
	}
205
206
207
	public function testGetMShopException()
208
	{
209
		$cntl = $this->getMockBuilder( \Aimeos\Controller\Frontend\Review\Standard::class )
210
			->setConstructorArgs( [$this->context] )
211
			->onlyMethods( ['list'] )
212
			->getMock();
213
214
		$cntl->expects( $this->once() )->method( 'list' )
215
			->will( $this->throwException( new \Aimeos\MShop\Exception() ) );
216
217
		\Aimeos\Controller\Frontend::inject( \Aimeos\Controller\Frontend\Review\Standard::class, $cntl );
218
219
		$response = $this->object->get( $this->view->request(), $this->view->response() );
220
		$result = json_decode( (string) $response->getBody(), true );
221
222
		$this->assertEquals( 404, $response->getStatusCode() );
223
		$this->assertArrayHasKey( 'errors', $result );
224
	}
225
226
227
	public function testGetException()
228
	{
229
		$cntl = $this->getMockBuilder( \Aimeos\Controller\Frontend\Review\Standard::class )
230
			->setConstructorArgs( [$this->context] )
231
			->onlyMethods( ['list'] )
232
			->getMock();
233
234
		$cntl->expects( $this->once() )->method( 'list' )
235
			->will( $this->throwException( new \Exception() ) );
236
237
		\Aimeos\Controller\Frontend::inject( \Aimeos\Controller\Frontend\Review\Standard::class, $cntl );
238
239
		$response = $this->object->get( $this->view->request(), $this->view->response() );
240
		$result = json_decode( (string) $response->getBody(), true );
241
242
		$this->assertEquals( 500, $response->getStatusCode() );
243
		$this->assertArrayHasKey( 'errors', $result );
244
	}
245
246
247
	public function testPatch()
248
	{
249
		$customer = \Aimeos\MShop::create( $this->context, 'customer' )->find( '[email protected]' );
250
		$this->context->setUser( $customer );
251
		$item = $this->getReviewItem();
252
253
254
		$params = ['id' => -1, 'related' => 'review', 'relatedid' => $item->getId()];
255
		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $this->view, $params );
256
		$this->view->addHelper( 'param', $helper );
257
258
		$body = '{"data": {"type": "review", "id": "-1", "attributes": {
259
			"review.orderproductid": "' . $item->getOrderProductId() . '",
260
			"review.customerid": "' . $customer->getId() . '",
261
			"review.domain": "product",
262
			"review.name": "test user",
263
			"review.comment": "test comment",
264
			"review.response": "not allowed",
265
			"review.rating": 10,
266
			"review.status": 0
267
		}}}';
268
		$request = $this->view->request()->withBody( $this->view->response()->createStreamFromString( $body ) );
269
270
271
		$response = $this->object->patch( $request, $this->view->response() );
272
		$result = json_decode( (string) $response->getBody(), true );
273
274
		\Aimeos\MShop::create( $this->context, 'review' )->save( $item->setModified() );
275
276
277
		$this->assertEquals( 200, $response->getStatusCode() );
278
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
279
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
280
281
		$this->assertNotNull( $result['data']['attributes']['review.refid'] );
282
		$this->assertEquals( 'product', $result['data']['attributes']['review.domain'] );
283
		$this->assertEquals( 'test user', $result['data']['attributes']['review.name'] );
284
		$this->assertEquals( 'test comment', $result['data']['attributes']['review.comment'] );
285
		$this->assertEquals( 'owner response', $result['data']['attributes']['review.response'] );
286
		$this->assertEquals( '5', $result['data']['attributes']['review.rating'] );
287
		$this->assertEquals( '-1', $result['data']['attributes']['review.status'] );
288
289
		$this->assertEquals( 1, $result['meta']['total'] );
290
		$this->assertArrayNotHasKey( 'errors', $result );
291
	}
292
293
294
	public function testPatchDenied()
295
	{
296
		$this->context->setUser( null );
297
298
		$params = ['id' => -2, 'related' => 'review', 'relatedid' => -1];
299
		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $this->view, $params );
300
		$this->view->addHelper( 'param', $helper );
301
302
		$body = '{"data": {"type": "review", "id": "-1", "attributes": {
303
			"review.domain": "test"
304
		}}}';
305
		$request = $this->view->request()->withBody( $this->view->response()->createStreamFromString( $body ) );
306
307
308
		$response = $this->object->patch( $request, $this->view->response() );
309
		$result = json_decode( (string) $response->getBody(), true );
310
311
		$this->assertEquals( 403, $response->getStatusCode() );
312
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
313
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
314
315
		$this->assertEquals( 0, $result['meta']['total'] );
316
		$this->assertArrayHasKey( 'errors', $result );
317
	}
318
319
320
	public function testPatchControllerException()
321
	{
322
		$mock = $this->object( 'getBody', $this->throwException( new \Aimeos\Controller\Frontend\Review\Exception() ) );
323
		$response = $this->object->patch( $mock, $this->view->response() );
324
		$result = json_decode( (string) $response->getBody(), true );
325
326
		$this->assertEquals( 403, $response->getStatusCode() );
327
		$this->assertArrayHasKey( 'errors', $result );
328
	}
329
330
331
	public function testPatchMShopException()
332
	{
333
		$mock = $this->object( 'getBody', $this->throwException( new \Aimeos\MShop\Exception() ) );
334
		$response = $this->object->patch( $mock, $this->view->response() );
335
		$result = json_decode( (string) $response->getBody(), true );
336
337
		$this->assertEquals( 404, $response->getStatusCode() );
338
		$this->assertArrayHasKey( 'errors', $result );
339
	}
340
341
342
	public function testPatchException()
343
	{
344
		$mock = $this->object( 'getBody', $this->throwException( new \Exception() ) );
345
		$response = $this->object->patch( $mock, $this->view->response() );
346
		$result = json_decode( (string) $response->getBody(), true );
347
348
		$this->assertEquals( 500, $response->getStatusCode() );
349
		$this->assertArrayHasKey( 'errors', $result );
350
	}
351
352
353
	public function testPost()
354
	{
355
		$customer = \Aimeos\MShop::create( $this->context, 'customer' )->find( '[email protected]' );
356
		$this->context->setUser( $customer );
357
358
		$manager = \Aimeos\MShop::create( $this->context, 'order/product' );
359
		$filter = $manager->filter()->add( ['order.product.prodcode' => 'ABCD'] );
360
		$item = $manager->search( $filter )->first( new \RuntimeException( 'Order product item not found' ) );
361
362
		$params = ['id' => -1, 'related' => 'review'];
363
		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $this->view, $params );
364
		$this->view->addHelper( 'param', $helper );
365
366
		$body = '{"data": {"type": "review", "attributes": {
367
			"review.orderproductid": "' . $item->getId() . '",
368
			"review.customerid": "' . $customer->getId() . '",
369
			"review.domain": "product",
370
			"review.name": "test user",
371
			"review.comment": "test comment",
372
			"review.response": "not allowed",
373
			"review.rating": -1,
374
			"review.status": 0
375
		}}}';
376
		$request = $this->view->request()->withBody( $this->view->response()->createStreamFromString( $body ) );
377
378
379
		$response = $this->object->post( $request, $this->view->response() );
380
		$result = json_decode( (string) $response->getBody(), true );
381
382
		$this->assertEquals( 201, $response->getStatusCode() );
383
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
384
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
385
386
		\Aimeos\MShop::create( $this->context, 'review' )->delete( $result['data'][0]['id'] );
387
388
		$this->assertNotNull( $result['data'][0]['attributes']['review.refid'] );
389
		$this->assertEquals( 'product', $result['data'][0]['attributes']['review.domain'] );
390
		$this->assertEquals( 'test user', $result['data'][0]['attributes']['review.name'] );
391
		$this->assertEquals( 'test comment', $result['data'][0]['attributes']['review.comment'] );
392
		$this->assertEquals( '', $result['data'][0]['attributes']['review.response'] );
393
		$this->assertEquals( '0', $result['data'][0]['attributes']['review.rating'] );
394
395
		$this->assertEquals( 1, $result['meta']['total'] );
396
		$this->assertArrayNotHasKey( 'errors', $result );
397
	}
398
399
400
	public function testPostMultiple()
401
	{
402
		$customer = \Aimeos\MShop::create( $this->context, 'customer' )->find( '[email protected]' );
403
		$this->context->setUser( $customer );
404
405
		$manager = \Aimeos\MShop::create( $this->context, 'order/product' );
406
		$items = $manager->search( $manager->filter()->add( ['order.product.prodcode' => 'ABCD'] ) );
407
408
		$params = ['id' => -1, 'related' => 'review'];
409
		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $this->view, $params );
410
		$this->view->addHelper( 'param', $helper );
411
412
		$body = '{"data": [{
413
			"type": "review", "attributes": {
414
				"review.orderproductid": "' . $items->first()->getId() . '",
415
				"review.customerid": "' . $customer->getId() . '",
416
				"review.domain": "product",
417
				"review.comment": "test comment"
418
			}
419
		}]}';
420
		$request = $this->view->request()->withBody( $this->view->response()->createStreamFromString( $body ) );
421
422
423
		$response = $this->object->post( $request, $this->view->response() );
424
		$result = json_decode( (string) $response->getBody(), true );
425
426
		$this->assertEquals( 201, $response->getStatusCode() );
427
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
428
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
429
430
		\Aimeos\MShop::create( $this->context, 'review' )->delete( $result['data'][0]['id'] );
431
432
		$this->assertNotNull( $result['data'][0]['attributes']['review.refid'] );
433
		$this->assertEquals( 'product', $result['data'][0]['attributes']['review.domain'] );
434
		$this->assertEquals( 'test comment', $result['data'][0]['attributes']['review.comment'] );
435
436
		$this->assertEquals( 1, $result['meta']['total'] );
437
		$this->assertArrayNotHasKey( 'errors', $result );
438
	}
439
440
441
	public function testPostControllerException()
442
	{
443
		$mock = $this->object( 'getBody', $this->throwException( new \Aimeos\Controller\Frontend\Review\Exception() ) );
444
		$response = $this->object->post( $mock, $this->view->response() );
445
		$result = json_decode( (string) $response->getBody(), true );
446
447
		$this->assertEquals( 403, $response->getStatusCode() );
448
		$this->assertArrayHasKey( 'errors', $result );
449
	}
450
451
452
	public function testPostMShopException()
453
	{
454
		$mock = $this->object( 'getBody', $this->throwException( new \Aimeos\MShop\Exception() ) );
455
		$response = $this->object->post( $mock, $this->view->response() );
456
		$result = json_decode( (string) $response->getBody(), true );
457
458
		$this->assertEquals( 404, $response->getStatusCode() );
459
		$this->assertArrayHasKey( 'errors', $result );
460
	}
461
462
463
	public function testPostException()
464
	{
465
		$mock = $this->object( 'getBody', $this->throwException( new \Exception() ) );
466
		$response = $this->object->post( $mock, $this->view->response() );
467
		$result = json_decode( (string) $response->getBody(), true );
468
469
		$this->assertEquals( 500, $response->getStatusCode() );
470
		$this->assertArrayHasKey( 'errors', $result );
471
	}
472
473
474
	public function testOptions()
475
	{
476
		$response = $this->object->options( $this->view->request(), $this->view->response() );
477
		$result = json_decode( (string) $response->getBody(), true );
478
479
		$this->assertEquals( 200, $response->getStatusCode() );
480
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
481
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
482
483
		$this->assertEquals( null, $result['meta']['prefix'] );
484
		$this->assertEquals( 5, count( $result['meta']['attributes'] ) );
485
		$this->assertArrayNotHasKey( 'filter', $result['meta'] );
486
		$this->assertArrayNotHasKey( 'sort', $result['meta'] );
487
		$this->assertArrayNotHasKey( 'errors', $result );
488
	}
489
490
491
	/**
492
	 * Returns a test object with a mocked review manager
493
	 *
494
	 * @param string $method Review manager method name to mock
495
	 * @param mixed $result Return value of the mocked method
496
	 */
497
	protected function object( $method, $result )
498
	{
499
		$object = $this->createMock( \Psr\Http\Message\ServerRequestInterface::class );
500
		$object->expects( $this->once() )->method( $method )->will( $result );
501
502
		return $object;
503
	}
504
505
506
	protected function getReviewItem()
507
	{
508
		$manager = \Aimeos\MShop::create( $this->context, 'review' );
509
510
		$search = $manager->filter()->slice( 0, 1 );
511
		$search->setConditions( $search->and( [
512
			$search->compare( '==', 'review.domain', 'product' ),
513
			$search->compare( '>', 'review.status', 0 )
514
		] ) );
515
516
		return $manager->search( $search )->first( new \RuntimeException( 'No review item found' ) );
517
	}
518
}
519