Auditionadmin 29 #40

Merged
okorpheus merged 5 commits from auditionadmin-29 into master 2024-07-17 21:22:23 +00:00
4 changed files with 81 additions and 9 deletions
Showing only changes of commit d292331a1e - Show all commits

View File

@ -2,7 +2,9 @@
namespace App\Http\Controllers\Admin; namespace App\Http\Controllers\Admin;
use App\Actions\CreateEntry;
use App\Actions\Tabulation\CalculateEntryScore; use App\Actions\Tabulation\CalculateEntryScore;
use App\Exceptions\CreateEntryException;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Audition; use App\Models\Audition;
use App\Models\Entry; use App\Models\Entry;
@ -87,7 +89,7 @@ class EntryController extends Controller
return view('admin.entries.create', ['students' => $students, 'auditions' => $auditions]); return view('admin.entries.create', ['students' => $students, 'auditions' => $auditions]);
} }
public function store(Request $request) public function store(Request $request, CreateEntry $creator)
{ {
if (! Auth::user()->is_admin) { if (! Auth::user()->is_admin) {
abort(403); abort(403);
@ -99,15 +101,21 @@ class EntryController extends Controller
$validData['for_seating'] = $request->get('for_seating') ? 1 : 0; $validData['for_seating'] = $request->get('for_seating') ? 1 : 0;
$validData['for_advancement'] = $request->get('for_advancement') ? 1 : 0; $validData['for_advancement'] = $request->get('for_advancement') ? 1 : 0;
$enter_for = [];
if ($validData['for_seating']) {
$enter_for[] = 'seating';
}
if ($validData['for_advancement']) {
$enter_for[] = 'advancement';
}
Entry::create([ try {
'student_id' => $validData['student_id'], $creator($validData['student_id'], $validData['audition_id'], $enter_for);
'audition_id' => $validData['audition_id'], } catch (CreateEntryException $ex) {
'for_seating' => $validData['for_seating'], return redirect()->route('admin.entries.index')->with('error', $ex->getMessage());
'for_advancement' => $validData['for_advancement'], }
]);
return redirect('/admin/entries'); return redirect(route('admin.entries.index'))->with('success', 'The entry has been added.');
} }
public function edit(Entry $entry, CalculateEntryScore $calculator) public function edit(Entry $entry, CalculateEntryScore $calculator)
@ -126,6 +134,7 @@ class EntryController extends Controller
$auditions = Audition::orderBy('score_order')->get(); $auditions = Audition::orderBy('score_order')->get();
$scores = $entry->scoreSheets()->with('audition', 'judge')->get(); $scores = $entry->scoreSheets()->with('audition', 'judge')->get();
$scores->each(fn ($score) => $score->entry = $entry); $scores->each(fn ($score) => $score->entry = $entry);
// return view('admin.entries.edit', ['entry' => $entry, 'students' => $students, 'auditions' => $auditions]); // return view('admin.entries.edit', ['entry' => $entry, 'students' => $students, 'auditions' => $auditions]);
return view('admin.entries.edit', compact('entry', 'students', 'auditions', 'scores')); return view('admin.entries.edit', compact('entry', 'students', 'auditions', 'scores'));
} }

View File

@ -36,6 +36,10 @@ class EntryController extends Controller
'student_id' => ['required', 'exists:students,id'], 'student_id' => ['required', 'exists:students,id'],
'audition_id' => ['required', 'exists:auditions,id'], 'audition_id' => ['required', 'exists:auditions,id'],
]); ]);
$audition = Audition::find($validData['audition_id']);
if ($audition->entry_deadline < now()) {
return redirect()->route('entries.index')->with('error', 'The entry deadline for that audition has passed');
}
$validData['for_seating'] = $request->get('for_seating') ? 1 : 0; $validData['for_seating'] = $request->get('for_seating') ? 1 : 0;
$validData['for_advancement'] = $request->get('for_advancement') ? 1 : 0; $validData['for_advancement'] = $request->get('for_advancement') ? 1 : 0;

View File

