AdminEntriesIndex Page Test
This commit is contained in:
parent
cd26479fd9
commit
ec28cffaf3
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -71,7 +71,7 @@
|
|||
</thead>
|
||||
<x-table.body>
|
||||
@foreach($entries as $entry)
|
||||
<tr @dblclick="window.location.href='{{ route('admin.entries.edit',['entry' => $entry->id]) }}'">
|
||||
<tr @dblclick="window.location.href='{{ route('admin.entries.edit', ['entry' => $entry->id]) }}'">
|
||||
<x-table.td><a href="/admin/entries/{{ $entry->id }}/edit"> {{ $entry->id }} </a></x-table.td>
|
||||
<x-table.td>{{ $entry->audition->name }}</x-table.td>
|
||||
<x-table.td>{{ $entry->student->full_name() }}</x-table.td>
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
});
|
||||
|
|
@ -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');
|
||||
});
|
||||
|
|
@ -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');
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue