Certificate manager built on Laravel 13, Livewire 4, and Flux. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
117 lines
4.1 KiB
PHP
117 lines
4.1 KiB
PHP
<?php
|
|
|
|
use App\Models\Category;
|
|
use App\Models\Certificate;
|
|
use App\Models\User;
|
|
use Livewire\Livewire;
|
|
|
|
test('guests are redirected to the login page', function () {
|
|
$this->get(route('certificates.index'))->assertRedirect(route('login'));
|
|
});
|
|
|
|
test('authenticated users can view the certificates page', function () {
|
|
$this->actingAs(User::factory()->create());
|
|
|
|
$this->get(route('certificates.index'))->assertOk();
|
|
});
|
|
|
|
test('users only see their own certificates', function () {
|
|
$user = User::factory()->create();
|
|
$other = User::factory()->create();
|
|
|
|
Certificate::factory()->for($user)->create(['title' => 'My Own Diploma']);
|
|
Certificate::factory()->for($other)->create(['title' => 'Foreign Diploma']);
|
|
|
|
$this->actingAs($user);
|
|
|
|
$this->get(route('certificates.index'))
|
|
->assertSee('My Own Diploma')
|
|
->assertDontSee('Foreign Diploma');
|
|
});
|
|
|
|
test('certificates can be filtered by category', function () {
|
|
$this->actingAs($user = User::factory()->create());
|
|
|
|
$category = Category::factory()->for($user)->create();
|
|
Certificate::factory()->for($user)->create(['title' => 'Categorized One', 'category_id' => $category->id]);
|
|
Certificate::factory()->for($user)->create(['title' => 'Uncategorized One']);
|
|
|
|
Livewire::test('pages::certificates.index')
|
|
->set('categoryFilter', (string) $category->id)
|
|
->assertSee('Categorized One')
|
|
->assertDontSee('Uncategorized One');
|
|
});
|
|
|
|
test('certificates can be sorted by title in both directions', function () {
|
|
$this->actingAs($user = User::factory()->create());
|
|
|
|
Certificate::factory()->for($user)->create(['title' => 'Alpha Certificate']);
|
|
Certificate::factory()->for($user)->create(['title' => 'Zulu Certificate']);
|
|
|
|
Livewire::test('pages::certificates.index')
|
|
->call('sort', 'title')
|
|
->assertSet('sortBy', 'title')
|
|
->assertSet('sortDirection', 'asc')
|
|
->assertSeeInOrder(['Alpha Certificate', 'Zulu Certificate'])
|
|
->call('sort', 'title')
|
|
->assertSet('sortDirection', 'desc')
|
|
->assertSeeInOrder(['Zulu Certificate', 'Alpha Certificate']);
|
|
});
|
|
|
|
test('certificates are sorted by expiry date by default', function () {
|
|
$this->actingAs($user = User::factory()->create());
|
|
|
|
Certificate::factory()->for($user)->create(['title' => 'Later Cert', 'expires_at' => now()->addYears(2)]);
|
|
Certificate::factory()->for($user)->create(['title' => 'Sooner Cert', 'expires_at' => now()->addMonths(3)]);
|
|
|
|
Livewire::test('pages::certificates.index')
|
|
->assertSet('sortBy', 'expires_at')
|
|
->assertSeeInOrder(['Sooner Cert', 'Later Cert']);
|
|
});
|
|
|
|
test('invalid sort columns are ignored', function () {
|
|
$this->actingAs(User::factory()->create());
|
|
|
|
Livewire::test('pages::certificates.index')
|
|
->call('sort', 'user_id')
|
|
->assertSet('sortBy', 'expires_at');
|
|
});
|
|
|
|
test('sorting and filtering are initialized from the query string', function () {
|
|
$this->actingAs(User::factory()->create());
|
|
|
|
Livewire::withQueryParams(['sort' => 'title', 'direction' => 'desc'])
|
|
->test('pages::certificates.index')
|
|
->assertSet('sortBy', 'title')
|
|
->assertSet('sortDirection', 'desc');
|
|
});
|
|
|
|
test('the certificate list is paginated', function () {
|
|
$this->actingAs($user = User::factory()->create());
|
|
|
|
Certificate::factory()->for($user)->count(15)->create();
|
|
|
|
$certificates = Livewire::test('pages::certificates.index')->instance()->certificates;
|
|
|
|
expect($certificates->count())->toBe(10)
|
|
->and($certificates->total())->toBe(15);
|
|
});
|
|
|
|
test('changing the category filter resets pagination', function () {
|
|
$this->actingAs($user = User::factory()->create());
|
|
|
|
Certificate::factory()->for($user)->count(15)->create();
|
|
|
|
Livewire::test('pages::certificates.index')
|
|
->call('nextPage')
|
|
->set('categoryFilter', '')
|
|
->assertSet('paginators.page', 1);
|
|
});
|
|
|
|
test('expired certificates show an expired badge', function () {
|
|
$this->actingAs($user = User::factory()->create());
|
|
|
|
Certificate::factory()->for($user)->expired()->create();
|
|
|
|
$this->get(route('certificates.index'))->assertSee('Expired');
|
|
});
|