4 use BookStack\Auth\Access\UserInviteService;
5 use BookStack\Auth\User;
6 use BookStack\Notifications\UserInvite;
11 class UserInviteTest extends TestCase
14 public function test_user_creation_creates_invite()
17 $admin = $this->getAdmin();
19 $this->actingAs($admin)->post('/settings/users/create', [
21 'email' => 'tester@example.com',
22 'send_invite' => 'true',
25 $newUser = User::query()->where('email', '=', 'tester@example.com')->orderBy('id', 'desc')->first();
27 Notification::assertSentTo($newUser, UserInvite::class);
28 $this->assertDatabaseHas('user_invites', [
29 'user_id' => $newUser->id
33 public function test_invite_set_password()
36 $user = $this->getViewer();
37 $inviteService = app(UserInviteService::class);
39 $inviteService->sendInvitation($user);
40 $token = DB::table('user_invites')->where('user_id', '=', $user->id)->first()->token;
42 $setPasswordPageResp = $this->get('/register/invite/' . $token);
43 $setPasswordPageResp->assertSuccessful();
44 $setPasswordPageResp->assertSee('Welcome to BookStack!');
45 $setPasswordPageResp->assertSee('Password');
46 $setPasswordPageResp->assertSee('Confirm Password');
48 $setPasswordResp = $this->followingRedirects()->post('/register/invite/' . $token, [
49 'password' => 'my test password',
51 $setPasswordResp->assertSee('Password set, you now have access to BookStack!');
52 $newPasswordValid = auth()->validate([
53 'email' => $user->email,
54 'password' => 'my test password'
56 $this->assertTrue($newPasswordValid);
57 $this->assertDatabaseMissing('user_invites', [
58 'user_id' => $user->id
62 public function test_invite_set_has_password_validation()
65 $user = $this->getViewer();
66 $inviteService = app(UserInviteService::class);
68 $inviteService->sendInvitation($user);
69 $token = DB::table('user_invites')->where('user_id', '=', $user->id)->first()->token;
71 $shortPassword = $this->followingRedirects()->post('/register/invite/' . $token, [
72 'password' => 'mypas',
74 $shortPassword->assertSee('The password must be at least 6 characters.');
76 $noPassword = $this->followingRedirects()->post('/register/invite/' . $token, [
79 $noPassword->assertSee('The password field is required.');
81 $this->assertDatabaseHas('user_invites', [
82 'user_id' => $user->id
86 public function test_non_existent_invite_token_redirects_to_home()
88 $setPasswordPageResp = $this->get('/register/invite/' . str_random(12));
89 $setPasswordPageResp->assertRedirect('/');
91 $setPasswordResp = $this->post('/register/invite/' . str_random(12), ['password' => 'Password Test']);
92 $setPasswordResp->assertRedirect('/');
95 public function test_token_expires_after_two_weeks()
98 $user = $this->getViewer();
99 $inviteService = app(UserInviteService::class);
101 $inviteService->sendInvitation($user);
102 $tokenEntry = DB::table('user_invites')->where('user_id', '=', $user->id)->first();
103 DB::table('user_invites')->update(['created_at' => Carbon::now()->subDays(14)->subHour(1)]);
105 $setPasswordPageResp = $this->get('/register/invite/' . $tokenEntry->token);
106 $setPasswordPageResp->assertRedirect('/password/email');
107 $setPasswordPageResp->assertSessionHas('error', 'This invitation link has expired. You can instead try to reset your account password.');