]>
Commit | Line | Data |
---|---|---|
1 | <?php | |
2 | ||
3 | declare(strict_types=1); | |
4 | ||
5 | namespace Shaarli\Front\Controller; | |
6 | ||
7 | use PHPUnit\Framework\TestCase; | |
8 | use Shaarli\Bookmark\BookmarkServiceInterface; | |
9 | use Shaarli\Config\ConfigManager; | |
10 | use Shaarli\Container\ShaarliContainer; | |
11 | use Shaarli\Front\Exception\LoginBannedException; | |
12 | use Shaarli\Plugin\PluginManager; | |
13 | use Shaarli\Render\PageBuilder; | |
14 | use Shaarli\Security\LoginManager; | |
15 | use Slim\Http\Request; | |
16 | use Slim\Http\Response; | |
17 | ||
18 | class LoginControllerTest extends TestCase | |
19 | { | |
20 | /** @var ShaarliContainer */ | |
21 | protected $container; | |
22 | ||
23 | /** @var LoginController */ | |
24 | protected $controller; | |
25 | ||
26 | public function setUp(): void | |
27 | { | |
28 | $this->container = $this->createMock(ShaarliContainer::class); | |
29 | $this->controller = new LoginController($this->container); | |
30 | } | |
31 | ||
32 | public function testValidControllerInvoke(): void | |
33 | { | |
34 | $this->createValidContainerMockSet(); | |
35 | ||
36 | $request = $this->createMock(Request::class); | |
37 | $request->expects(static::once())->method('getServerParam')->willReturn('> referer'); | |
38 | $response = new Response(); | |
39 | ||
40 | $assignedVariables = []; | |
41 | $this->container->pageBuilder | |
42 | ->method('assign') | |
43 | ->willReturnCallback(function ($key, $value) use (&$assignedVariables) { | |
44 | $assignedVariables[$key] = $value; | |
45 | ||
46 | return $this; | |
47 | }) | |
48 | ; | |
49 | ||
50 | $result = $this->controller->index($request, $response); | |
51 | ||
52 | static::assertInstanceOf(Response::class, $result); | |
53 | static::assertSame(200, $result->getStatusCode()); | |
54 | static::assertSame('loginform', (string) $result->getBody()); | |
55 | ||
56 | static::assertSame('> referer', $assignedVariables['returnurl']); | |
57 | static::assertSame(true, $assignedVariables['remember_user_default']); | |
58 | static::assertSame('Login - Shaarli', $assignedVariables['pagetitle']); | |
59 | } | |
60 | ||
61 | public function testValidControllerInvokeWithUserName(): void | |
62 | { | |
63 | $this->createValidContainerMockSet(); | |
64 | ||
65 | $request = $this->createMock(Request::class); | |
66 | $request->expects(static::once())->method('getServerParam')->willReturn('> referer'); | |
67 | $request->expects(static::exactly(2))->method('getParam')->willReturn('myUser>'); | |
68 | $response = new Response(); | |
69 | ||
70 | $assignedVariables = []; | |
71 | $this->container->pageBuilder | |
72 | ->method('assign') | |
73 | ->willReturnCallback(function ($key, $value) use (&$assignedVariables) { | |
74 | $assignedVariables[$key] = $value; | |
75 | ||
76 | return $this; | |
77 | }) | |
78 | ; | |
79 | ||
80 | $result = $this->controller->index($request, $response); | |
81 | ||
82 | static::assertInstanceOf(Response::class, $result); | |
83 | static::assertSame(200, $result->getStatusCode()); | |
84 | static::assertSame('loginform', (string) $result->getBody()); | |
85 | ||
86 | static::assertSame('myUser>', $assignedVariables['username']); | |
87 | static::assertSame('> referer', $assignedVariables['returnurl']); | |
88 | static::assertSame(true, $assignedVariables['remember_user_default']); | |
89 | static::assertSame('Login - Shaarli', $assignedVariables['pagetitle']); | |
90 | } | |
91 | ||
92 | public function testLoginControllerWhileLoggedIn(): void | |
93 | { | |
94 | $request = $this->createMock(Request::class); | |
95 | $response = new Response(); | |
96 | ||
97 | $loginManager = $this->createMock(LoginManager::class); | |
98 | $loginManager->expects(static::once())->method('isLoggedIn')->willReturn(true); | |
99 | $this->container->loginManager = $loginManager; | |
100 | ||
101 | $result = $this->controller->index($request, $response); | |
102 | ||
103 | static::assertInstanceOf(Response::class, $result); | |
104 | static::assertSame(302, $result->getStatusCode()); | |
105 | static::assertSame(['./'], $result->getHeader('Location')); | |
106 | } | |
107 | ||
108 | public function testLoginControllerOpenShaarli(): void | |
109 | { | |
110 | $this->createValidContainerMockSet(); | |
111 | ||
112 | $request = $this->createMock(Request::class); | |
113 | $response = new Response(); | |
114 | ||
115 | $conf = $this->createMock(ConfigManager::class); | |
116 | $conf->method('get')->willReturnCallback(function (string $parameter, $default) { | |
117 | if ($parameter === 'security.open_shaarli') { | |
118 | return true; | |
119 | } | |
120 | return $default; | |
121 | }); | |
122 | $this->container->conf = $conf; | |
123 | ||
124 | $result = $this->controller->index($request, $response); | |
125 | ||
126 | static::assertInstanceOf(Response::class, $result); | |
127 | static::assertSame(302, $result->getStatusCode()); | |
128 | static::assertSame(['./'], $result->getHeader('Location')); | |
129 | } | |
130 | ||
131 | public function testLoginControllerWhileBanned(): void | |
132 | { | |
133 | $this->createValidContainerMockSet(); | |
134 | ||
135 | $request = $this->createMock(Request::class); | |
136 | $response = new Response(); | |
137 | ||
138 | $loginManager = $this->createMock(LoginManager::class); | |
139 | $loginManager->method('isLoggedIn')->willReturn(false); | |
140 | $loginManager->method('canLogin')->willReturn(false); | |
141 | $this->container->loginManager = $loginManager; | |
142 | ||
143 | $this->expectException(LoginBannedException::class); | |
144 | ||
145 | $this->controller->index($request, $response); | |
146 | } | |
147 | ||
148 | protected function createValidContainerMockSet(): void | |
149 | { | |
150 | // User logged out | |
151 | $loginManager = $this->createMock(LoginManager::class); | |
152 | $loginManager->method('isLoggedIn')->willReturn(false); | |
153 | $loginManager->method('canLogin')->willReturn(true); | |
154 | $this->container->loginManager = $loginManager; | |
155 | ||
156 | // Config | |
157 | $conf = $this->createMock(ConfigManager::class); | |
158 | $conf->method('get')->willReturnCallback(function (string $parameter, $default) { | |
159 | return $default; | |
160 | }); | |
161 | $this->container->conf = $conf; | |
162 | ||
163 | // PageBuilder | |
164 | $pageBuilder = $this->createMock(PageBuilder::class); | |
165 | $pageBuilder | |
166 | ->method('render') | |
167 | ->willReturnCallback(function (string $template): string { | |
168 | return $template; | |
169 | }) | |
170 | ; | |
171 | $this->container->pageBuilder = $pageBuilder; | |
172 | ||
173 | $pluginManager = $this->createMock(PluginManager::class); | |
174 | $this->container->pluginManager = $pluginManager; | |
175 | $bookmarkService = $this->createMock(BookmarkServiceInterface::class); | |
176 | $this->container->bookmarkService = $bookmarkService; | |
177 | } | |
178 | } |