Completed
Push — master ( 3dcbbf...dadcea )
by Aimeos
03:18
created

StandardTest::testPatchDenied()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 13
c 1
b 0
f 0
dl 0
loc 24
rs 9.8333
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 testGetByIdDenied()
190
	{
191
		$manager = \Aimeos\MShop::create( $this->context, 'review' );
192
		$item = $manager->search( $manager->filter() )->first();
193
194
195
		$params = array(
196
			'id' => -1,
197
			'related' => 'review',
198
			'relatedid' => $item->getId(),
199
			'fields' => ['review' => 'review.id,review.rating'],
200
		);
201
		$helper = new \Aimeos\MW\View\Helper\Param\Standard( $this->view, $params );
202
		$this->view->addHelper( 'param', $helper );
203
204
205
		$response = $this->object->get( $this->view->request(), $this->view->response() );
206
		$result = json_decode( (string) $response->getBody(), true );
207
208
		$this->assertEquals( 404, $response->getStatusCode() );
209
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
210
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
211
212
		$this->assertArrayHasKey( 'errors', $result );
213
	}
214
215
216
	public function testGetControllerException()
217
	{
218
		$manager = $this->getMockBuilder( \Aimeos\MShop\Review\Manager\Standard::class )
219
			->setConstructorArgs( [$this->context] )
220
			->setMethods( ['search'] )
221
			->getMock();
222
223
		$manager->expects( $this->once() )->method( 'search' )
224
			->will( $this->throwException( new \Aimeos\Controller\Frontend\Review\Exception() ) );
225
226
		\Aimeos\MShop::inject( 'review', $manager );
227
228
		$response = $this->object->get( $this->view->request(), $this->view->response() );
229
		$result = json_decode( (string) $response->getBody(), true );
230
231
		$this->assertEquals( 403, $response->getStatusCode() );
232
		$this->assertArrayHasKey( 'errors', $result );
233
	}
234
235
236
	public function testGetMShopException()
237
	{
238
		$manager = $this->getMockBuilder( \Aimeos\MShop\Review\Manager\Standard::class )
239
			->setConstructorArgs( [$this->context] )
240
			->setMethods( ['search'] )
241
			->getMock();
242
243
		$manager->expects( $this->once() )->method( 'search' )
244
			->will( $this->throwException( new \Aimeos\MShop\Exception() ) );
245
246
		\Aimeos\MShop::inject( 'review', $manager );
247
248
		$response = $this->object->get( $this->view->request(), $this->view->response() );
249
		$result = json_decode( (string) $response->getBody(), true );
250
251
		$this->assertEquals( 404, $response->getStatusCode() );
252
		$this->assertArrayHasKey( 'errors', $result );
253
	}
254
255
256
	public function testGetException()
257
	{
258
		$manager = $this->getMockBuilder( \Aimeos\MShop\Review\Manager\Standard::class )
259
			->setConstructorArgs( [$this->context] )
260
			->setMethods( ['search'] )
261
			->getMock();
262
263
		$manager->expects( $this->once() )->method( 'search' )
264
			->will( $this->throwException( new \Exception() ) );
265
266
		\Aimeos\MShop::inject( 'review', $manager );
267
268
		$response = $this->object->get( $this->view->request(), $this->view->response() );
269
		$result = json_decode( (string) $response->getBody(), true );
270
271
		$this->assertEquals( 500, $response->getStatusCode() );
272
		$this->assertArrayHasKey( 'errors', $result );
273
	}
274
275
276
	public function testPatch()
277
	{
278
		$manager = \Aimeos\MShop::create( $this->context, 'review' );
279
		$item = $manager->create( [
280
			'review.customerid' => '-1',
281
			'review.domain' => 'product',
282
			'review.refid' => '-1',
283
			'review.response' => 'none'
284
		] );
285
		$item = $manager->save( $item->setId( null ) );
286
287
		$this->context->setUserId( -1 );
288
289
290
		$params = ['id' => -1, 'related' => 'review', 'relatedid' => $item->getId()];
291
		$helper = new \Aimeos\MW\View\Helper\Param\Standard( $this->view, $params );
292
		$this->view->addHelper( 'param', $helper );
293
294
		$body = '{"data": {"type": "review", "id": "-1", "attributes": {
295
			"review.orderproductid": "123",
296
			"review.customerid": -2,
297
			"review.domain": "test",
298
			"review.refid": "456",
299
			"review.name": "test user",
300
			"review.comment": "test comment",
301
			"review.response": "not allowed",
302
			"review.rating": 10,
303
			"review.status": 0
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
		$manager->delete( $item );
312
313
314
		$this->assertEquals( 200, $response->getStatusCode() );
315
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
316
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
317
318
		$this->assertEquals( 'test', $result['data']['attributes']['review.domain'] );
319
		$this->assertEquals( '456', $result['data']['attributes']['review.refid'] );
320
		$this->assertEquals( 'test user', $result['data']['attributes']['review.name'] );
321
		$this->assertEquals( 'test comment', $result['data']['attributes']['review.comment'] );
322
		$this->assertEquals( 'none', $result['data']['attributes']['review.response'] );
323
		$this->assertEquals( '5', $result['data']['attributes']['review.rating'] );
324
		$this->assertEquals( '1', $result['data']['attributes']['review.status'] );
325
326
		$this->assertEquals( 1, $result['meta']['total'] );
327
		$this->assertArrayNotHasKey( 'errors', $result );
328
	}
