]> BookStack Code Mirror - bookstack/blobdiff - tests/Api/UsersApiTest.php
respective book and chapter structure added.
[bookstack] / tests / Api / UsersApiTest.php
index e1bcb02d57b1bb701e6c590e9a1baf224cd62a9e..a0c67d0d281f73612d2f2f9ada724fed833c1859 100644 (file)
@@ -2,11 +2,13 @@
 
 namespace Tests\Api;
 
-use BookStack\Actions\ActivityType;
-use BookStack\Auth\Role;
-use BookStack\Auth\User;
+use BookStack\Access\Notifications\UserInviteNotification;
+use BookStack\Activity\ActivityType;
+use BookStack\Activity\Models\Activity as ActivityModel;
 use BookStack\Entities\Models\Entity;
-use BookStack\Notifications\UserInvite;
+use BookStack\Facades\Activity;
+use BookStack\Users\Models\Role;
+use BookStack\Users\Models\User;
 use Illuminate\Support\Facades\Hash;
 use Illuminate\Support\Facades\Notification;
 use Tests\TestCase;
@@ -15,9 +17,9 @@ class UsersApiTest extends TestCase
 {
     use TestsApi;
 
-    protected $baseEndpoint = '/api/users';
+    protected string $baseEndpoint = '/api/users';
 
-    protected $endpointMap = [
+    protected array $endpointMap = [
         ['get', '/api/users'],
         ['post', '/api/users'],
         ['get', '/api/users/1'],
@@ -47,7 +49,7 @@ class UsersApiTest extends TestCase
         }
     }
 
-    public function test_index_endpoint_returns_expected_shelf()
+    public function test_index_endpoint_returns_expected_user()
     {
         $this->actingAsApiAdmin();
         /** @var User $firstUser */
@@ -56,13 +58,34 @@ class UsersApiTest extends TestCase
         $resp = $this->getJson($this->baseEndpoint . '?count=1&sort=+id');
         $resp->assertJson(['data' => [
             [
-                'id'   => $firstUser->id,
-                'name' => $firstUser->name,
-                'slug' => $firstUser->slug,
-                'email' => $firstUser->email,
+                'id'          => $firstUser->id,
+                'name'        => $firstUser->name,
+                'slug'        => $firstUser->slug,
+                'email'       => $firstUser->email,
                 'profile_url' => $firstUser->getProfileUrl(),
-                'edit_url' => $firstUser->getEditUrl(),
-                'avatar_url' => $firstUser->getAvatar(),
+                'edit_url'    => $firstUser->getEditUrl(),
+                'avatar_url'  => $firstUser->getAvatar(),
+            ],
+        ]]);
+    }
+
+    public function test_index_endpoint_has_correct_created_and_last_activity_dates()
+    {
+        $user = $this->users->editor();
+        $user->created_at = now()->subYear();
+        $user->save();
+
+        $this->actingAs($user);
+        Activity::add(ActivityType::AUTH_LOGIN, 'test login activity');
+        /** @var ActivityModel $activity */
+        $activity = ActivityModel::query()->where('user_id', '=', $user->id)->latest()->first();
+
+        $resp = $this->asAdmin()->getJson($this->baseEndpoint . '?filter[id]=3');
+        $resp->assertJson(['data' => [
+            [
+                'id'          => $user->id,
+                'created_at' => $user->created_at->toJSON(),
+                'last_activity_at' => $activity->created_at->toJson(),
             ],
         ]]);
     }
@@ -74,24 +97,24 @@ class UsersApiTest extends TestCase
         $role = Role::query()->first();
 
         $resp = $this->postJson($this->baseEndpoint, [
-            'name' => 'Benny Boris',
-            'email' => '[email protected]',
-            'password' => 'mysuperpass',
-            'language' => 'it',
-            'roles' => [$role->id],
+            'name'        => 'Benny Boris',
+            'email'       => '[email protected]',
+            'password'    => 'mysuperpass',
+            'language'    => 'it',
+            'roles'       => [$role->id],
             'send_invite' => false,
         ]);
 
         $resp->assertStatus(200);
         $resp->assertJson([
-            'name' => 'Benny Boris',
-            'email' => '[email protected]',
+            'name'             => 'Benny Boris',
+            'email'            => '[email protected]',
             'external_auth_id' => '',
-            'roles' => [
+            'roles'            => [
                 [
-                    'id' => $role->id,
+                    'id'           => $role->id,
                     'display_name' => $role->display_name,
-                ]
+                ],
             ],
         ]);
         $this->assertDatabaseHas('users', ['email' => '[email protected]']);
@@ -109,15 +132,32 @@ class UsersApiTest extends TestCase
         Notification::fake();
 
         $resp = $this->postJson($this->baseEndpoint, [
-            'name' => 'Benny Boris',
-            'email' => '[email protected]',
+            'name'        => 'Benny Boris',
+            'email'       => '[email protected]',
             'send_invite' => true,
         ]);
 
         $resp->assertStatus(200);
         /** @var User $user */
         $user = User::query()->where('email', '=', '[email protected]')->first();
-        Notification::assertSentTo($user, UserInvite::class);
+        Notification::assertSentTo($user, UserInviteNotification::class);
+    }
+
+    public function test_create_with_send_invite_works_with_value_of_1()
+    {
+        $this->actingAsApiAdmin();
+        Notification::fake();
+
+        $resp = $this->postJson($this->baseEndpoint, [
+            'name'        => 'Benny Boris',
+            'email'       => '[email protected]',
+            'send_invite' => '1', // Submissions via x-www-form-urlencoded/form-data may use 1 instead of boolean
+        ]);
+
+        $resp->assertStatus(200);
+        /** @var User $user */
+        $user = User::query()->where('email', '=', '[email protected]')->first();
+        Notification::assertSentTo($user, UserInviteNotification::class);
     }
 
     public function test_create_name_and_email_validation()
