diff --git a/app/Http/Controllers/FilterController.php b/app/Http/Controllers/FilterController.php index 00e2012..2cc06bd 100644 --- a/app/Http/Controllers/FilterController.php +++ b/app/Http/Controllers/FilterController.php @@ -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'); } } diff --git a/resources/views/admin/entries/index.blade.php b/resources/views/admin/entries/index.blade.php index 71b8e3d..173899f 100644 --- a/resources/views/admin/entries/index.blade.php +++ b/resources/views/admin/entries/index.blade.php @@ -4,7 +4,7 @@ {{-- Filter Control--}} Set Filters - + @@ -40,7 +40,7 @@ - Clear Filters + Clear Filters Apply Filters @@ -52,7 +52,7 @@ Entries Double click row to edit - New Entry + New Entry @@ -71,7 +71,7 @@ @foreach($entries as $entry) - + {{ $entry->id }} {{ $entry->audition->name }} {{ $entry->student->full_name() }} diff --git a/routes/admin.php b/routes/admin.php index 6be959e..53563c8 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -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'); }); diff --git a/routes/web.php b/routes/web.php index 246ab3e..c63f5b9 100644 --- a/routes/web.php +++ b/routes/web.php @@ -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'); diff --git a/tests/Feature/Pages/Admin/EntriesIndexFiltersTest.php b/tests/Feature/Pages/Admin/EntriesIndexFiltersTest.php new file mode 100644 index 0000000..0c982d0 --- /dev/null +++ b/tests/Feature/Pages/Admin/EntriesIndexFiltersTest.php @@ -0,0 +1,218 @@ +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 + +}); diff --git a/tests/Feature/Pages/Admin/EntriesIndexTest.php b/tests/Feature/Pages/Admin/EntriesIndexTest.php new file mode 100644 index 0000000..9cc57b0 --- /dev/null +++ b/tests/Feature/Pages/Admin/EntriesIndexTest.php @@ -0,0 +1,77 @@ +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'); +}); diff --git a/tests/Pest.php b/tests/Pest.php index 50ab1e4..f711b53 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -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'); +}); +