xref: /webtrees/tests/app/Http/RequestHandlers/ModuleActionTest.php (revision d11be7027e34e3121be11cc025421873364403f9)
1<?php
2
3/**
4 * webtrees: online genealogy
5 * Copyright (C) 2023 webtrees development team
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17
18declare(strict_types=1);
19
20namespace Fisharebest\Webtrees\Http\RequestHandlers;
21
22use Fig\Http\Message\StatusCodeInterface;
23use Fisharebest\Webtrees\GuestUser;
24use Fisharebest\Webtrees\Http\Exceptions\HttpAccessDeniedException;
25use Fisharebest\Webtrees\Http\Exceptions\HttpNotFoundException;
26use Fisharebest\Webtrees\Module\AbstractModule;
27use Fisharebest\Webtrees\Module\ModuleInterface;
28use Fisharebest\Webtrees\Services\ModuleService;
29use Fisharebest\Webtrees\TestCase;
30use Psr\Http\Message\ResponseInterface;
31
32use function response;
33
34/**
35 * @covers \Fisharebest\Webtrees\Http\RequestHandlers\ModuleAction
36 */
37class ModuleActionTest extends TestCase
38{
39    /**
40     * @return void
41     */
42    public function testModuleAction(): void
43    {
44        $module_service = $this->createMock(ModuleService::class);
45        $module_service
46            ->expects(self::once())
47            ->method('findByName')
48            ->with('test')
49            ->willReturn($this->fooModule());
50
51        $user     = new GuestUser();
52        $request  = self::createRequest()
53            ->withAttribute('module', 'test')
54            ->withAttribute('action', 'Test')
55            ->withAttribute('user', $user);
56        $handler  = new ModuleAction($module_service);
57        $response = $handler->handle($request);
58
59        self::assertSame(StatusCodeInterface::STATUS_OK, $response->getStatusCode());
60        self::assertSame('It works!', (string) $response->getBody());
61    }
62
63    /**
64     * @return void
65     */
66    public function testNonExistingAction(): void
67    {
68        $this->expectException(HttpNotFoundException::class);
69        $this->expectExceptionMessage('Method getTestingAction() not found in test');
70
71        $module_service = $this->createMock(ModuleService::class);
72        $module_service
73            ->expects(self::once())
74            ->method('findByName')
75            ->with('test')
76            ->willReturn($this->fooModule());
77
78        $user    = new GuestUser();
79        $request = self::createRequest()
80            ->withAttribute('module', 'test')
81            ->withAttribute('action', 'Testing')
82            ->withAttribute('user', $user);
83        $handler = new ModuleAction($module_service);
84        $handler->handle($request);
85    }
86
87    /**
88     * @return void
89     */
90    public function testNonExistingModule(): void
91    {
92        $this->expectException(HttpNotFoundException::class);
93        $this->expectExceptionMessage('Module test does not exist');
94
95        $module_service = $this->createMock(ModuleService::class);
96        $module_service
97            ->expects(self::once())
98            ->method('findByName')
99            ->with('test')
100            ->willReturn(null);
101
102        $user    = new GuestUser();
103        $request = self::createRequest()
104            ->withAttribute('module', 'test')
105            ->withAttribute('action', 'Test')
106            ->withAttribute('user', $user);
107        $handler = new ModuleAction($module_service);
108        $handler->handle($request);
109    }
110
111    /**
112     * @return void
113     */
114    public function testAdminAction(): void
115    {
116        $this->expectException(HttpAccessDeniedException::class);
117        $this->expectExceptionMessage('Admin only action');
118
119        $module_service = $this->createMock(ModuleService::class);
120        $module_service
121            ->expects(self::once())
122            ->method('findByName')
123            ->with('test')
124            ->willReturn($this->fooModule());
125
126        $user    = new GuestUser();
127        $request = self::createRequest()
128            ->withAttribute('module', 'test')
129            ->withAttribute('action', 'Admin')
130            ->withAttribute('user', $user);
131        $handler = new ModuleAction($module_service);
132        $handler->handle($request);
133    }
134
135    /**
136     * @return ModuleInterface
137     */
138    private function fooModule(): ModuleInterface
139    {
140        return new class () extends AbstractModule {
141            /**
142             * @return ResponseInterface
143             */
144            public function getTestAction(): ResponseInterface
145            {
146                return response('It works!');
147            }
148        };
149    }
150}
151