Write tests - Write tests for what was done to this point that will be kept #11
|
|
@ -16,14 +16,13 @@ class FilterController extends Controller
|
||||||
$filters['first_name'] = request('first_name_filter') ? request('first_name_filter') : null;
|
$filters['first_name'] = request('first_name_filter') ? request('first_name_filter') : null;
|
||||||
$filters['last_name'] = request('last_name_filter') ? request('last_name_filter') : null;
|
$filters['last_name'] = request('last_name_filter') ? request('last_name_filter') : null;
|
||||||
|
|
||||||
// session(['admin_entry_filter', $filters]);
|
|
||||||
session(['adminEntryFilters' => $filters]);
|
session(['adminEntryFilters' => $filters]);
|
||||||
return redirect('/admin/entries');
|
return redirect('/admin/entries')->with('success', 'Filters Applied');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function clearAdminEntryFilter(Request $request)
|
public function clearAdminEntryFilter(Request $request)
|
||||||
{
|
{
|
||||||
session()->forget('adminEntryFilters');
|
session()->forget('adminEntryFilters');
|
||||||
return redirect('/admin/entries');
|
return redirect('/admin/entries')->with('success', 'Filters Cleared');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
{{-- Filter Control--}}
|
{{-- Filter Control--}}
|
||||||
<x-card.card>
|
<x-card.card>
|
||||||
<x-card.heading>Set Filters</x-card.heading>
|
<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.body-grid columns="12">
|
||||||
<x-form.field name="id_filter" label_text="Entry ID" colspan="2" value="{{ $filters['id'] ?? '' }}"/>
|
<x-form.field name="id_filter" label_text="Entry ID" colspan="2" value="{{ $filters['id'] ?? '' }}"/>
|
||||||
<x-form.select name="audition_filter" colspan="4">
|
<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.field name="last_name_filter" colspan="6" label_text="Last Name" value="{{ ($filters['last_name'] ?? null) }}"/>
|
||||||
</x-form.body-grid>
|
</x-form.body-grid>
|
||||||
<x-form.footer class="pb-4">
|
<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.button>Apply Filters</x-form.button>
|
||||||
</x-form.footer>
|
</x-form.footer>
|
||||||
</x-form.form>
|
</x-form.form>
|
||||||
|
|
@ -52,7 +52,7 @@
|
||||||
<x-slot:title class="ml-3">Entries</x-slot:title>
|
<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:subtitle class="ml-3">Double click row to edit</x-slot:subtitle>
|
||||||
<x-slot:title_block_right class="mr-3">
|
<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>
|
</x-slot:title_block_right>
|
||||||
|
|
||||||
<thead>
|
<thead>
|
||||||
|
|
|
||||||
|
|
@ -75,10 +75,10 @@ Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('admin/')->
|
||||||
// Admin Entries Routes
|
// Admin Entries Routes
|
||||||
Route::prefix('entries')->controller(\App\Http\Controllers\Admin\EntryController::class)->group(function () {
|
Route::prefix('entries')->controller(\App\Http\Controllers\Admin\EntryController::class)->group(function () {
|
||||||
Route::get('/', 'index')->name('admin.entries.index');
|
Route::get('/', 'index')->name('admin.entries.index');
|
||||||
Route::get('/create', 'create');
|
Route::get('/create', 'create')->name('admin.entries.create');
|
||||||
Route::post('/', 'store');
|
Route::post('/', 'store')->name('admin.entries.store');
|
||||||
Route::get('/{entry}/edit', 'edit')->name('admin.entries.edit');
|
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');
|
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
|
// Filter Related Routes
|
||||||
Route::prefix('filters')->middleware(['auth', 'verified'])->controller(FilterController::class)->group(function () {
|
Route::prefix('filters')->middleware(['auth', 'verified'])->controller(FilterController::class)->group(function () {
|
||||||
Route::post('/admin_entry_filter', 'adminEntryFilter');
|
Route::post('/admin_entry_filter', 'adminEntryFilter')->name('admin_entry_filter.set');
|
||||||
Route::get('/admin_entry_filter/clear', 'clearAdminEntryFilter');
|
Route::get('/admin_entry_filter/clear', 'clearAdminEntryFilter')->name('admin_entry_filter.clear');
|
||||||
});
|
});
|
||||||
|
|
||||||
//Route::get('/my_school', [SchoolController::class, 'my_school'])->middleware('auth','verified');
|
//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(
|
uses(
|
||||||
Tests\TestCase::class,
|
Tests\TestCase::class,
|
||||||
// Illuminate\Foundation\Testing\RefreshDatabase::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