X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/e43f679e621c93d62e7c4909bd1f70b370cd4af1..refs/pull/3693/head:/tests/User/UserManagementTest.php diff --git a/tests/User/UserManagementTest.php b/tests/User/UserManagementTest.php index 94970df4f..71d50e8d6 100644 --- a/tests/User/UserManagementTest.php +++ b/tests/User/UserManagementTest.php @@ -3,11 +3,14 @@ namespace Tests\User; use BookStack\Actions\ActivityType; +use BookStack\Auth\Access\UserInviteService; use BookStack\Auth\Role; use BookStack\Auth\User; use BookStack\Entities\Models\Page; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; +use Mockery\MockInterface; +use RuntimeException; use Tests\TestCase; class UserManagementTest extends TestCase @@ -19,10 +22,10 @@ class UserManagementTest extends TestCase $adminRole = Role::getRole('admin'); $resp = $this->asAdmin()->get('/settings/users'); - $resp->assertElementContains('a[href="' . url('/http/source.bookstackapp.com/settings/users/create') . '"]', 'Add New User'); + $this->withHtml($resp)->assertElementContains('a[href="' . url('/http/source.bookstackapp.com/settings/users/create') . '"]', 'Add New User'); - $this->get('/settings/users/create') - ->assertElementContains('form[action="' . url('/http/source.bookstackapp.com/settings/users/create') . '"]', 'Save'); + $resp = $this->get('/settings/users/create'); + $this->withHtml($resp)->assertElementContains('form[action="' . url('/http/source.bookstackapp.com/settings/users/create') . '"]', 'Save'); $resp = $this->post('/settings/users/create', [ 'name' => $user->name, @@ -163,7 +166,7 @@ class UserManagementTest extends TestCase $guest = User::getDefault(); $resp = $this->asAdmin()->get('/settings/users/' . $guest->id); $resp->assertSee('Guest'); - $resp->assertElementNotExists('#password'); + $this->withHtml($resp)->assertElementNotExists('#password'); } public function test_guest_profile_cannot_be_deleted() @@ -172,11 +175,87 @@ class UserManagementTest extends TestCase $resp = $this->asAdmin()->get('/settings/users/' . $guestUser->id . '/delete'); $resp->assertSee('Delete User'); $resp->assertSee('Guest'); - $resp->assertElementContains('form[action$="/settings/users/' . $guestUser->id . '"] button', 'Confirm'); + $this->withHtml($resp)->assertElementContains('form[action$="/settings/users/' . $guestUser->id . '"] button', 'Confirm'); $resp = $this->delete('/settings/users/' . $guestUser->id); $resp->assertRedirect('/settings/users/' . $guestUser->id); $resp = $this->followRedirects($resp); $resp->assertSee('cannot delete the guest user'); } + + public function test_user_create_language_reflects_default_system_locale() + { + $langs = ['en', 'fr', 'hr']; + foreach ($langs as $lang) { + config()->set('app.locale', $lang); + $resp = $this->asAdmin()->get('/settings/users/create'); + $this->withHtml($resp)->assertElementExists('select[name="language"] option[value="' . $lang . '"][selected]'); + } + } + + public function test_user_creation_is_not_performed_if_the_invitation_sending_fails() + { + /** @var User $user */ + $user = User::factory()->make(); + $adminRole = Role::getRole('admin'); + + // Simulate an invitation sending failure + $this->mock(UserInviteService::class, function (MockInterface $mock) { + $mock->shouldReceive('sendInvitation')->once()->andThrow(RuntimeException::class); + }); + + $this->asAdmin()->post('/settings/users/create', [ + 'name' => $user->name, + 'email' => $user->email, + 'send_invite' => 'true', + 'roles[' . $adminRole->id . ']' => 'true', + ]); + + // Since the invitation failed, the user should not exist in the database + $this->assertDatabaseMissing('users', $user->only('name', 'email')); + } + + public function test_user_create_activity_is_not_persisted_if_the_invitation_sending_fails() + { + /** @var User $user */ + $user = User::factory()->make(); + $adminRole = Role::getRole('admin'); + + $this->mock(UserInviteService::class, function (MockInterface $mock) { + $mock->shouldReceive('sendInvitation')->once()->andThrow(RuntimeException::class); + }); + + $this->asAdmin()->post('/settings/users/create', [ + 'name' => $user->name, + 'email' => $user->email, + 'send_invite' => 'true', + 'roles[' . $adminRole->id . ']' => 'true', + ]); + + $this->assertDatabaseMissing('activities', ['type' => 'USER_CREATE']); + } + + public function test_user_create_update_fails_if_locale_is_invalid() + { + $user = $this->getEditor(); + + // Too long + $resp = $this->asAdmin()->put($user->getEditUrl(), ['language' => 'this_is_too_long']); + $resp->assertSessionHasErrors(['language' => 'The language may not be greater than 15 characters.']); + session()->flush(); + + // Invalid characters + $resp = $this->put($user->getEditUrl(), ['language' => 'enassertSessionHasErrors(['language' => 'The language may only contain letters, numbers, dashes and underscores.']); + session()->flush(); + + // Both on create + $resp = $this->post('/settings/users/create', [ + 'language' => 'en 'My name', + 'email' => 'jimmy@example.com', + ]); + $resp->assertSessionHasErrors(['language' => 'The language may not be greater than 15 characters.']); + $resp->assertSessionHasErrors(['language' => 'The language may only contain letters, numbers, dashes and underscores.']); + } }