diff options
| author | Greg Roach <fisharebest@webtrees.net> | 2019-04-11 20:11:22 +0100 |
|---|---|---|
| committer | Greg Roach <fisharebest@webtrees.net> | 2019-04-11 21:13:20 +0100 |
| commit | a0801ffbb59d5bed474fc7a91bf1863ebca47791 (patch) | |
| tree | 473d2a66ec5282decd250775dc7bf76b701fbf64 /tests | |
| parent | 1bd3adbd9919436f09516afb1909be3be9efef66 (diff) | |
| download | webtrees-a0801ffbb59d5bed474fc7a91bf1863ebca47791.tar.gz webtrees-a0801ffbb59d5bed474fc7a91bf1863ebca47791.tar.bz2 webtrees-a0801ffbb59d5bed474fc7a91bf1863ebca47791.zip | |
Use PSR-15 request handlers as alternative to controllers/actions
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/app/Http/Controllers/ModuleControllerTest.php | 108 | ||||
| -rw-r--r-- | tests/app/Http/RequestHandlers/DeleteUserTest.php | 76 | ||||
| -rw-r--r-- | tests/app/Http/RequestHandlers/MasqueradeAsUserTest.php | 81 | ||||
| -rw-r--r-- | tests/app/Http/RequestHandlers/ModuleActionTest.php | 93 | ||||
| -rw-r--r-- | tests/app/Http/RequestHandlers/SelectLanguageTest.php | 57 | ||||
| -rw-r--r-- | tests/app/Http/RequestHandlers/SelectThemeTest.php | 59 |
6 files changed, 366 insertions, 108 deletions
diff --git a/tests/app/Http/Controllers/ModuleControllerTest.php b/tests/app/Http/Controllers/ModuleControllerTest.php deleted file mode 100644 index a8b24b7aed..0000000000 --- a/tests/app/Http/Controllers/ModuleControllerTest.php +++ /dev/null @@ -1,108 +0,0 @@ -<?php -/** - * webtrees: online genealogy - * Copyright (C) 2019 webtrees development team - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -declare(strict_types=1); - -namespace Fisharebest\Webtrees\Http\Controllers; - -use Fisharebest\Webtrees\Auth; -use Fisharebest\Webtrees\Module\SiteMapModule; -use Fisharebest\Webtrees\Services\ModuleService; -use Fisharebest\Webtrees\Http\Request; - -/** - * Test the module controller - * - * @covers \Fisharebest\Webtrees\Http\Controllers\AbstractBaseController - * @covers \Fisharebest\Webtrees\Http\Controllers\ModuleController - */ -class ModuleControllerTest extends \Fisharebest\Webtrees\TestCase -{ - protected static $uses_database = true; - - /** - * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException - * @return void - */ - public function testMissingModule(): void - { - $request = new Request(['route' => 'module']); - $controller = new ModuleController(new ModuleService()); - $controller->action($request, Auth::user()); - } - - /** - * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException - * @return void - */ - public function testInvalidModule(): void - { - $request = new Request(['route' => 'module', 'module' => 'no-such-module']); - $controller = new ModuleController(new ModuleService()); - $controller->action($request, Auth::user()); - } - - /** - * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException - * @return void - */ - public function testMissingAction(): void - { - $request = new Request(['route' => 'module', 'module' => 'sitemap']); - $controller = new ModuleController(new ModuleService()); - $controller->action($request, Auth::user()); - } - - /** - * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException - * @return void - */ - public function testInvalidAction(): void - { - $request = new Request(['route' => 'module', 'module' => 'sitemap', 'action' => 'no-such-action']); - $controller = new ModuleController(new ModuleService()); - $controller->action($request, Auth::user()); - } - - /** - * @expectedException \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException - * @return void - */ - public function testVisitorCannotUseAdminAction(): void - { - $request = new Request(['route' => 'module', 'module' => 'sitemap', 'action' => 'DoAdminStuff']); - $controller = new ModuleController(new ModuleService()); - $controller->action($request, Auth::user()); - } - - /** - * @return void - */ - public function testSucessfulAction(): void - { - // The sitemap module is disabled by defualt. - $module_service = $this->createMock(ModuleService::class); - $module_service - ->method('findByName') - ->with('sitemap') - ->willReturn(new SiteMapModule()); - - $request = new Request(['route' => 'module', 'module' => 'sitemap', 'action' => 'Index']); - $controller = new ModuleController($module_service); - $response = $controller->action($request, Auth::user()); - - $this->assertSame(self::STATUS_OK, $response->getStatusCode()); - } -} diff --git a/tests/app/Http/RequestHandlers/DeleteUserTest.php b/tests/app/Http/RequestHandlers/DeleteUserTest.php new file mode 100644 index 0000000000..5da843179e --- /dev/null +++ b/tests/app/Http/RequestHandlers/DeleteUserTest.php @@ -0,0 +1,76 @@ +<?php +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +use Fisharebest\Webtrees\Http\RequestHandlers\DeleteUser; +use Fisharebest\Webtrees\Services\UserService; +use Fisharebest\Webtrees\TestCase; + +/** + * @covers \Fisharebest\Webtrees\Http\RequestHandlers\DeleteUser + */ +class DeleteUserTest extends TestCase +{ + protected static $uses_database = true; + + /** + * @return void + */ + public function testDeleteUser(): void + { + $user_service = new UserService(); + $user = $user_service->create('user1', 'real1', 'email1', 'pass1'); + $handler = new DeleteUser($user_service); + $request = self::createRequest('POST', ['route' => 'delete-user'], ['user_id' => $user->id()]); + $response = $handler->handle($request); + + // UserService caches user records + app('cache.array')->forget(UserService::class . $user->id()); + + self::assertSame(self::STATUS_NO_CONTENT, $response->getStatusCode()); + self::assertNull($user_service->find($user->id())); + } + + /** + * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException + * @expectedExceptionMessage User ID 98765 not found + * @return void + */ + public function testDeleteNonExistingUser(): void + { + $user_service = new UserService(); + $user_service->create('user1', 'real1', 'email1', 'pass1'); + $handler = new DeleteUser($user_service); + $request = self::createRequest('POST', ['route' => 'delete-user'], ['user_id' => 98765]); + $handler->handle($request); + } + + /** + * @expectedException \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException + * @expectedExceptionMessage Cannot delete an administrator + * @return void + */ + public function testCannotDeleteAdministrator(): void + { + $user_service = new UserService(); + $user = $user_service->create('user1', 'real1', 'email1', 'pass1'); + $user->setPreference('canadmin', '1'); + $handler = new DeleteUser($user_service); + $request = self::createRequest('POST', ['route' => 'delete-user'], ['user_id' => $user->id()]); + $handler->handle($request); + } +} + diff --git a/tests/app/Http/RequestHandlers/MasqueradeAsUserTest.php b/tests/app/Http/RequestHandlers/MasqueradeAsUserTest.php new file mode 100644 index 0000000000..90d1043975 --- /dev/null +++ b/tests/app/Http/RequestHandlers/MasqueradeAsUserTest.php @@ -0,0 +1,81 @@ +<?php +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +use Fisharebest\Webtrees\Auth; +use Fisharebest\Webtrees\Http\RequestHandlers\MasqueradeAsUser; +use Fisharebest\Webtrees\Services\UserService; +use Fisharebest\Webtrees\Session; +use Fisharebest\Webtrees\TestCase; + +/** + * @covers \Fisharebest\Webtrees\Http\RequestHandlers\MasqueradeAsUser + */ +class MasqueradeAsUserTest extends TestCase +{ + protected static $uses_database = true; + + /** + * @return void + */ + public function testMasqueradeAsUser(): void + { + $user_service = new UserService(); + $user1 = $user_service->create('user1', 'real1', 'email1', 'pass1'); + $user2 = $user_service->create('user2', 'real2', 'email2', 'pass2'); + Auth::login($user1); + $handler = new MasqueradeAsUser($user1, $user_service); + $request = self::createRequest('POST', ['route' => 'masquerade'], ['user_id' => $user2->id()]); + $response = $handler->handle($request); + + self::assertSame(self::STATUS_NO_CONTENT, $response->getStatusCode()); + self::assertSame($user2->id(), Auth::id()); + self::assertSame('1', Session::get('masquerade')); + } + + /** + * @return void + */ + public function testMasqueradeAsSelf(): void + { + $user_service = new UserService(); + $user = $user_service->create('user', 'real', 'email', 'pass'); + Auth::login($user); + $handler = new MasqueradeAsUser($user, $user_service); + $request = self::createRequest('POST', ['route' => 'masquerade'], ['user_id' => $user->id()]); + $response = $handler->handle($request); + + self::assertSame(self::STATUS_NO_CONTENT, $response->getStatusCode()); + self::assertSame($user->id(), Auth::id()); + self::assertNull(Session::get('masquerade')); + } + + /** + * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException + * @expectedExceptionMessage User ID 98765 not found + * @return void + */ + public function testMasqueradeAsNonExistingUser(): void + { + $user_service = new UserService(); + $user = $user_service->create('user', 'real', 'email', 'pass'); + Auth::login($user); + $handler = new MasqueradeAsUser($user, $user_service); + $request = self::createRequest('POST', ['route' => 'masquerade'], ['user_id' => 98765]); + $handler->handle($request); + } +} + diff --git a/tests/app/Http/RequestHandlers/ModuleActionTest.php b/tests/app/Http/RequestHandlers/ModuleActionTest.php new file mode 100644 index 0000000000..57d97a842f --- /dev/null +++ b/tests/app/Http/RequestHandlers/ModuleActionTest.php @@ -0,0 +1,93 @@ +<?php +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +use Fisharebest\Webtrees\GuestUser; +use Fisharebest\Webtrees\Http\RequestHandlers\ModuleAction; +use Fisharebest\Webtrees\Services\ModuleService; +use Fisharebest\Webtrees\TestCase; +use Fisharebest\Webtrees\Tree; + +/** + * @covers \Fisharebest\Webtrees\Http\RequestHandlers\ModuleAction + */ +class ModuleActionTest extends TestCase +{ + protected static $uses_database = true; + + /** + * @return void + */ + public function testModuleAction(): void + { + $tree = Tree::create('tree', 'tree'); + app()->instance(Tree::class, $tree); + $user = new GuestUser(); + $module_service = new ModuleService(); + $handler = new ModuleAction($module_service, $user); + $request = self::createRequest('GET', ['route' => 'module', 'module' => 'faq', 'action' => 'Show', 'ged' => $tree->name()]); + $response = $handler->handle($request); + + $this->assertSame(self::STATUS_OK, $response->getStatusCode()); + } + + /** + * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException + * @expectedExceptionMessage Method getFishAction() not found in faq + * @return void + */ + public function testNonExistingAction(): void + { + $user = new GuestUser(); + $module_service = new ModuleService(); + $handler = new ModuleAction($module_service, $user); + $request = self::createRequest('GET', ['route' => 'module', 'module' => 'faq', 'action' => 'Fish']); + $handler->handle($request); + } + + /** + * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException + * @expectedExceptionMessage Module fish does not exist + * @return void + */ + public function testNonExistingModule(): void + { + $user = new GuestUser(); + $module_service = new ModuleService(); + $handler = new ModuleAction($module_service, $user); + $request = self::createRequest('GET', ['route' => 'module', 'module' => 'fish', 'action' => 'Show']); + $response = $handler->handle($request); + + $this->assertSame(self::STATUS_OK, $response->getStatusCode()); + } + + /** + * @expectedException \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException + * @expectedExceptionMessage Admin only action + * @return void + */ + public function testAdminAction(): void + { + $tree = Tree::create('tree', 'tree'); + app()->instance(Tree::class, $tree); + $user = new GuestUser(); + $module_service = new ModuleService(); + $handler = new ModuleAction($module_service, $user); + $request = self::createRequest('GET', ['route' => 'module', 'module' => 'faq', 'action' => 'Admin', 'ged' => $tree->name()]); + $handler->handle($request); + } +} + diff --git a/tests/app/Http/RequestHandlers/SelectLanguageTest.php b/tests/app/Http/RequestHandlers/SelectLanguageTest.php new file mode 100644 index 0000000000..22d0868df7 --- /dev/null +++ b/tests/app/Http/RequestHandlers/SelectLanguageTest.php @@ -0,0 +1,57 @@ +<?php +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +use Fisharebest\Webtrees\GuestUser; +use Fisharebest\Webtrees\Http\RequestHandlers\SelectLanguage; +use Fisharebest\Webtrees\Services\UserService; +use Fisharebest\Webtrees\TestCase; + +/** + * @covers \Fisharebest\Webtrees\Http\RequestHandlers\SelectLanguage + */ +class SelectLanguageTest extends TestCase +{ + protected static $uses_database = true; + + /** + * @return void + */ + public function testSelectLanguageForGuest(): void + { + $user = new GuestUser(); + $handler = new SelectLanguage($user); + $request = self::createRequest('POST', ['route' => 'language'], ['language' => 'fr']); + $response = $handler->handle($request); + + self::assertSame(self::STATUS_NO_CONTENT, $response->getStatusCode()); + } + + /** + * @return void + */ + public function testSelectLanguageForUser(): void + { + $user_service = new UserService(); + $user = $user_service->create('user', 'real', 'email', 'pass'); + $handler = new SelectLanguage($user); + $request = self::createRequest('POST', ['route' => 'language'], ['language' => 'fr']); + $response = $handler->handle($request); + + self::assertSame(self::STATUS_NO_CONTENT, $response->getStatusCode()); + } +} + diff --git a/tests/app/Http/RequestHandlers/SelectThemeTest.php b/tests/app/Http/RequestHandlers/SelectThemeTest.php new file mode 100644 index 0000000000..f49e6b1f55 --- /dev/null +++ b/tests/app/Http/RequestHandlers/SelectThemeTest.php @@ -0,0 +1,59 @@ +<?php +/** + * webtrees: online genealogy + * Copyright (C) 2019 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +declare(strict_types=1); + +use Fisharebest\Webtrees\GuestUser; +use Fisharebest\Webtrees\Http\RequestHandlers\SelectTheme; +use Fisharebest\Webtrees\Services\UserService; +use Fisharebest\Webtrees\TestCase; + +/** + * @covers \Fisharebest\Webtrees\Http\RequestHandlers\SelectTheme + */ +class SelectThemeTest extends TestCase +{ + protected static $uses_database = true; + + /** + * @return void + */ + public function testSelectThemeForGuest(): void + { + $user = new GuestUser(); + $handler = new SelectTheme($user); + $request = self::createRequest('POST', ['route' => 'theme'], ['theme' => 'FOO']); + $response = $handler->handle($request); + + self::assertSame(self::STATUS_NO_CONTENT, $response->getStatusCode()); + self::assertSame('FOO', $user->getPreference('theme')); + } + + /** + * @return void + */ + public function testSelectThemeForUser(): void + { + $user_service = new UserService(); + $user = $user_service->create('user', 'real', 'email', 'pass'); + $handler = new SelectTheme($user); + $request = self::createRequest('POST', ['route' => 'theme'], ['theme' => 'FOO']); + $response = $handler->handle($request); + + self::assertSame(self::STATUS_NO_CONTENT, $response->getStatusCode()); + self::assertSame('FOO', $user->getPreference('theme')); + } +} + |
