AdminEntriesIndex Page Test

This commit is contained in:
Matt Young 2024-07-03 22:19:20 -05:00
parent cd26479fd9
commit ec28cffaf3
7 changed files with 339 additions and 14 deletions

View File

@ -16,14 +16,13 @@ class FilterController extends Controller
$filters['first_name'] = request('first_name_filter') ? request('first_name_filter') : null;
$filters['last_name'] = request('last_name_filter') ? request('last_name_filter') : null;
// session(['admin_entry_filter', $filters]);
session(['adminEntryFilters' => $filters]);
return redirect('/admin/entries');
return redirect('/admin/entries')->with('success', 'Filters Applied');
}
public function clearAdminEntryFilter(Request $request)
{
session()->forget('adminEntryFilters');
return redirect('/admin/entries');
return redirect('/admin/entries')->with('success', 'Filters Cleared');
}
}

View File

@ -4,7 +4,7 @@
{{-- Filter Control--}}
<x-card.card>
<x-card.heading>Set Filters</x-card.heading>
<x-form.form action="/filters/admin_entry_filter" method="POST">
<x-form.form action="{{ route('admin_entry_filter.set') }}" method="POST">
<x-form.body-grid columns="12">
<x-form.field name="id_filter" label_text="Entry ID" colspan="2" value="{{ $filters['id'] ?? '' }}"/>
<x-form.select name="audition_filter" colspan="4">
@ -40,7 +40,7 @@
<x-form.field name="last_name_filter" colspan="6" label_text="Last Name" value="{{ ($filters['last_name'] ?? null) }}"/>
</x-form.body-grid>
<x-form.footer class="pb-4">
<x-form.button-nocolor href="/filters/admin_entry_filter/clear">Clear Filters</x-form.button-nocolor>
<x-form.button-nocolor href="{{ route('admin_entry_filter.clear') }}">Clear Filters</x-form.button-nocolor>
<x-form.button>Apply Filters</x-form.button>
</x-form.footer>
</x-form.form>
@ -52,7 +52,7 @@
<x-slot:title class="ml-3">Entries</x-slot:title>
<x-slot:subtitle class="ml-3">Double click row to edit</x-slot:subtitle>
<x-slot:title_block_right class="mr-3">
<x-form.button href="/admin/entries/create">New Entry</x-form.button>
<x-form.button href="{{ route('admin.entries.create') }}">New Entry</x-form.button>
</x-slot:title_block_right>
<thead>

View File

@ -75,10 +75,10 @@ Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('admin/')->
// Admin Entries Routes
Route::prefix('entries')->controller(\App\Http\Controllers\Admin\EntryController::class)->group(function () {
Route::get('/', 'index')->name('admin.entries.index');
Route::get('/create', 'create');
Route::post('/', 'store');
Route::get('/create', 'create')->name('admin.entries.create');
Route::post('/', 'store')->name('admin.entries.store');
Route::get('/{entry}/edit', 'edit')->name('admin.entries.edit');
Route::patch('/{entry}', 'update');
Route::patch('/{entry}', 'update')->name('admin.entries.update');
Route::delete('/{entry}', 'destroy')->name('admin.entries.destroy');
});

View File

@ -29,8 +29,8 @@ Route::get('/results', [App\Http\Controllers\ResultsPage::class, '__invoke'])->n
// Filter Related Routes
Route::prefix('filters')->middleware(['auth', 'verified'])->controller(FilterController::class)->group(function () {
Route::post('/admin_entry_filter', 'adminEntryFilter');
Route::get('/admin_entry_filter/clear', 'clearAdminEntryFilter');
Route::post('/admin_entry_filter', 'adminEntryFilter')->name('admin_entry_filter.set');
Route::get('/admin_entry_filter/clear', 'clearAdminEntryFilter')->name('admin_entry_filter.clear');
});
//Route::get('/my_school', [SchoolController::class, 'my_school'])->middleware('auth','verified');

View File