@ -4,6 +4,7 @@ use App\Models\Audition;
use App\Models\Student; use App\Models\Student;
use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\RefreshDatabase;
use function Pest\Laravel\assertDatabaseHas;
use function Pest\Laravel\get; use function Pest\Laravel\get;
use function PHPUnit\Framework\assertEquals; use function PHPUnit\Framework\assertEquals;
@ -19,7 +20,7 @@ it('does not respond to a guest', function () {
get(route('admin.entries.create')) get(route('admin.entries.create'))
->assertRedirect(route('home')); ->assertRedirect(route('home'));
}); });
it('passes a collection of all students with thier schools to the view', function () { it('passes a collection of all students with their schools to the view', function () {
// Arrange // Arrange
Student::factory()->count(8)->create(); Student::factory()->count(8)->create();
$students = Student::with('school')->orderBy('last_name')->orderBy('first_name')->get(); $students = Student::with('school')->orderBy('last_name')->orderBy('first_name')->get();
@ -47,3 +48,42 @@ it('passes a collection of available auditions to the view', function () {
$response->assertOk(); $response->assertOk();
assertEquals(array_values($auditions), array_values($viewAuditions)); assertEquals(array_values($auditions), array_values($viewAuditions));
}); });
it('can create an entry', function () {
$audition = Audition::factory()->create(['maximum_grade' => 12, 'minimum_grade' => 7]);
$student = Student::factory()->create(['grade' => 9]);
actAsAdmin();
$response = $this->post(route('admin.entries.store'), [
'student_id' => $student->id,
'audition_id' => $audition->id,
'for_seating' => 'on',
]);
$response->assertRedirect(route('admin.entries.index'))
->assertSessionDoesntHaveErrors()
->assertSessionHas('success', 'The entry has been added.');
assertDatabaseHas('entries', [
'student_id' => $student->id,
'audition_id' => $audition->id,
'for_seating' => 1,
'for_advancement' => 0,
]);
});
it('can create a late entry', function () {
$audition = Audition::factory()->closed()->create(['maximum_grade' => 12, 'minimum_grade' => 7]);
$student = Student::factory()->create(['grade' => 9]);
actAsAdmin();
$response = $this->post(route('admin.entries.store'), [
'student_id' => $student->id,
'audition_id' => $audition->id,
'for_seating' => 'on',
]);
$response->assertRedirect(route('admin.entries.index'))
->assertSessionDoesntHaveErrors()
->assertSessionMissing('error')
->assertSessionHas('success', 'The entry has been added.');
assertDatabaseHas('entries', [
'student_id' => $student->id,
'audition_id' => $audition->id,
'for_seating' => 1,
'for_advancement' => 0,
]);
});

View File

@ -9,6 +9,7 @@ use App\Settings;
use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\RefreshDatabase;
use function Pest\Laravel\actingAs; use function Pest\Laravel\actingAs;
use function Pest\Laravel\assertDatabaseMissing;
use function Pest\Laravel\delete; use function Pest\Laravel\delete;
use function Pest\Laravel\get; use function Pest\Laravel\get;
use function Pest\Laravel\post; use function Pest\Laravel\post;
@ -180,3 +181,21 @@ it('shows entry type checkboxes only when advancement is enabled', function () {
get(route('entries.index')) get(route('entries.index'))
->assertDontSee('Enter for'); ->assertDontSee('Enter for');
}); });
it('denies an entry that is late', function () {
// Arrnge
$student = Student::factory()->create(['school_id' => $this->school->id, 'grade' => 8]);
$audition = Audition::factory()->closed()->create(['maximum_grade' => 9, 'minimum_grade' => 7]);
$user = User::factory()->create(['school_id' => $student->school_id]);
actingAs($user);
// Act & Assert
$response = post(route('entries.store'), [
'student_id' => $student->id,
'audition_id' => $audition->id,
]);
assertDatabaseMissing('entries', [
'student_id' => $student->id,
'audition_id' => $audition->id,
]);
$response->assertRedirect(route('entries.index'))
->assertSessionHas('error', 'The entry deadline for that audition has passed');
});