3 declare(strict_types
=1);
5 namespace Shaarli\Front\Controller
;
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
;
18 class LoginControllerTest
extends TestCase
20 /** @var ShaarliContainer */
23 /** @var LoginController */
24 protected $controller;
26 public function setUp(): void
28 $this->container
= $this->createMock(ShaarliContainer
::class);
29 $this->controller
= new LoginController($this->container
);
32 public function testValidControllerInvoke(): void
34 $this->createValidContainerMockSet();
36 $request = $this->createMock(Request
::class);
37 $request->expects(static::once())->method('getServerParam')->willReturn('> referer');
38 $response = new Response();
40 $assignedVariables = [];
41 $this->container
->pageBuilder
43 ->willReturnCallback(function ($key, $value) use (&$assignedVariables) {
44 $assignedVariables[$key] = $value;
50 $result = $this->controller
->index($request, $response);
52 static::assertInstanceOf(Response
::class, $result);
53 static::assertSame(200, $result->getStatusCode());
54 static::assertSame('loginform', (string) $result->getBody());
56 static::assertSame('> referer', $assignedVariables['returnurl']);
57 static::assertSame(true, $assignedVariables['remember_user_default']);
58 static::assertSame('Login - Shaarli', $assignedVariables['pagetitle']);
61 public function testValidControllerInvokeWithUserName(): void
63 $this->createValidContainerMockSet();
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();
70 $assignedVariables = [];
71 $this->container
->pageBuilder
73 ->willReturnCallback(function ($key, $value) use (&$assignedVariables) {
74 $assignedVariables[$key] = $value;
80 $result = $this->controller
->index($request, $response);
82 static::assertInstanceOf(Response
::class, $result);
83 static::assertSame(200, $result->getStatusCode());
84 static::assertSame('loginform', (string) $result->getBody());
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']);
92 public function testLoginControllerWhileLoggedIn(): void
94 $request = $this->createMock(Request
::class);
95 $response = new Response();
97 $loginManager = $this->createMock(LoginManager
::class);
98 $loginManager->expects(static::once())->method('isLoggedIn')->willReturn(true);
99 $this->container
->loginManager
= $loginManager;
101 $result = $this->controller
->index($request, $response);
103 static::assertInstanceOf(Response
::class, $result);
104 static::assertSame(302, $result->getStatusCode());
105 static::assertSame(['./'], $result->getHeader('Location'));
108 public function testLoginControllerOpenShaarli(): void
110 $this->createValidContainerMockSet();
112 $request = $this->createMock(Request
::class);
113 $response = new Response();
115 $conf = $this->createMock(ConfigManager
::class);
116 $conf->method('get')->willReturnCallback(function (string $parameter, $default) {
117 if ($parameter === 'security.open_shaarli') {
122 $this->container
->conf
= $conf;
124 $result = $this->controller
->index($request, $response);
126 static::assertInstanceOf(Response
::class, $result);
127 static::assertSame(302, $result->getStatusCode());
128 static::assertSame(['./'], $result->getHeader('Location'));
131 public function testLoginControllerWhileBanned(): void
133 $this->createValidContainerMockSet();
135 $request = $this->createMock(Request
::class);
136 $response = new Response();
138 $loginManager = $this->createMock(LoginManager
::class);
139 $loginManager->method('isLoggedIn')->willReturn(false);
140 $loginManager->method('canLogin')->willReturn(false);
141 $this->container
->loginManager
= $loginManager;
143 $this->expectException(LoginBannedException
::class);
145 $this->controller
->index($request, $response);
148 protected function createValidContainerMockSet(): void
151 $loginManager = $this->createMock(LoginManager
::class);
152 $loginManager->method('isLoggedIn')->willReturn(false);
153 $loginManager->method('canLogin')->willReturn(true);
154 $this->container
->loginManager
= $loginManager;
157 $conf = $this->createMock(ConfigManager
::class);
158 $conf->method('get')->willReturnCallback(function (string $parameter, $default) {
161 $this->container
->conf
= $conf;
164 $pageBuilder = $this->createMock(PageBuilder
::class);
167 ->willReturnCallback(function (string $template): string {
171 $this->container
->pageBuilder
= $pageBuilder;
173 $pluginManager = $this->createMock(PluginManager
::class);
174 $this->container
->pluginManager
= $pluginManager;
175 $bookmarkService = $this->createMock(BookmarkServiceInterface
::class);
176 $this->container
->bookmarkService
= $bookmarkService;