diff --git a/tests/Feature/UserTest.php b/tests/Feature/UserTest.php index 595d5b6..c8a246e 100644 --- a/tests/Feature/UserTest.php +++ b/tests/Feature/UserTest.php @@ -5,19 +5,148 @@ declare(strict_types=1); namespace Tests\Feature; use Illuminate\Foundation\Testing\DatabaseMigrations; +use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Storage; +use Inertia\Testing\AssertableInertia as Assert; use Tests\TestCase; +use Toby\Enums\FormOfEmployment; use Toby\Models\User; class UserTest extends TestCase { use DatabaseMigrations; - public function testUserCanSeeUsersList(): void + public function setUp(): void { + parent::setUp(); + + Storage::fake(); + } + + public function testAdminCanSeeUsersList(): void + { + User::factory()->count(10)->create(); + $admin = User::factory()->create(); + + $this->assertDatabaseCount("users", 11); + + $this->actingAs($admin) + ->get("/users") + ->assertInertia(fn(Assert $page) => $page + ->component("Users/Index") + ->has("users.data", 11) + ); + } + + public function testAdminCanSearchUsersList(): void + { + User::factory(["name" => "Test User1"])->create(); + User::factory(["name" => "Test User2"])->create(); + User::factory(["name" => "Test User3"])->create(); + $admin = User::factory(["name" => "John Doe"])->create(); + + $this->assertDatabaseCount("users", 4); + + $this->actingAs($admin) + ->get("/users?search=test") + ->assertInertia(fn(Assert $page) => $page + ->component("Users/Index") + ->has("users.data", 3) + ); + } + + public function testUserListIsPaginated(): void + { + User::factory()->count(15)->create(); + $admin = User::factory()->create(); + + $this->assertDatabaseCount("users", 16); + + $this->actingAs($admin) + ->get("/users?page=2") + ->assertInertia(fn(Assert $page) => $page + ->component("Users/Index") + ->has("users.data", 1) + ); + } + + public function testAdminCanCreateUser(): void + { + $admin = User::factory()->create(); + Carbon::setTestNow(Carbon::now()); + + $this->actingAs($admin) + ->post("/users", [ + "name" => "John Doe", + "email" => "john.doe@example.com", + "employmentForm" => FormOfEmployment::B2B_CONTRACT->value, + "employmentDate" => Carbon::now()->toDateTimeString(), + ]) + ->assertSessionHasNoErrors(); + + $this->assertDatabaseHas("users", [ + "name" => "John Doe", + "email" => "john.doe@example.com", + "employment_form" => FormOfEmployment::B2B_CONTRACT->value, + "employment_date" => Carbon::now()->toDateTimeString(), + ]); + } + + public function testAdminCanEditUser(): void + { + $admin = User::factory()->create(); $user = User::factory()->create(); - $this->actingAs($user) - ->get("/users") - ->assertOk(); + Carbon::setTestNow(); + + $this->assertDatabaseHas("users", [ + "name" => $user->name, + "email" => $user->email, + "employment_form" => $user->employment_form->value, + "employment_date" => $user->employment_date->toDateTimeString(), + ]); + + $this->actingAs($admin) + ->put("/users/{$user->id}", [ + "name" => "John Doe", + "email" => "john.doe@example.com", + "employmentForm" => FormOfEmployment::B2B_CONTRACT->value, + "employmentDate" => Carbon::now()->toDateTimeString(), + ]) + ->assertSessionHasNoErrors(); + + $this->assertDatabaseHas("users", [ + "name" => "John Doe", + "email" => "john.doe@example.com", + "employment_form" => FormOfEmployment::B2B_CONTRACT->value, + "employment_date" => Carbon::now()->toDateTimeString(), + ]); + } + + public function testAdminCanDeleteUser(): void + { + $admin = User::factory()->create(); + $user = User::factory()->create(); + + $this->actingAs($admin) + ->delete("/users/{$user->id}") + ->assertSessionHasNoErrors(); + + $this->assertSoftDeleted($user); + } + + public function testAdminCanRestoreUser(): void + { + $admin = User::factory()->create(); + $user = User::factory()->create(); + $user->delete(); + + $this->assertSoftDeleted($user); + + $this->actingAs($admin) + ->post("/users/{$user->id}/restore") + ->assertSessionHasNoErrors(); + + $this->assertNotSoftDeleted($user); } } diff --git a/tests/Unit/AvatarTest.php b/tests/Unit/AvatarTest.php new file mode 100644 index 0000000..3cc900b --- /dev/null +++ b/tests/Unit/AvatarTest.php @@ -0,0 +1,66 @@ +create(); + + Storage::assertExists($user->avatar); + } + + public function testAvatarIsDeletedWhenUserIsForceDeleted(): void + { + $user = User::factory()->create(); + + Storage::assertExists($user->avatar); + + $user->forceDelete(); + + Storage::assertMissing($user->avatar); + + } + + public function testAvatarIsReplacedWhenUserChangedTheirName(): void + { + $user = User::factory()->create(); + $oldAvatar = $user->avatar; + + Storage::assertExists($oldAvatar); + + $user->update(["name" => "John Doe"]); + + Storage::assertMissing($oldAvatar); + Storage::assertExists($user->avatar); + } + + public function testAvatarIsNotReplacedWhenUserChangedOtherData(): void + { + $user = User::factory()->create(); + $avatar = $user->avatar; + + Storage::assertExists($avatar); + + $user->update(["email" => "john.doe@example.com"]); + + Storage::assertExists($avatar); + } +} diff --git a/tests/Unit/ExampleTest.php b/tests/Unit/ExampleTest.php deleted file mode 100644 index b98aaab..0000000 --- a/tests/Unit/ExampleTest.php +++ /dev/null @@ -1,15 +0,0 @@ -assertTrue(true); - } -}