]> BookStack Code Mirror - bookstack/blob - tests/Auth/UserInviteTest.php
Fix Crowdin name in the language_request issue template
[bookstack] / tests / Auth / UserInviteTest.php
1 <?php
2
3 namespace Tests\Auth;
4
5 use BookStack\Auth\Access\UserInviteService;
6 use BookStack\Auth\User;
7 use BookStack\Notifications\UserInvite;
8 use Carbon\Carbon;
9 use Illuminate\Notifications\Messages\MailMessage;
10 use Illuminate\Support\Facades\DB;
11 use Illuminate\Support\Facades\Notification;
12 use Illuminate\Support\Str;
13 use Tests\TestCase;
14
15 class UserInviteTest extends TestCase
16 {
17     public function test_user_creation_creates_invite()
18     {
19         Notification::fake();
20         $admin = $this->getAdmin();
21
22         $email = Str::random(16) . '@example.com';
23         $resp = $this->actingAs($admin)->post('/settings/users/create', [
24             'name'        => 'Barry',
25             'email'       => $email,
26             'send_invite' => 'true',
27         ]);
28         $resp->assertRedirect('/settings/users');
29
30         $newUser = User::query()->where('email', '=', $email)->orderBy('id', 'desc')->first();
31
32         Notification::assertSentTo($newUser, UserInvite::class);
33         $this->assertDatabaseHas('user_invites', [
34             'user_id' => $newUser->id,
35         ]);
36     }
37
38     public function test_user_invite_sent_in_selected_language()
39     {
40         Notification::fake();
41         $admin = $this->getAdmin();
42
43         $email = Str::random(16) . '@example.com';
44         $resp = $this->actingAs($admin)->post('/settings/users/create', [
45             'name'        => 'Barry',
46             'email'       => $email,
47             'send_invite' => 'true',
48             'language'    => 'de',
49         ]);
50         $resp->assertRedirect('/settings/users');
51
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);
56
57             return 'Du wurdest eingeladen BookStack beizutreten!' === $mail->subject &&
58                 'Ein Konto wurde für Sie auf BookStack erstellt.' === $mail->greeting;
59         });
60     }
61
62     public function test_invite_set_password()
63     {
64         Notification::fake();
65         $user = $this->getViewer();
66         $inviteService = app(UserInviteService::class);
67
68         $inviteService->sendInvitation($user);
69         $token = DB::table('user_invites')->where('user_id', '=', $user->id)->first()->token;
70
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');
76
77         $setPasswordResp = $this->followingRedirects()->post('/register/invite/' . $token, [
78             'password' => 'my test password',
79         ]);
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',
84         ]);
85         $this->assertTrue($newPasswordValid);
86         $this->assertDatabaseMissing('user_invites', [
87             'user_id' => $user->id,
88         ]);
89     }
90
91     public function test_invite_set_has_password_validation()
92     {
93         Notification::fake();
94         $user = $this->getViewer();
95         $inviteService = app(UserInviteService::class);
96
97         $inviteService->sendInvitation($user);
98         $token = DB::table('user_invites')->where('user_id', '=', $user->id)->first()->token;
99
100         $this->get('/register/invite/' . $token);
101         $shortPassword = $this->followingRedirects()->post('/register/invite/' . $token, [
102             'password' => 'mypassw',
103         ]);
104         $shortPassword->assertSee('The password must be at least 8 characters.');
105
106         $this->get('/register/invite/' . $token);
107         $noPassword = $this->followingRedirects()->post('/register/invite/' . $token, [
108             'password' => '',
109         ]);
110         $noPassword->assertSee('The password field is required.');
111
112         $this->assertDatabaseHas('user_invites', [
113             'user_id' => $user->id,
114         ]);
115     }
116
117     public function test_non_existent_invite_token_redirects_to_home()
118     {
119         $setPasswordPageResp = $this->get('/register/invite/' . Str::random(12));
120         $setPasswordPageResp->assertRedirect('/');
121
122         $setPasswordResp = $this->post('/register/invite/' . Str::random(12), ['password' => 'Password Test']);
123         $setPasswordResp->assertRedirect('/');
124     }
125
126     public function test_token_expires_after_two_weeks()
127     {
128         Notification::fake();
129         $user = $this->getViewer();
130         $inviteService = app(UserInviteService::class);
131
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)]);
135
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.');
139     }
140 }
Morty Proxy This is a proxified and sanitized view of the page, visit original site.