summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorGreg Roach <fisharebest@webtrees.net>2019-04-11 20:11:22 +0100
committerGreg Roach <fisharebest@webtrees.net>2019-04-11 21:13:20 +0100
commita0801ffbb59d5bed474fc7a91bf1863ebca47791 (patch)
tree473d2a66ec5282decd250775dc7bf76b701fbf64 /tests
parent1bd3adbd9919436f09516afb1909be3be9efef66 (diff)
downloadwebtrees-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.php108
-rw-r--r--tests/app/Http/RequestHandlers/DeleteUserTest.php76
-rw-r--r--tests/app/Http/RequestHandlers/MasqueradeAsUserTest.php81
-rw-r--r--tests/app/Http/RequestHandlers/ModuleActionTest.php93
-rw-r--r--tests/app/Http/RequestHandlers/SelectLanguageTest.php57
-rw-r--r--tests/app/Http/RequestHandlers/SelectThemeTest.php59
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'));
+ }
+}
+