329
330
331
	public function testPatchDenied()
332
	{
333
		$this->context->setUserId( -1 );
334
335
		$params = ['id' => -2, 'related' => 'review', 'relatedid' => -1];
336
		$helper = new \Aimeos\MW\View\Helper\Param\Standard( $this->view, $params );
337
		$this->view->addHelper( 'param', $helper );
338
339
		$body = '{"data": {"type": "review", "id": "-1", "attributes": {
340
			"review.domain": "test",
341
			"review.refid": "456"
342
		}}}';
343
		$request = $this->view->request()->withBody( $this->view->response()->createStreamFromString( $body ) );
344
345
346
		$response = $this->object->patch( $request, $this->view->response() );
347
		$result = json_decode( (string) $response->getBody(), true );
348
349
		$this->assertEquals( 404, $response->getStatusCode() );
350
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
351
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
352
353
		$this->assertEquals( 0, $result['meta']['total'] );
354
		$this->assertArrayHasKey( 'errors', $result );
355
	}
356
357
358
	public function testPatchControllerException()
359
	{
360
		$mock = $this->getObject( 'getBody', $this->throwException( new \Aimeos\Controller\Frontend\Review\Exception() ) );
361
		$response = $this->object->patch( $mock, $this->view->response() );
362
		$result = json_decode( (string) $response->getBody(), true );
363
364
		$this->assertEquals( 403, $response->getStatusCode() );
365
		$this->assertArrayHasKey( 'errors', $result );
366
	}
367
368
369
	public function testPatchMShopException()
370
	{
371
		$mock = $this->getObject( 'getBody', $this->throwException( new \Aimeos\MShop\Exception() ) );
372
		$response = $this->object->patch( $mock, $this->view->response() );
373
		$result = json_decode( (string) $response->getBody(), true );
374
375
		$this->assertEquals( 404, $response->getStatusCode() );
376
		$this->assertArrayHasKey( 'errors', $result );
377
	}
378
379
380
	public function testPatchException()
381
	{
382
		$mock = $this->getObject( 'getBody', $this->throwException( new \Exception() ) );
383
		$response = $this->object->patch( $mock, $this->view->response() );
384
		$result = json_decode( (string) $response->getBody(), true );
385
386
		$this->assertEquals( 500, $response->getStatusCode() );
387
		$this->assertArrayHasKey( 'errors', $result );
388
	}
389
390
391
	public function testPost()
392
	{
393
		$this->context->setUserId( -1 );
394
395
		$params = ['id' => -1, 'related' => 'review'];
396
		$helper = new \Aimeos\MW\View\Helper\Param\Standard( $this->view, $params );
397
		$this->view->addHelper( 'param', $helper );
398
399
		$body = '{"data": {"type": "review", "attributes": {
400
			"review.orderproductid": "123",
401
			"review.customerid": -2,
402
			"review.domain": "test",
403
			"review.refid": "456",
404
			"review.name": "test user",
405
			"review.comment": "test comment",
406
			"review.response": "not allowed",
407
			"review.rating": -1,
408
			"review.status": 0
409
		}}}';
410
		$request = $this->view->request()->withBody( $this->view->response()->createStreamFromString( $body ) );
411
412
413
		$response = $this->object->post( $request, $this->view->response() );
414
		$result = json_decode( (string) $response->getBody(), true );
415
416
417
		$this->assertEquals( 201, $response->getStatusCode() );
418
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
419
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
420
421
		\Aimeos\MShop::create( $this->context, 'review' )->delete( $result['data'][0]['id'] );
422
423
		$this->assertEquals( 'test', $result['data'][0]['attributes']['review.domain'] );
424
		$this->assertEquals( '456', $result['data'][0]['attributes']['review.refid'] );
425
		$this->assertEquals( 'test user', $result['data'][0]['attributes']['review.name'] );
426
		$this->assertEquals( 'test comment', $result['data'][0]['attributes']['review.comment'] );
427
		$this->assertEquals( '', $result['data'][0]['attributes']['review.response'] );
428
		$this->assertEquals( '0', $result['data'][0]['attributes']['review.rating'] );