@ -0,0 +1,218 @@
<?php
use App\Models\Audition;
use App\Models\Entry;
use App\Models\School;
use App\Models\Student;
use Illuminate\Foundation\Testing\RefreshDatabase;
use function Pest\Laravel\get;
use function Pest\Laravel\post;
use function PHPUnit\Framework\assertArrayHasKey;
use function PHPUnit\Framework\assertEquals;
use function PHPUnit\Framework\assertIsArray;
uses(RefreshDatabase::class);
it('has a filters form', function () {
// Arrange
actAsAdmin();
// Act & Assert
get(route('admin.entries.index'))
->assertSee(route('admin_entry_filter.set'));
});
it('can filter by entry ID', function () {
// Arrange
$entry = Entry::factory()->create();
$entry2 = Entry::factory()->create();
actAsAdmin();
// Act & Assert
$response = post(route('admin_entry_filter.set', ['id_filter' => $entry->id]));
$response->assertSessionHas('adminEntryFilters');
$adminEntryFilters = session('adminEntryFilters');
assertIsArray($adminEntryFilters);
assertArrayHasKey('id', $adminEntryFilters);
assertEquals($adminEntryFilters['id'], $entry->id);
session([
'adminEntryFilters' => [
'id' => $entry->id,
'audition' => null,
'school' => null,
'grade' => null,
'first_name' => null,
'last_name' => null,
],
]);
get(route('admin.entries.index'))
->assertSee($entry->student->full_name())
->assertDontSee($entry2->student->full_name());
});
it('can filter by audition', function () {
// Arrange
$audition = Audition::factory()->create();
$entry = Entry::factory()->create(['audition_id' => $audition->id]);
$entry2 = Entry::factory()->create(['audition_id' => $audition->id]);
$entry3 = Entry::factory()->create();
actAsAdmin();
// Act & Assert
$response = post(route('admin_entry_filter.set', ['audition_filter' => $entry->audition->id]));
$response->assertSessionHas('adminEntryFilters');
$adminEntryFilters = session('adminEntryFilters');
assertIsArray($adminEntryFilters);
assertArrayHasKey('audition', $adminEntryFilters);
assertEquals($adminEntryFilters['audition'], $audition->id);
session([
'adminEntryFilters' => [
'id' => null,
'audition' => $entry->audition->id,
'school' => null,
'grade' => null,
'first_name' => null,
'last_name' => null,
],
]);
get(route('admin.entries.index'))
->assertSee($entry->student->full_name())
->assertSee($entry2->student->full_name())
->assertDontSee($entry3->student->full_name());
});
it('can filter by school', function () {
// Arrange
$school = School::factory()->create(['id' => 1984]);
$student = Student::factory()->create(['id' => 375, 'school_id' => $school->id]);
$entry = Entry::factory()->create(['student_id' => $student->id]);
$entry2 = Entry::factory()->create(['student_id' => $student->id]);
$entry3 = Entry::factory()->create();
actAsAdmin();
// Act & Assert
$response = post(route('admin_entry_filter.set', ['school_filter' => $entry->school->id]));
$response->assertSessionHas('adminEntryFilters');
$adminEntryFilters = session('adminEntryFilters');
assertIsArray($adminEntryFilters);
assertArrayHasKey('school', $adminEntryFilters);
assertEquals($adminEntryFilters['school'], $school->id);
session([
'adminEntryFilters' => [
'id' => null,
'audition' => null,
'school' => $entry->school->id,
'grade' => null,
'first_name' => null,
'last_name' => null,
],
]);
get(route('admin.entries.index'))
->assertSee($entry->student->full_name())
->assertSee($entry2->student->full_name())
->assertDontSee($entry3->student->full_name());
});
it('can filter by grade', function () {
// Arrange
$student = Student::factory()->create(['id' => 375, 'grade' => 7]);
$student2 = Student::factory()->create(['id' => 721, 'grade' => 11]);
$entry = Entry::factory()->create(['student_id' => $student->id]);
$entry2 = Entry::factory()->create(['student_id' => $student->id]);
$entry3 = Entry::factory()->create(['student_id' => $student2->id]);
actAsAdmin();
// Act & Assert
$response = post(route('admin_entry_filter.set', ['grade_filter' => 7]));
$response->assertSessionHas('adminEntryFilters');
$adminEntryFilters = session('adminEntryFilters');
assertIsArray($adminEntryFilters);
assertArrayHasKey('grade', $adminEntryFilters);
assertEquals($adminEntryFilters['grade'], $student->grade);
session([
'adminEntryFilters' => [
'id' => null,
'audition' => null,
'school' => null,
'grade' => '7',
'first_name' => null,
'last_name' => null,
],
]);
get(route('admin.entries.index'))
->assertSee($entry->student->full_name())
->assertSee($entry2->student->full_name())
->assertDontSee($entry3->student->full_name());
});
it('can filter by first name', function () {
// Arrange
$student = Student::factory()->create(['id' => 375, 'first_name' => fake()->firstName]);
$student2 = Student::factory()->create(['id' => 721, 'first_name' => $student->first_name]);
$student3 = Student::factory()->create();
$entry = Entry::factory()->create(['student_id' => $student->id]);
$entry2 = Entry::factory()->create(['student_id' => $student2->id]);
$entry3 = Entry::factory()->create(['student_id' => $student3->id]);
actAsAdmin();
// Act & Assert
$response = post(route('admin_entry_filter.set', ['first_name_filter' => $student->first_name]));
$response->assertSessionHas('adminEntryFilters');
$adminEntryFilters = session('adminEntryFilters');
assertIsArray($adminEntryFilters);
assertArrayHasKey('first_name', $adminEntryFilters);
assertEquals($adminEntryFilters['first_name'], $student->first_name);
session([
'adminEntryFilters' => [
'id' => null,
'audition' => null,
'school' => null,
'grade' => null,
'first_name' => $student2->first_name,
'last_name' => null,
],
]);
get(route('admin.entries.index'))
->assertSee($entry->student->full_name())
->assertSee($entry2->student->full_name())
->assertDontSee($entry3->student->full_name());
});
it('can filter by last name', function () {
// Arrange
$student = Student::factory()->create(['id' => 375, 'last_name' => fake()->lastName]);
$student2 = Student::factory()->create(['id' => 721, 'last_name' => $student->last_name]);
$student3 = Student::factory()->create();
$entry = Entry::factory()->create(['student_id' => $student->id]);
$entry2 = Entry::factory()->create(['student_id' => $student2->id]);
$entry3 = Entry::factory()->create(['student_id' => $student3->id]);
actAsAdmin();
// Act & Assert
$response = post(route('admin_entry_filter.set', ['last_name_filter' => $student->last_name]));
$response->assertSessionHas('adminEntryFilters');
$adminEntryFilters = session('adminEntryFilters');
assertIsArray($adminEntryFilters);
assertArrayHasKey('last_name', $adminEntryFilters);
assertEquals($adminEntryFilters['last_name'], $student->last_name);
session([
'adminEntryFilters' => [
'id' => null,
'audition' => null,
'school' => null,
'grade' => null,
'first_name' => null,
'last_name' => $student2->last_name,
],
]);
get(route('admin.entries.index'))
->assertSee($entry->student->full_name())
->assertSee($entry2->student->full_name())
->assertDontSee($entry3->student->full_name());
});
it('allows filters to be cleared', function () {
// Arrange
actAsAdmin();
session([
'adminEntryFilters' => [
'id' => 815,
'audition' => 4,
'school' => 9,
'grade' => 8,
'first_name' => fake()->firstName,
'last_name' => fake()->lastName,
],
]);
get(route('admin_entry_filter.clear'));
expect(session()->has('admin_entry_filter'))->toBeFalse();
// Act & Assert
});

