diff --git a/routes/web.php b/routes/web.php index 28c982c..0a59349 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,7 +3,9 @@ use Illuminate\Support\Facades\Route; use App\Http\Controllers; -Route::get('/profile', Controllers\ProfileController::class)->name('profile'); +Route::get('/profile', Controllers\ProfileController::class) + ->name('profile') + ->middleware('auth'); Route::get('/', [Controllers\ListingController::class, 'index']) ->name('listings.index'); diff --git a/tests/Feature/Livewire/ProfileEditorTest.php b/tests/Feature/Livewire/ProfileEditorTest.php new file mode 100644 index 0000000..ef9d5ee --- /dev/null +++ b/tests/Feature/Livewire/ProfileEditorTest.php @@ -0,0 +1,148 @@ +create(); + + Livewire::actingAs($user); + $component = Livewire::test(ProfileEditor::class, ['user' => $user]); + + $component->assertOk(); + $component->assertViewIs('livewire.profile-editor'); + + $component->assertSet('email', $user->email); + $component->assertSet('name', $user->name); + $component->assertSet('user', $user); + } + + public function testSubmitSuccess(): void + { + $user = User::factory()->create([ + 'name' => 'old name', + 'email' => 'old@email.com', + ]); + + $payload = [ + 'name' => 'new name', + 'email' => 'new@email.com', + ]; + + Livewire::actingAs($user); + $component = Livewire::test(ProfileEditor::class, ['user' => $user]) + ->set($payload) + ->call('submit'); + + $user->refresh(); + static::assertSame('new name', $user->name); + static::assertSame('new@email.com', $user->email); + + $component->assertSessionHas('success', 'Profile updated successfully.'); + $component->assertRedirect(route('profile')); + } + + public function testSubmitFailsValidationRequired(): void + { + $user = User::factory()->create(); + + $payload = [ + 'name' => '', + 'email' => '', + ]; + + Livewire::actingAs($user); + $component = Livewire::test(ProfileEditor::class, ['user' => $user]) + ->set($payload) + ->call('submit'); + + $component->assertHasErrors([ + 'name' => 'required', + 'email' => 'required', + ]); + } + + public function testSubmitFailsValidationString(): void + { + $user = User::factory()->create(); + + $payload = [ + 'name' => ['not-a-string'], + 'email' => ['not-a-string'], + ]; + + Livewire::actingAs($user); + $component = Livewire::test(ProfileEditor::class, ['user' => $user]) + ->set($payload) + ->call('submit'); + + $component->assertHasErrors([ + 'name' => 'string', + 'email' => 'string', + ]); + } + + public function testSubmitFailsValidationTooLong(): void + { + $user = User::factory()->create(); + + $payload = [ + 'name' => str_repeat('x', 256), + 'email' => str_repeat('x', 256), + ]; + + Livewire::actingAs($user); + $component = Livewire::test(ProfileEditor::class, ['user' => $user]) + ->set($payload) + ->call('submit'); + + $component->assertHasErrors([ + 'name' => 'max', + 'email' => 'max', + ]); + } + + public function testSubmitFailsValidationEmail(): void + { + $user = User::factory()->create(); + + $payload = [ + 'email' => 'not-an-email', + ]; + + Livewire::actingAs($user); + $component = Livewire::test(ProfileEditor::class, ['user' => $user]) + ->set($payload) + ->call('submit'); + + $component->assertHasErrors([ + 'email' => 'email', + ]); + } + + public function testSubmitFailsValidationUnique(): void + { + $user = User::factory()->create(); + $existingUser = User::factory()->create(['email' => 'existing@email.com']); + + $payload = [ + 'email' => 'existing@email.com', + ]; + + Livewire::actingAs($user); + $component = Livewire::test(ProfileEditor::class, ['user' => $user]) + ->set($payload) + ->call('submit'); + + $component->assertHasErrors([ + 'email' => 'unique', + ]); + } +} diff --git a/tests/Feature/ProfileTest.php b/tests/Feature/ProfileTest.php new file mode 100644 index 0000000..8193aac --- /dev/null +++ b/tests/Feature/ProfileTest.php @@ -0,0 +1,27 @@ +get(route('profile')); + + $response->assertRedirectToRoute('login'); + } + + public function testSuccess(): void + { + $user = User::factory()->create(); + + $this->actingAs($user); + $response = $this->get(route('profile')); + + $response->assertOk(); + $response->assertSeeLivewire(ProfileEditor::class); + } +}