@@ -140,7 +180,7 @@ class UsersApiTest extends TestCase
 
         $resp = $this->postJson($this->baseEndpoint, [
             'email' => $existingUser->email,
-            'name' => 'Benny Boris',
+            'name'  => 'Benny Boris',
         ]);
         $resp->assertStatus(422);
         $resp->assertJson($this->validationResponse(['email' => ['The email has already been taken.']]));
@@ -158,15 +198,15 @@ class UsersApiTest extends TestCase
 
         $resp->assertStatus(200);
         $resp->assertJson([
-            'id'         => $user->id,
-            'slug'       => $user->slug,
-            'email'      => $user->email,
+            'id'               => $user->id,
+            'slug'             => $user->slug,
+            'email'            => $user->email,
             'external_auth_id' => $user->external_auth_id,
-            'roles' => [
+            'roles'            => [
                 [
-                    'id' => $userRole->id,
+                    'id'           => $userRole->id,
                     'display_name' => $userRole->display_name,
-                ]
+                ],
             ],
         ]);
     }
@@ -175,22 +215,22 @@ class UsersApiTest extends TestCase
     {
         $this->actingAsApiAdmin();
         /** @var User $user */
-        $user = $this->getAdmin();
+        $user = $this->users->admin();
         $roles = Role::query()->pluck('id');
         $resp = $this->putJson($this->baseEndpoint . "/{$user->id}", [
-            'name' => 'My updated user',
-            'email' => '[email protected]',
-            'roles' => $roles,
+            'name'             => 'My updated user',
+            'email'            => '[email protected]',
+            'roles'            => $roles,
             'external_auth_id' => 'btest',
-            'password' => 'barrytester',
-            'language' => 'fr',
+            'password'         => 'barrytester',
+            'language'         => 'fr',
         ]);
 
         $resp->assertStatus(200);
         $resp->assertJson([
-            'id' => $user->id,
-            'name' => 'My updated user',
-            'email' => '[email protected]',
+            'id'               => $user->id,
+            'name'             => 'My updated user',
+            'email'            => '[email protected]',
             'external_auth_id' => 'btest',
         ]);
         $user->refresh();
@@ -204,15 +244,15 @@ class UsersApiTest extends TestCase
     {
         $this->actingAsApiAdmin();
         /** @var User $user */
-        $user = $this->getAdmin();
+        $user = $this->users->admin();
         $roleCount = $user->roles()->count();
         $resp = $this->putJson($this->baseEndpoint . "/{$user->id}", []);
 
         $resp->assertStatus(200);
         $this->assertDatabaseHas('users', [
-            'id' => $user->id,
-            'name' => $user->name,
-            'email' => $user->email,
+            'id'       => $user->id,
+            'name'     => $user->name,
+            'email'    => $user->email,
             'password' => $user->password,
         ]);
         $this->assertEquals($roleCount, $user->roles()->count());
@@ -222,7 +262,7 @@ class UsersApiTest extends TestCase
     {
         $this->actingAsApiAdmin();
         /** @var User $user */
-        $user = User::query()->where('id', '!=', $this->getAdmin()->id)
+        $user = User::query()->where('id', '!=', $this->users->admin()->id)
             ->whereNull('system_name')
             ->first();
 
@@ -236,10 +276,10 @@ class UsersApiTest extends TestCase
     {
         $this->actingAsApiAdmin();
         /** @var User $user */
-        $user = User::query()->where('id', '!=', $this->getAdmin()->id)
+        $user = User::query()->where('id', '!=', $this->users->admin()->id)
             ->whereNull('system_name')
             ->first();
-        $entityChain = $this->createEntityChainBelongingToUser($user);
+        $entityChain = $this->entities->createChainBelongingToUser($user);
         /** @var User $newOwner */
         $newOwner = User::query()->where('id', '!=', $user->id)->first();