429
430
		$this->assertEquals( 1, $result['meta']['total'] );
431
		$this->assertArrayNotHasKey( 'errors', $result );
432
	}
433
434
435
	public function testPostMultiple()
436
	{
437
		$this->context->setUserId( -1 );
438
439
		$params = ['id' => -1, 'related' => 'review'];
440
		$helper = new \Aimeos\MW\View\Helper\Param\Standard( $this->view, $params );
441
		$this->view->addHelper( 'param', $helper );
442
443
		$body = '{"data": [{
444
			"type": "review", "attributes": {
445
				"review.domain": "test",
446
				"review.refid": "456",
447
				"review.comment": "test comment"
448
			}
449
		}, {
450
			"type": "review", "attributes": {
451
				"review.domain": "test",
452
				"review.refid": "789",
453
				"review.comment": "more comment"
454
			}
455
		}]}';
456
		$request = $this->view->request()->withBody( $this->view->response()->createStreamFromString( $body ) );
457
458
459
		$response = $this->object->post( $request, $this->view->response() );
460
		$result = json_decode( (string) $response->getBody(), true );
461
462
463
		$this->assertEquals( 201, $response->getStatusCode() );
464
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
465
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
466
467
		\Aimeos\MShop::create( $this->context, 'review' )
468
			->delete( [$result['data'][0]['id'], $result['data'][1]['id']] );
469
470
		$this->assertEquals( 'test', $result['data'][0]['attributes']['review.domain'] );
471
		$this->assertEquals( '456', $result['data'][0]['attributes']['review.refid'] );
472
		$this->assertEquals( 'test comment', $result['data'][0]['attributes']['review.comment'] );
473
		$this->assertEquals( 'test', $result['data'][1]['attributes']['review.domain'] );
474
		$this->assertEquals( '789', $result['data'][1]['attributes']['review.refid'] );
475
		$this->assertEquals( 'more comment', $result['data'][1]['attributes']['review.comment'] );
476
477
		$this->assertEquals( 2, $result['meta']['total'] );
478
		$this->assertArrayNotHasKey( 'errors', $result );
479
	}
480
481
482
	public function testPostControllerException()
483
	{
484
		$mock = $this->getObject( 'getBody', $this->throwException( new \Aimeos\Controller\Frontend\Review\Exception() ) );
485
		$response = $this->object->post( $mock, $this->view->response() );
486
		$result = json_decode( (string) $response->getBody(), true );
487
488
		$this->assertEquals( 403, $response->getStatusCode() );
489
		$this->assertArrayHasKey( 'errors', $result );
490
	}
491
492
493
	public function testPostMShopException()
494
	{
495
		$mock = $this->getObject( 'getBody', $this->throwException( new \Aimeos\MShop\Exception() ) );
496
		$response = $this->object->post( $mock, $this->view->response() );
497
		$result = json_decode( (string) $response->getBody(), true );
498
499
		$this->assertEquals( 404, $response->getStatusCode() );
500
		$this->assertArrayHasKey( 'errors', $result );
501
	}
502
503
504
	public function testPostException()
505
	{
506
		$mock = $this->getObject( 'getBody', $this->throwException( new \Exception() ) );
507
		$response = $this->object->post( $mock, $this->view->response() );
508
		$result = json_decode( (string) $response->getBody(), true );
509
510
		$this->assertEquals( 500, $response->getStatusCode() );
511
		$this->assertArrayHasKey( 'errors', $result );
512
	}
513
514
515
	public function testOptions()
516
	{
517
		$response = $this->object->options( $this->view->request(), $this->view->response() );
518
		$result = json_decode( (string) $response->getBody(), true );
519
520
		$this->assertEquals( 200, $response->getStatusCode() );
521
		$this->assertEquals( 1, count( $response->getHeader( 'Allow' ) ) );
522
		$this->assertEquals( 1, count( $response->getHeader( 'Content-Type' ) ) );
523
524
		$this->assertEquals( null, $result['meta']['prefix'] );
525
		$this->assertEquals( 5, count( $result['meta']['attributes'] ) );
526
		$this->assertArrayNotHasKey( 'filter', $result['meta'] );
527
		$this->assertArrayNotHasKey( 'sort', $result['meta'] );
528
		$this->assertArrayNotHasKey( 'errors', $result );
529
	}
530
531
532
	/**
533
	 * Returns a test object with a mocked review manager
534
	 *
535
	 * @param string $method Review manager method name to mock
536
	 * @param mixed $result Return value of the mocked method
537
	 */
538
	protected function getObject( $method, $result )
539
	{
540
		$object = $this->getMockForAbstractClass( \Psr\Http\Message\ServerRequestInterface::class );
541
		$object->expects( $this->once() )->method( $method )->will( $result );
542
543
		return $object;
544
	}
545
}
546