Write tests - Write tests for what was done to this point that will be kept #11

Merged
okorpheus merged 61 commits from write-tests into master 2024-07-05 21:21:32 +00:00
5 changed files with 54 additions and 6 deletions
Showing only changes of commit fb2c5724ec - Show all commits

View File

@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Audition; use App\Models\Audition;
use App\Models\Event; use App\Models\Event;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@ -21,7 +22,8 @@ class AuditionController extends Controller
{ {
public function index() public function index()
{ {
$auditions = Audition::with(['event'])->withCount('entries')->orderBy('score_order')->orderBy('created_at', 'desc')->get(); $auditions = Audition::with(['event'])->withCount('entries')->orderBy('score_order')->orderBy('created_at',
'desc')->get();
return view('admin.auditions.index', ['auditions' => $auditions]); return view('admin.auditions.index', ['auditions' => $auditions]);
} }
@ -48,12 +50,16 @@ class AuditionController extends Controller
'entry_fee' => ['required', 'numeric'], 'entry_fee' => ['required', 'numeric'],
'minimum_grade' => ['required', 'integer'], 'minimum_grade' => ['required', 'integer'],
'maximum_grade' => 'required|numeric|gte:minimum_grade', 'maximum_grade' => 'required|numeric|gte:minimum_grade',
'scoring_guide_id' => 'nullable|exists:scoring_guides,id',
], [ ], [
'maximum_grade.gte' => 'The maximum grade must be greater than the minimum grade.', 'maximum_grade.gte' => 'The maximum grade must be greater than the minimum grade.',
]); ]);
$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;
if (empty($alidData['scoring_guide_id'])) {
$validData['scoring_guide_id'] = 0;
}
Audition::create([ Audition::create([
'event_id' => $validData['event_id'], 'event_id' => $validData['event_id'],
@ -64,6 +70,7 @@ class AuditionController extends Controller
'maximum_grade' => $validData['maximum_grade'], 'maximum_grade' => $validData['maximum_grade'],
'for_seating' => $validData['for_seating'], 'for_seating' => $validData['for_seating'],
'for_advancement' => $validData['for_advancement'], 'for_advancement' => $validData['for_advancement'],
'scoring_guide_id' => $validData['scoring_guide_id'],
]); ]);
return to_route('admin.auditions.index')->with('success', 'Audition created successfully'); return to_route('admin.auditions.index')->with('success', 'Audition created successfully');
@ -91,7 +98,7 @@ class AuditionController extends Controller
'entry_deadline' => ['required', 'date'], 'entry_deadline' => ['required', 'date'],
'entry_fee' => ['required', 'numeric'], 'entry_fee' => ['required', 'numeric'],
'minimum_grade' => ['required', 'integer'], 'minimum_grade' => ['required', 'integer'],
'maximum_grade' => 'required|numeric|gt:minimum_grade', 'maximum_grade' => 'required | numeric | gt:minimum_grade',
], [ ], [
'maximum_grade.gt' => 'The maximum grade must be greater than the minimum grade.', 'maximum_grade.gt' => 'The maximum grade must be greater than the minimum grade.',
]); ]);
@ -142,6 +149,13 @@ class AuditionController extends Controller
return response()->json(['status' => 'success']); return response()->json(['status' => 'success']);
} }
/**
* Update the scoring guide for an audition
* Used by AJAX call on the scoring guide index page
* request should include scoring_guide_id and audition_id
*
* @return JsonResponse
*/
public function scoringGuideUpdate(Request $request) public function scoringGuideUpdate(Request $request)
{ {
@ -184,7 +198,8 @@ class AuditionController extends Controller
return $audition->has_partial_draw(); return $audition->has_partial_draw();
}); });
return view('admin.entries.prepare_draw', compact('nodraw_auditions', 'drawn_auditions', 'partial_draw_auditions')); return view('admin.entries.prepare_draw',
compact('nodraw_auditions', 'drawn_auditions', 'partial_draw_auditions'));
} }
public function runDraw(Request $request) public function runDraw(Request $request)
@ -197,6 +212,6 @@ class AuditionController extends Controller
$audition->runDraw(); $audition->runDraw();
} }
return redirect('/admin/auditions/run_draw'); return redirect(' / admin / auditions / run_draw');
} }
} }

