4 use BookStack\Auth\Access\UserInviteService;
5 use BookStack\Auth\User;
6 use BookStack\Notifications\UserInvite;
9 use Illuminate\Support\Str;
12 class UserInviteTest extends TestCase
15 public function test_user_creation_creates_invite()
18 $admin = $this->getAdmin();
20 $this->actingAs($admin)->post('/settings/users/create', [
23 'send_invite' => 'true',
26 $newUser = User::query()->where('email', '=', '
[email protected]')->orderBy('id', 'desc')->first();
28 Notification::assertSentTo($newUser, UserInvite::class);
29 $this->assertDatabaseHas('user_invites', [
30 'user_id' => $newUser->id
34 public function test_invite_set_password()
37 $user = $this->getViewer();
38 $inviteService = app(UserInviteService::class);
40 $inviteService->sendInvitation($user);
41 $token = DB::table('user_invites')->where('user_id', '=', $user->id)->first()->token;
43 $setPasswordPageResp = $this->get('/register/invite/' . $token);
44 $setPasswordPageResp->assertSuccessful();
45 $setPasswordPageResp->assertSee('Welcome to BookStack!');
46 $setPasswordPageResp->assertSee('Password');
47 $setPasswordPageResp->assertSee('Confirm Password');
49 $setPasswordResp = $this->followingRedirects()->post('/register/invite/' . $token, [
50 'password' => 'my test password',
52 $setPasswordResp->assertSee('Password set, you now have access to BookStack!');
53 $newPasswordValid = auth()->validate([
54 'email' => $user->email,
55 'password' => 'my test password'
57 $this->assertTrue($newPasswordValid);
58 $this->assertDatabaseMissing('user_invites', [
59 'user_id' => $user->id
63 public function test_invite_set_has_password_validation()
66 $user = $this->getViewer();
67 $inviteService = app(UserInviteService::class);
69 $inviteService->sendInvitation($user);
70 $token = DB::table('user_invites')->where('user_id', '=', $user->id)->first()->token;
72 $this->get('/register/invite/' . $token);
73 $shortPassword = $this->followingRedirects()->post('/register/invite/' . $token, [
74 'password' => 'mypassw',
76 $shortPassword->assertSee('The password must be at least 8 characters.');
78 $this->get('/register/invite/' . $token);
79 $noPassword = $this->followingRedirects()->post('/register/invite/' . $token, [
82 $noPassword->assertSee('The password field is required.');
84 $this->assertDatabaseHas('user_invites', [
85 'user_id' => $user->id
89 public function test_non_existent_invite_token_redirects_to_home()
91 $setPasswordPageResp = $this->get('/register/invite/' . Str::random(12));
92 $setPasswordPageResp->assertRedirect('/');
94 $setPasswordResp = $this->post('/register/invite/' . Str::random(12), ['password' => 'Password Test']);
95 $setPasswordResp->assertRedirect('/');
98 public function test_token_expires_after_two_weeks()
100 Notification::fake();
101 $user = $this->getViewer();
102 $inviteService = app(UserInviteService::class);
104 $inviteService->sendInvitation($user);
105 $tokenEntry = DB::table('user_invites')->where('user_id', '=', $user->id)->first();
106 DB::table('user_invites')->update(['created_at' => Carbon::now()->subDays(14)->subHour(1)]);
108 $setPasswordPageResp = $this->get('/register/invite/' . $tokenEntry->token);
109 $setPasswordPageResp->assertRedirect('/password/email');
110 $setPasswordPageResp->assertSessionHas('error', 'This invitation link has expired. You can instead try to reset your account password.');