3 namespace Tests\Commands;
5 use BookStack\Users\Models\Role;
6 use BookStack\Users\Models\User;
7 use Illuminate\Support\Facades\Artisan;
8 use Illuminate\Support\Facades\Auth;
9 use Illuminate\Support\Facades\Hash;
12 class CreateAdminCommandTest extends TestCase
14 public function test_standard_command_usage()
16 $this->artisan('bookstack:create-admin', [
18 '--name' => 'Admin Test',
19 '--password' => 'testing-4',
20 ])->assertExitCode(0);
22 $this->assertDatabaseHas('users', [
24 'name' => 'Admin Test',
27 /** @var User $user */
29 $this->assertTrue($user->hasSystemRole('admin'));
30 $this->assertTrue(Auth::attempt(['email' => '
[email protected]', 'password' => 'testing-4']));
33 public function test_providing_external_auth_id()
35 $this->artisan('bookstack:create-admin', [
37 '--name' => 'Admin Test',
38 '--external-auth-id' => 'xX_admin_Xx',
39 ])->assertExitCode(0);
41 $this->assertDatabaseHas('users', [
43 'name' => 'Admin Test',
44 'external_auth_id' => 'xX_admin_Xx',
47 /** @var User $user */
49 $this->assertNotEmpty($user->password);
52 public function test_password_required_if_external_auth_id_not_given()
54 $this->artisan('bookstack:create-admin', [
56 '--name' => 'Admin Test',
57 ])->expectsQuestion('Please specify a password for the new admin user (8 characters min)', 'hunter2000')
60 $this->assertDatabaseHas('users', [
62 'name' => 'Admin Test',
64 $this->assertTrue(Auth::attempt(['email' => '
[email protected]', 'password' => 'hunter2000']));
67 public function test_generate_password_option()
69 $this->withoutMockingConsoleOutput()
70 ->artisan('bookstack:create-admin', [
72 '--name' => 'Admin Test',
73 '--generate-password' => true,
76 $output = trim(Artisan::output());
77 $this->assertMatchesRegularExpression('/^[a-zA-Z0-9]{32}$/', $output);
80 $this->assertTrue(Hash::check($output, $user->password));
83 public function test_initial_option_updates_default_admin()
87 $this->artisan('bookstack:create-admin', [
89 '--name' => 'Admin Test',
90 '--password' => 'testing-7',
92 ])->expectsOutput('The default admin user has been updated with the provided details!')
95 $defaultAdmin->refresh();
100 public function test_initial_option_does_not_update_if_only_non_default_admin_exists()
104 $defaultAdmin->save();
106 $this->artisan('bookstack:create-admin', [
108 '--name' => 'Admin Test',
109 '--password' => 'testing-7',
111 ])->expectsOutput('Non-default admin user already exists. Skipping creation of new admin user.')
114 $defaultAdmin->refresh();
119 public function test_initial_option_updates_creates_new_admin_if_none_exists()
121 $adminRole = Role::getSystemRole('admin');
122 $adminRole->users()->delete();
123 $this->assertEquals(0, $adminRole->users()->count());
125 $this->artisan('bookstack:create-admin', [
127 '--name' => 'My initial admin',
128 '--password' => 'testing-7',
133 $this->assertEquals(1, $adminRole->users()->count());
134 $this->assertDatabaseHas('users', [
136 'name' => 'My initial admin',
140 public function test_initial_rerun_does_not_error_but_skips()
142 $adminRole = Role::getSystemRole('admin');
143 $adminRole->users()->delete();
145 $this->artisan('bookstack:create-admin', [
147 '--name' => 'My initial admin',
148 '--password' => 'testing-7',
153 $this->artisan('bookstack:create-admin', [
155 '--name' => 'My initial admin',
156 '--password' => 'testing-7',
158 ])->expectsOutput("Non-default admin user already exists. Skipping creation of new admin user.")
162 public function test_initial_option_creation_errors_if_email_already_exists()
164 $adminRole = Role::getSystemRole('admin');
165 $adminRole->users()->delete();
166 $editor = $this->users->editor();
168 $this->artisan('bookstack:create-admin', [
169 '--email' => $editor->email,
170 '--name' => 'My initial admin',
171 '--password' => 'testing-7',
173 ])->expectsOutput("Could not create admin account.")
174 ->expectsOutput("An account with the email address \"{$editor->email}\" already exists.")
178 public function test_initial_option_updating_errors_if_email_already_exists()
180 $editor = $this->users->editor();
182 $this->assertNotNull($defaultAdmin);
184 $this->artisan('bookstack:create-admin', [
185 '--email' => $editor->email,
186 '--name' => 'My initial admin',
187 '--password' => 'testing-7',
189 ])->expectsOutput("Could not create admin account.")
190 ->expectsOutput("An account with the email address \"{$editor->email}\" already exists.")
194 public function test_initial_option_does_not_require_name_or_email_to_be_passed()
196 $adminRole = Role::getSystemRole('admin');
197 $adminRole->users()->delete();
198 $this->assertEquals(0, $adminRole->users()->count());
200 $this->artisan('bookstack:create-admin', [
201 '--generate-password' => true,
203 ])->assertExitCode(0);
205 $this->assertEquals(1, $adminRole->users()->count());
206 $this->assertDatabaseHas('users', [
212 public function test_initial_option_updating_existing_user_with_generate_password_only_outputs_password()
216 $this->withoutMockingConsoleOutput()
217 ->artisan('bookstack:create-admin', [
219 '--name' => 'Admin Test',
220 '--generate-password' => true,
224 $output = Artisan::output();
225 $this->assertMatchesRegularExpression('/^[a-zA-Z0-9]{32}$/', $output);
227 $defaultAdmin->refresh();