Completed
Push — master ( b0c8aa...f38e69 )
by Aimeos
04:47
created

StandardTest::getReviewItem()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

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