View File

@ -0,0 +1,77 @@
<?php
use App\Models\Entry;
use Illuminate\Foundation\Testing\RefreshDatabase;
use function Pest\Laravel\get;
uses(RefreshDatabase::class);
it('admin can see an entries index page', function () {
actAsAdmin();
get(route('admin.entries.index'))
->assertOk();
});
it('normal users cannot see entries index page', function () {
// Arrange
actAsNormal();
get(route('admin.entries.index'))
->assertRedirect(route('dashboard'));
// Act & Assert
});
it('does not allow guests to see the entries index page', function () {
// Arrange
get(route('admin.entries.index'))
->assertRedirect(route('home'));
});
it('shows entries on the index page', function () {
$entries = Entry::factory()->count(2)->create();
actAsAdmin();
$response = get(route('admin.entries.index'))
->assertOk();
foreach ($entries as $entry) {
$response
->assertSee($entry->id)
->assertSee($entry->audition->name)
->assertSee($entry->student->full_name())
->assertSee($entry->student->grade)
->assertSee($entry->school->name);
}
});
it('has a link to add a new entry', function () {
actAsAdmin();
get(route('admin.entries.index'))
->assertSee('New Entry')
->assertSee(route('admin.entries.create'));
});
it('has a link to edit each entry', function () {
$entries = Entry::factory()->count(2)->create();
actAsAdmin();
$response = get(route('admin.entries.index'))
->assertOk();
foreach ($entries as $entry) {
$response
->assertSee(route('admin.entries.edit', $entry));
}
});
it('has pagination after 10 entries', function () {
Entry::factory()->count(10)->create();
actAsAdmin();
get(route('admin.entries.index'))
->assertOk()
->assertDontSee('Previous')
->assertDontSee('Next');
Entry::factory()->count(1)->create();
get(route('admin.entries.index'))
->assertOk()
->assertSee('Next');
get(route('admin.entries.index', ['page' => 2]))
->assertOk()
->assertSee('Previous')
->assertDontSee('Next');
Entry::factory()->count(20)->create();
get(route('admin.entries.index', ['page' => 2]))
->assertOk()
->assertSee('Previous')
->assertSee('Next');
});

View File

@ -11,6 +11,11 @@
|
*/
use App\Models\User;
use App\Settings;
use Illuminate\Foundation\Testing\TestCase;
use function Pest\Laravel\actingAs;
uses(
Tests\TestCase::class,
// Illuminate\Foundation\Testing\RefreshDatabase::class,
@ -42,7 +47,33 @@ expect()->extend('toBeOne', function () {
|
*/
function something()
function actAsAdmin()
{
// ..
actingAs(User::factory()->admin()->create());
}
function actAsTab()
{
actingAs(User::factory()->tab()->create());
}
function actAsNormal()
{
actingAs(User::factory()->create());
}
uses(TestCase::class)->beforeEach(function () {
Settings::set('auditionName', 'Somewhere Band Directors Association');
Settings::set('auditionAbbreviation', 'SBDA');
Settings::set('registrationCode', 'secret');
Settings::set('advanceTo', 'OMEA');
Settings::set('judging_enabled', 1);
Settings::set('organizerName', 'John Doe');
Settings::set('organizerEmail', 'john@sbda.null');
Settings::set('fee_structure', 'onePerEntry');
Settings::set('late_fee', 1000);
Settings::set('school_fee', 2500);
Settings::set('payment_address', '1600 Pennsylvania Ave');
Settings::set('payment_city', 'Washington');
Settings::set('payment_state', 'DC');
Settings::set('payment_zip', '20500');
});