5 use BookStack\Auth\Access\UserInviteService;
6 use BookStack\Auth\User;
7 use BookStack\Notifications\UserInvite;
9 use Illuminate\Notifications\Messages\MailMessage;
10 use Illuminate\Support\Facades\DB;
11 use Illuminate\Support\Facades\Notification;
12 use Illuminate\Support\Str;
15 class UserInviteTest extends TestCase
17 public function test_user_creation_creates_invite()
20 $admin = $this->getAdmin();
22 $email = Str::random(16) . '@example.com';
23 $resp = $this->actingAs($admin)->post('/settings/users/create', [
26 'send_invite' => 'true',
28 $resp->assertRedirect('/settings/users');
30 $newUser = User::query()->where('email', '=', $email)->orderBy('id', 'desc')->first();
32 Notification::assertSentTo($newUser, UserInvite::class);
33 $this->assertDatabaseHas('user_invites', [
34 'user_id' => $newUser->id,
38 public function test_user_invite_sent_in_selected_language()
41 $admin = $this->getAdmin();
43 $email = Str::random(16) . '@example.com';
44 $resp = $this->actingAs($admin)->post('/settings/users/create', [
47 'send_invite' => 'true',
50 $resp->assertRedirect('/settings/users');
52 $newUser = User::query()->where('email', '=', $email)->orderBy('id', 'desc')->first();
53 Notification::assertSentTo($newUser, UserInvite::class, function ($notification, $channels, $notifiable) {
54 /** @var MailMessage $mail */
55 $mail = $notification->toMail($notifiable);
57 return 'Du wurdest eingeladen BookStack beizutreten!' === $mail->subject &&
58 'Ein Konto wurde für Sie auf BookStack erstellt.' === $mail->greeting;
62 public function test_invite_set_password()
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 $setPasswordPageResp = $this->get('/register/invite/' . $token);
72 $setPasswordPageResp->assertSuccessful();
73 $setPasswordPageResp->assertSee('Welcome to BookStack!');
74 $setPasswordPageResp->assertSee('Password');
75 $setPasswordPageResp->assertSee('Confirm Password');
77 $setPasswordResp = $this->followingRedirects()->post('/register/invite/' . $token, [
78 'password' => 'my test password',
80 $setPasswordResp->assertSee('Password set, you should now be able to login using your set password to access BookStack!');
81 $newPasswordValid = auth()->validate([
82 'email' => $user->email,
83 'password' => 'my test password',
85 $this->assertTrue($newPasswordValid);
86 $this->assertDatabaseMissing('user_invites', [
87 'user_id' => $user->id,
91 public function test_invite_set_has_password_validation()
94 $user = $this->getViewer();
95 $inviteService = app(UserInviteService::class);
97 $inviteService->sendInvitation($user);
98 $token = DB::table('user_invites')->where('user_id', '=', $user->id)->first()->token;
100 $this->get('/register/invite/' . $token);
101 $shortPassword = $this->followingRedirects()->post('/register/invite/' . $token, [
102 'password' => 'mypassw',
104 $shortPassword->assertSee('The password must be at least 8 characters.');
106 $this->get('/register/invite/' . $token);
107 $noPassword = $this->followingRedirects()->post('/register/invite/' . $token, [
110 $noPassword->assertSee('The password field is required.');
112 $this->assertDatabaseHas('user_invites', [
113 'user_id' => $user->id,
117 public function test_non_existent_invite_token_redirects_to_home()
119 $setPasswordPageResp = $this->get('/register/invite/' . Str::random(12));
120 $setPasswordPageResp->assertRedirect('/');
122 $setPasswordResp = $this->post('/register/invite/' . Str::random(12), ['password' => 'Password Test']);
123 $setPasswordResp->assertRedirect('/');
126 public function test_token_expires_after_two_weeks()
128 Notification::fake();
129 $user = $this->getViewer();
130 $inviteService = app(UserInviteService::class);
132 $inviteService->sendInvitation($user);
133 $tokenEntry = DB::table('user_invites')->where('user_id', '=', $user->id)->first();
134 DB::table('user_invites')->update(['created_at' => Carbon::now()->subDays(14)->subHour(1)]);
136 $setPasswordPageResp = $this->get('/register/invite/' . $tokenEntry->token);
137 $setPasswordPageResp->assertRedirect('/password/email');
138 $setPasswordPageResp->assertSessionHas('error', 'This invitation link has expired. You can instead try to reset your account password.');