xref: /webtrees/tests/app/AuthTest.php (revision 3fa66c660869af2f4c92ef37e06997aa8a0f55e1)
1<?php
2/**
3 * webtrees: online genealogy
4 * Copyright (C) 2019 webtrees development team
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16declare(strict_types=1);
17
18namespace Fisharebest\Webtrees;
19
20/**
21 * Test the user functions
22 */
23class AuthTest extends \Fisharebest\Webtrees\TestCase
24{
25    protected static $uses_database = true;
26
27    /**
28     * @covers \Fisharebest\Webtrees\Auth::check
29     * @covers \Fisharebest\Webtrees\Auth::login
30     * @covers \Fisharebest\Webtrees\Auth::logout
31     *
32     * @return void
33     */
34    public function testLoginAndLogout(): void
35    {
36        $user = User::create('user', 'User', 'user@example.com', 'secret');
37        $this->assertFalse(Auth::check());
38
39        Auth::login($user);
40        $this->assertTrue(Auth::check());
41
42        Auth::logout();
43        $this->assertFalse(Auth::check());
44    }
45
46    /**
47     * @covers \Fisharebest\Webtrees\Auth::id
48     *
49     * @return void
50     */
51    public function testIdNumbers(): void
52    {
53        // Initially, a visitor.
54        $this->assertNull(Auth::id());
55
56        // ID numbers are issued sequentially, starting at 1.
57        $user1 = User::create('user1', 'User1', 'user1@example.com', 'secret');
58        Auth::login($user1);
59        $this->assertSame(1, Auth::id());
60
61        $user2 = User::create('user2', 'User2', 'user2@example.com', 'secret');
62        Auth::login($user2);
63        $this->assertSame(2, Auth::id());
64    }
65
66    /**
67     * @covers \Fisharebest\Webtrees\Auth::user
68     *
69     * @return void
70     */
71    public function testVisitors(): void
72    {
73        // A visitor.
74        $user = Auth::user();
75
76        $this->assertSame(0, $user->getUserId());
77        $this->assertSame('', $user->getUserName());
78        $this->assertSame('', $user->getRealName());
79        $this->assertSame('', $user->getEmail());
80
81        // Logged in.
82        $user = User::create('user', 'User', 'user@example.com', 'secret');
83        Auth::login($user);
84        $user = Auth::user();
85        $this->assertSame(1, $user->getUserId());
86        $this->assertSame('user', $user->getUserName());
87        $this->assertSame('User', $user->getRealName());
88        $this->assertSame('user@example.com', $user->getEmail());
89    }
90
91    /**
92     * @covers \Fisharebest\Webtrees\Auth::isAdmin
93     *
94     * @return void
95     */
96    public function testAdministrator(): void
97    {
98        // By default, new users are not admins.
99        $user = User::create('admin', 'Administrator', 'admin@example.com', 'secret');
100        $this->assertFalse(Auth::isAdmin($user));
101
102        // Make the user a manager.
103        $user->setPreference('canadmin', '1');
104        $this->assertTrue(Auth::isAdmin($user));
105
106        // Test that the current user is an admin.
107        $this->assertFalse(Auth::isAdmin());
108        Auth::login($user);
109        $this->assertTrue(Auth::isAdmin());
110    }
111
112    /**
113     * @covers \Fisharebest\Webtrees\Auth::isManager
114     * @covers \Fisharebest\Webtrees\Auth::accessLevel
115     *
116     * @return void
117     */
118    public function testManager(): void
119    {
120        $tree = Tree::create('test', 'Test');
121        $tree->setPreference('imported', '1');
122
123        // By default, new users are not managers.
124        $user = User::create('manager', 'Manager', 'manager@example.com', 'secret');
125        $this->assertFalse(Auth::isManager($tree, $user));
126        $this->assertSame(Auth::PRIV_PRIVATE, Auth::accessLevel($tree, $user));
127
128        // Make the user a manager.
129        $tree->setUserPreference($user, 'canedit', 'admin');
130        $this->assertTrue(Auth::isManager($tree, $user));
131        $this->assertSame(Auth::PRIV_NONE, Auth::accessLevel($tree, $user));
132
133        // Test that the current user is a manager.
134        $this->assertFalse(Auth::isManager($tree));
135        $this->assertSame(Auth::PRIV_PRIVATE, Auth::accessLevel($tree));
136        Auth::login($user);
137        $this->assertTrue(Auth::isManager($tree));
138        $this->assertSame(Auth::PRIV_NONE, Auth::accessLevel($tree));
139    }
140
141    /**
142     * @covers \Fisharebest\Webtrees\Auth::isModerator
143     * @covers \Fisharebest\Webtrees\Auth::accessLevel
144     *
145     * @return void
146     */
147    public function testModerator(): void
148    {
149        // By default, new users are not moderators.
150        $user = User::create('moderator', 'Moderator', 'moderator@example.com', 'secret');
151        $tree = Tree::create('test', 'Test');
152        $this->assertFalse(Auth::isModerator($tree, $user));
153        $this->assertSame(Auth::PRIV_PRIVATE, Auth::accessLevel($tree, $user));
154
155        // Make the user a moderator.
156        $tree->setUserPreference($user, 'canedit', 'accept');
157        $this->assertTrue(Auth::isModerator($tree, $user));
158        $this->assertSame(Auth::PRIV_USER, Auth::accessLevel($tree, $user));
159
160        // Test that the current user is a moderator.
161        $this->assertFalse(Auth::isModerator($tree));
162        $this->assertSame(Auth::PRIV_PRIVATE, Auth::accessLevel($tree));
163        Auth::login($user);
164        $this->assertTrue(Auth::isModerator($tree));
165        $this->assertSame(Auth::PRIV_USER, Auth::accessLevel($tree));
166    }
167
168    /**
169     * @covers \Fisharebest\Webtrees\Auth::isEditor
170     * @covers \Fisharebest\Webtrees\Auth::accessLevel
171     *
172     * @return void
173     */
174    public function testEditor(): void
175    {
176        // By default, new users are not editors.
177        $user = User::create('editor', 'Editor', 'editor@example.com', 'secret');
178        $tree = Tree::create('test', 'Test');
179        $this->assertFalse(Auth::isEditor($tree, $user));
180        $this->assertSame(Auth::PRIV_PRIVATE, Auth::accessLevel($tree, $user));
181
182        // Make the user an editor.
183        $tree->setUserPreference($user, 'canedit', 'edit');
184        $this->assertTrue(Auth::isEditor($tree, $user));
185        $this->assertSame(Auth::PRIV_USER, Auth::accessLevel($tree, $user));
186
187        // Test that the current user is an editor.
188        $this->assertFalse(Auth::isEditor($tree));
189        $this->assertSame(Auth::PRIV_PRIVATE, Auth::accessLevel($tree));
190        Auth::login($user);
191        $this->assertTrue(Auth::isEditor($tree));
192        $this->assertSame(Auth::PRIV_USER, Auth::accessLevel($tree));
193    }
194
195    /**
196     * @covers \Fisharebest\Webtrees\Auth::isMember
197     * @covers \Fisharebest\Webtrees\Auth::accessLevel
198     *
199     * @return void
200     */
201    public function testMember(): void
202    {
203        // By default, new users are not members.
204        $user = User::create('member', 'Member', 'member@example.com', 'secret');
205        $tree = Tree::create('test', 'Test');
206        $this->assertFalse(Auth::isMember($tree, $user));
207        $this->assertSame(Auth::PRIV_PRIVATE, Auth::accessLevel($tree, $user));
208
209        // Make the user a members.
210        $tree->setUserPreference($user, 'canedit', 'access');
211        $this->assertTrue(Auth::isMember($tree, $user));
212        $this->assertSame(Auth::PRIV_USER, Auth::accessLevel($tree, $user));
213
214        // Test that the current user is a member.
215        $this->assertFalse(Auth::isMember($tree));
216        $this->assertSame(Auth::PRIV_PRIVATE, Auth::accessLevel($tree));
217        Auth::login($user);
218        $this->assertTrue(Auth::isMember($tree));
219        $this->assertSame(Auth::PRIV_USER, Auth::accessLevel($tree));
220    }
221}
222