Auditionadmin 29 #40
|
|
@ -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'));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
|
||||||
|
|
@ -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');
|
||||||
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue