1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
<?php
namespace Jasny\Router;
use Jasny\Router\Route;
use Jasny\Router\Runner;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamInterface;
use Jasny\Router\TestHelpers;
/**
* @covers Jasny\Router\Runner\Controller
*/
class ControllerTest extends \PHPUnit_Framework_TestCase
{
use TestHelpers;
public function testInvoke()
{
$request = $this->createMock(ServerRequestInterface::class);
$response = $this->createMock(ResponseInterface::class);
$finalResponse = $this->createMock(ResponseInterface::class);
$controller = $this->createCallbackMock($this->once(), [$request, $response], $finalResponse);
$class = get_class($controller);
$route = $this->createMock(Route::class);
$route->controller = 'foo';
$request->expects($this->once())->method('getAttribute')->with('route')->willReturn($route);
$runner = $this->getMockBuilder(Runner\Controller::class)->setMethods(['instantiate', 'getClass'])->getMock();
$runner->expects($this->once())->method('getClass')->with('foo')->willReturn($class);
$runner->expects($this->once())->method('instantiate')->with($class)->willReturn($controller);
$result = $runner($request, $response);
$this->assertSame($finalResponse, $result);
}
public function invalidProvider()
{
$runnerNotExists = $this->createPartialMock(Runner\Controller::class, ['instantiate']);
$runnerNotExists->expects($this->never())->method('instantiate');
$runnerNotCallable = $this->createPartialMock(Runner\Controller::class, ['instantiate', 'getClass']);
$runnerNotCallable->expects($this->once())->method('getClass')->with('foo')->willReturn('stdClass');
$runnerNotCallable->expects($this->never())->method('instantiate');
return [
[
$runnerNotExists,
'foo-bar-zoo',
"Can't route to controller 'FooBarZooController': class not exists"
],
[
$runnerNotExists,
['foo', 'bar', 'zoo'],
"Can't route to controller 'Foo\Bar\ZooController': class not exists"
],
[
$runnerNotCallable,
'foo',
"Can't route to controller 'stdClass': class does not have '__invoke' method"
]
];
}
/**
* @dataProvider invalidProvider
*
* @param Runner $runner
* @param string|array $controller
* @param string $message
*/
public function testInvokeInvalid(Runner $runner, $controller, $message)
{
$request = $this->createMock(ServerRequestInterface::class);
$request->method('getProtocolVersion')->willReturn('1.1');
$body = $this->createMock(StreamInterface::class);
$body->expects($this->once())->method('write')->with('Not found');
$notFound = $this->createMock(ResponseInterface::class);
$notFound->expects($this->once())->method('getBody')->willReturn($body);
$response = $this->createMock(ResponseInterface::class);
$response->expects($this->once())->method('withProtocolVersion')->with('1.1')->willReturnSelf();
$response->expects($this->once())->method('withStatus')->with(404)->willReturnSelf();
$response->expects($this->once())->method('withHeader')->with('Content-Type', 'text/plain')
->willReturn($notFound);
$route = $this->createMock(Route::class);
$route->controller = $controller;
$request->expects($this->once())->method('getAttribute')->with('route')->willReturn($route);
$result = @$runner($request, $response);
$this->assertSame($notFound, $result);
$this->assertLastError(E_USER_NOTICE, $message);
}
}
|