View File

@ -54,7 +54,7 @@
let auditionId = itemEl.getAttribute('data-id'); let auditionId = itemEl.getAttribute('data-id');
// Make an AJAX request to update the audition_guide_id // Make an AJAX request to update the audition_guide_id
fetch('/admin/scoring/assign_guide_to_audition', { fetch('{{route('ajax.assignScoringGuideToAudition')}}', {
method: 'POST', method: 'POST',
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',

View File

@ -8,7 +8,7 @@ Route::middleware(['auth', 'verified', CheckIfAdmin::class])->prefix('admin/')->
Route::view('/', 'admin.dashboard')->name('admin.dashboard'); Route::view('/', 'admin.dashboard')->name('admin.dashboard');
Route::post('/auditions/roomUpdate', [\App\Http\Controllers\Admin\AuditionController::class, 'roomUpdate']); // Endpoint for JS assigning auditions to rooms Route::post('/auditions/roomUpdate', [\App\Http\Controllers\Admin\AuditionController::class, 'roomUpdate']); // Endpoint for JS assigning auditions to rooms
Route::post('/scoring/assign_guide_to_audition', [\App\Http\Controllers\Admin\AuditionController::class, 'scoringGuideUpdate']); // Endpoint for JS assigning scoring guides to auditions Route::post('/scoring/assign_guide_to_audition', [\App\Http\Controllers\Admin\AuditionController::class, 'scoringGuideUpdate'])->name('ajax.assignScoringGuideToAudition'); // Endpoint for JS assigning scoring guides to auditions
Route::get('/settings', [\App\Http\Controllers\Admin\AuditionSettings::class, 'index'])->name('audition-settings'); Route::get('/settings', [\App\Http\Controllers\Admin\AuditionSettings::class, 'index'])->name('audition-settings');
Route::post('/settings', [\App\Http\Controllers\Admin\AuditionSettings::class, 'save'])->name('audition-settings-save'); Route::post('/settings', [\App\Http\Controllers\Admin\AuditionSettings::class, 'save'])->name('audition-settings-save');

View File

@ -66,6 +66,30 @@ it('allows an administrator to create auditions', function () {
->and($checkAudition->for_seating)->toBe(0) ->and($checkAudition->for_seating)->toBe(0)
->and($checkAudition->for_advancement)->toBe(1); ->and($checkAudition->for_advancement)->toBe(1);
}); });
it('sets scoring_guide_id to 0 if none is set when creating an audition', function () {
// Arrange
$newEvent = Event::factory()->create();
$changes = [
'event_id' => $newEvent->id,
'name' => 'New Name',
'entry_deadline' => '1978-01-01',
'entry_fee' => 10000,
'minimum_grade' => 3,
'maximum_grade' => 8,
'for_advancement' => 'on',
];
actAsAdmin();
// Act
$response = post(route('admin.auditions.store'), $changes);
// Assert
/** @noinspection PhpUnhandledExceptionInspection */
$response->assertRedirect(route('admin.auditions.index'))
->assertSessionHasNoErrors()
->assertSessionHas('success', 'Audition created successfully');
$checkAudition = Audition::latest()->first();
expect($checkAudition->scoring_guide_id)->toBe(0);
});
it('does not allow a normal user or guest to create an audition', function () { it('does not allow a normal user or guest to create an audition', function () {
// Arrange // Arrange
$precount = Audition::count(); $precount = Audition::count();

View File

@ -83,3 +83,12 @@ it('only allows an admin to create a new scoring guide', function () {
$response->assertRedirect(route('dashboard')) $response->assertRedirect(route('dashboard'))
->assertSessionHas('error', 'You are not authorized to perform this action'); ->assertSessionHas('error', 'You are not authorized to perform this action');
}); });
it('can assign a scoring guide to an audition', function () {
// Arrange
$scoringGuide = ScoringGuide::factory()->create();
$audition = Audition::factory()->create();
// Act & Assert
expect($audition->scoring_guide_id)->toBeNull();
$response = post(route('ajax.assignScoringGuideToAudition'),
['audition_id' => $audition->id, 'new_guide_id' => $scoringGuide->id]);
});