]> git.immae.eu Git - github/shaarli/Shaarli.git/blame - tests/front/controller/LoginControllerTest.php
Render login page through Slim controller
[github/shaarli/Shaarli.git] / tests / front / controller / LoginControllerTest.php
CommitLineData
6c50a6cc
A
1<?php
2
3declare(strict_types=1);
4
5namespace Shaarli\Front\Controller;
6
7use PHPUnit\Framework\TestCase;
8use Shaarli\Config\ConfigManager;
9use Shaarli\Container\ShaarliContainer;
10use Shaarli\Front\Exception\LoginBannedException;
11use Shaarli\Render\PageBuilder;
12use Shaarli\Security\LoginManager;
13use Slim\Http\Request;
14use Slim\Http\Response;
15
16class LoginControllerTest extends TestCase
17{
18 /** @var ShaarliContainer */
19 protected $container;
20
21 /** @var LoginController */
22 protected $controller;
23
24 public function setUp(): void
25 {
26 $this->container = $this->createMock(ShaarliContainer::class);
27 $this->controller = new LoginController($this->container);
28 }
29
30 public function testValidControllerInvoke(): void
31 {
32 $this->createValidContainerMockSet();
33
34 $request = $this->createMock(Request::class);
35 $request->expects(static::once())->method('getServerParam')->willReturn('> referer');
36 $response = new Response();
37
38 $assignedVariables = [];
39 $this->container->pageBuilder
40 ->expects(static::exactly(3))
41 ->method('assign')
42 ->willReturnCallback(function ($key, $value) use (&$assignedVariables) {
43 $assignedVariables[$key] = $value;
44
45 return $this;
46 })
47 ;
48
49 $result = $this->controller->index($request, $response);
50
51 static::assertInstanceOf(Response::class, $result);
52 static::assertSame(200, $result->getStatusCode());
53 static::assertSame('loginform', (string) $result->getBody());
54
55 static::assertSame('&gt; referer', $assignedVariables['returnurl']);
56 static::assertSame(true, $assignedVariables['remember_user_default']);
57 static::assertSame('Login - Shaarli', $assignedVariables['pagetitle']);
58 }
59
60 public function testValidControllerInvokeWithUserName(): void
61 {
62 $this->createValidContainerMockSet();
63
64 $request = $this->createMock(Request::class);
65 $request->expects(static::once())->method('getServerParam')->willReturn('> referer');
66 $request->expects(static::exactly(2))->method('getParam')->willReturn('myUser>');
67 $response = new Response();
68
69 $assignedVariables = [];
70 $this->container->pageBuilder
71 ->expects(static::exactly(4))
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&gt;', $assignedVariables['username']);
87 static::assertSame('&gt; 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}