From f400b2bda5189d91e7a4234a13f7b7005ec8cdb5 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Mon, 1 Jul 2024 08:14:30 -0500 Subject: [PATCH] Finish Audition model test and student index. Finish AuditionFlag model test --- app/Http/Controllers/StudentController.php | 44 ++++-- app/Http/Middleware/CheckIfAdmin.php | 2 +- app/Http/Middleware/CheckIfHasSchool.php | 10 +- app/Models/Audition.php | 5 +- app/Policies/StudentPolicy.php | 17 ++- app/Rules/UniqueFullNameAtSchool.php | 6 +- database/factories/AuditionFactory.php | 2 +- database/factories/RoomFactory.php | 4 +- database/factories/ScoringGuideFactory.php | 2 +- database/seeders/SampleSettingsSeeder.php | 18 +-- .../layout/navbar/menus/admin.blade.php | 2 +- .../components/layout/navbar/navbar.blade.php | 11 +- resources/views/dashboard/dashboard.blade.php | 2 +- routes/user.php | 32 ++--- tests/Feature/Models/AuditionFlagTest.php | 21 +++ tests/Feature/Models/AuditionTest.php | 105 ++++++++++++++ tests/Feature/Pages/DashbaordTest.php | 53 ++++++- tests/Feature/Pages/StudentsIndexTest.php | 131 +++++++++++++++++- tests/Feature/PagesResponseTest.php | 15 ++ 19 files changed, 418 insertions(+), 64 deletions(-) create mode 100644 tests/Feature/Models/AuditionFlagTest.php diff --git a/app/Http/Controllers/StudentController.php b/app/Http/Controllers/StudentController.php index be1b021..f4d1186 100644 --- a/app/Http/Controllers/StudentController.php +++ b/app/Http/Controllers/StudentController.php @@ -5,10 +5,10 @@ namespace App\Http\Controllers; use App\Models\Audition; use App\Models\School; use App\Models\Student; -use App\Models\User; use App\Rules\UniqueFullNameAtSchool; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; + use function abort; use function redirect; @@ -20,9 +20,13 @@ class StudentController extends Controller */ public function index() { + if (! Auth::user()->school_id) { + return redirect()->route('dashboard'); + } $students = Auth::user()->students()->with('entries')->get(); $auditions = Audition::all(); - return view('students.index',['students' => $students, 'auditions' => $auditions]); + + return view('students.index', ['students' => $students, 'auditions' => $auditions]); } /** @@ -38,21 +42,26 @@ class StudentController extends Controller */ public function store(Request $request) { - if ($request->user()->cannot('create', Student::class)) abort(403); + if ($request->user()->cannot('create', Student::class)) { + abort(403); + } $request->validate([ 'first_name' => ['required'], - 'last_name' => ['required', new UniqueFullNameAtSchool(request('first_name'),request('last_name'), Auth::user()->school_id)], - 'grade' => ['required', 'integer'], + 'last_name' => [ + 'required', + new UniqueFullNameAtSchool(request('first_name'), request('last_name'), Auth::user()->school_id), + ], + 'grade' => ['required', 'integer'], ]); $student = Student::create([ 'first_name' => request('first_name'), 'last_name' => request('last_name'), 'grade' => request('grade'), - 'school_id' => Auth::user()->school_id + 'school_id' => Auth::user()->school_id, ]); - $request->session()->put('auditionMessages',['success','I did it again ma']); + $request->session()->put('auditionMessages', ['success', 'I did it again ma']); return redirect('/students'); } @@ -70,7 +79,10 @@ class StudentController extends Controller */ public function edit(Request $request, Student $student) { - if ($request->user()->cannot('update', $student)) abort(403); + if ($request->user()->cannot('update', $student)) { + abort(403); + } + return view('students.edit', ['student' => $student]); } @@ -79,22 +91,23 @@ class StudentController extends Controller */ public function update(Request $request, Student $student) { - if ($request->user()->cannot('update', $student)) abort(403); + if ($request->user()->cannot('update', $student)) { + abort(403); + } request()->validate([ 'first_name' => ['required'], - 'last_name' => ['required'], - 'grade' => ['required', 'integer'], + 'last_name' => ['required'], + 'grade' => ['required', 'integer'], ]); $student->update([ 'first_name' => request('first_name'), 'last_name' => request('last_name'), - 'grade' => request('grade') + 'grade' => request('grade'), ]); // TODO if a students grade is changed, we need to be sure they are still eligible for the auditions in which they are entered. - return redirect('/students'); } @@ -103,8 +116,11 @@ class StudentController extends Controller */ public function destroy(Request $request, Student $student) { - if ($request->user()->cannot('delete', $student)) abort(403); + if ($request->user()->cannot('delete', $student)) { + abort(403); + } $student->delete(); + return redirect('/students'); } } diff --git a/app/Http/Middleware/CheckIfAdmin.php b/app/Http/Middleware/CheckIfAdmin.php index 36baeb2..69b2a37 100644 --- a/app/Http/Middleware/CheckIfAdmin.php +++ b/app/Http/Middleware/CheckIfAdmin.php @@ -20,7 +20,7 @@ class CheckIfAdmin return $next($request); } - return redirect('/')->with('error', 'You do not have admin access.'); + return redirect(route('home'))->with('error', 'You do not have admin access.'); } } diff --git a/app/Http/Middleware/CheckIfHasSchool.php b/app/Http/Middleware/CheckIfHasSchool.php index cc8b2b1..c77dc33 100644 --- a/app/Http/Middleware/CheckIfHasSchool.php +++ b/app/Http/Middleware/CheckIfHasSchool.php @@ -4,7 +4,10 @@ namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; use Symfony\Component\HttpFoundation\Response; +use function redirect; +use function route; class CheckIfHasSchool { @@ -15,6 +18,11 @@ class CheckIfHasSchool */ public function handle(Request $request, Closure $next): Response { - return $next($request); + if (Auth::check() && Auth::user()->school_id) { + return $next($request); + } + + return redirect(route('dashboard'))->with('error', 'You do not have a school to view students for.'); + } } diff --git a/app/Models/Audition.php b/app/Models/Audition.php index 66be60c..175c053 100644 --- a/app/Models/Audition.php +++ b/app/Models/Audition.php @@ -10,8 +10,6 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; -use function now; - class Audition extends Model { use HasFactory; @@ -26,7 +24,6 @@ class Audition extends Model protected $scored_entries_count; //Set by TabulationService - public function event(): BelongsTo { return $this->belongsTo(Event::class); @@ -175,12 +172,14 @@ class Audition extends Model } $this->flags()->create(['flag_name' => $flag]); + $this->load('flags'); } public function removeFlag($flag): void { // remove related auditionFlag where flag_name = $flag $this->flags()->where('flag_name', $flag)->delete(); + $this->load('flags'); } public function scopeOpen(Builder $query): void diff --git a/app/Policies/StudentPolicy.php b/app/Policies/StudentPolicy.php index ae8e619..5ac1cf4 100644 --- a/app/Policies/StudentPolicy.php +++ b/app/Policies/StudentPolicy.php @@ -5,7 +5,7 @@ namespace App\Policies; use App\Models\Entry; use App\Models\Student; use App\Models\User; -use Illuminate\Auth\Access\Response; + use function is_null; class StudentPolicy @@ -31,7 +31,10 @@ class StudentPolicy */ public function create(User $user): bool { - if($user->is_admin) return true; + if ($user->is_admin) { + return true; + } + return ! is_null($user->school_id); } @@ -41,7 +44,10 @@ class StudentPolicy public function update(User $user, Student $student): bool { - if($user->is_admin) return true; + if ($user->is_admin) { + return true; + } + return $user->school_id == $student->school_id; } @@ -50,7 +56,10 @@ class StudentPolicy */ public function delete(User $user, Student $student): bool { - if (Entry::where('student_id','=',$student->id)->exists()) return false; // Don't allow deletion of a student with entries + if (Entry::where('student_id', '=', $student->id)->exists()) { + return false; + } // Don't allow deletion of a student with entries + return $user->school_id == $student->school_id; } diff --git a/app/Rules/UniqueFullNameAtSchool.php b/app/Rules/UniqueFullNameAtSchool.php index f67a8aa..29e78ad 100644 --- a/app/Rules/UniqueFullNameAtSchool.php +++ b/app/Rules/UniqueFullNameAtSchool.php @@ -19,7 +19,7 @@ class UniqueFullNameAtSchool implements ValidationRule $this->school_id = $schoolID; } - public function passes($attributies, $value) + public function studentExists() { return Student::where('first_name', $this->first_name) ->where('last_name', $this->last_name) @@ -38,6 +38,8 @@ class UniqueFullNameAtSchool implements ValidationRule */ public function validate(string $attribute, mixed $value, Closure $fail): void { - // + if($this->studentExists()) { + $fail($this->message()); + } } } diff --git a/database/factories/AuditionFactory.php b/database/factories/AuditionFactory.php index 4cefeff..494a378 100644 --- a/database/factories/AuditionFactory.php +++ b/database/factories/AuditionFactory.php @@ -41,7 +41,7 @@ class AuditionFactory extends Factory return [ 'event_id' => $event->id, - 'name' => $this->faker->randomElement($instruments).$this->faker->randomNumber(1), + 'name' => $this->faker->randomElement($instruments).$this->faker->randomNumber(3), 'score_order' => 1, 'entry_deadline' => Carbon::tomorrow(), 'entry_fee' => 1000, diff --git a/database/factories/RoomFactory.php b/database/factories/RoomFactory.php index de64aad..46acabf 100644 --- a/database/factories/RoomFactory.php +++ b/database/factories/RoomFactory.php @@ -17,8 +17,8 @@ class RoomFactory extends Factory public function definition(): array { return [ - 'name' => 'Room ' . fake()->numberBetween(7,500), - 'description' => fake()->sentence() + 'name' => 'Room '.fake()->numberBetween(7, 500), + 'description' => fake()->sentence(), ]; } } diff --git a/database/factories/ScoringGuideFactory.php b/database/factories/ScoringGuideFactory.php index 11339b3..9efa3d0 100644 --- a/database/factories/ScoringGuideFactory.php +++ b/database/factories/ScoringGuideFactory.php @@ -17,7 +17,7 @@ class ScoringGuideFactory extends Factory public function definition(): array { return [ - // + 'name' => $this->faker->sentence(3), ]; } } diff --git a/database/seeders/SampleSettingsSeeder.php b/database/seeders/SampleSettingsSeeder.php index 254eced..26090a6 100644 --- a/database/seeders/SampleSettingsSeeder.php +++ b/database/seeders/SampleSettingsSeeder.php @@ -6,7 +6,7 @@ use App\Models\SiteSetting; use Illuminate\Database\Console\Seeds\WithoutModelEvents; use Illuminate\Database\Seeder; -class SampleSettings extends Seeder +class SampleSettingsSeeder extends Seeder { /** * Run the database seeds. @@ -55,10 +55,6 @@ class SampleSettings extends Seeder ]); SiteSetting::create([ 'setting_key' => 'school_fee', - 'setting_value' => 'SBDA', - ]); - SiteSetting::create([ - 'setting_key' => 'auditionAbbreviation', 'setting_value' => '2500', ]); SiteSetting::create([ @@ -66,12 +62,16 @@ class SampleSettings extends Seeder 'setting_value' => '143 Sousa Lane', ]); SiteSetting::create([ - 'setting_key' => 'auditionAbbreviation', - 'setting_value' => 'SBDA', + 'setting_key' => 'payment_city', + 'setting_value' => 'Maud', ]); SiteSetting::create([ - 'setting_key' => 'auditionAbbreviation', - 'setting_value' => 'SBDA', + 'setting_key' => 'payment_state', + 'setting_value' => 'OK', + ]); + SiteSetting::create([ + 'setting_key' => 'payment_zip', + 'setting_value' => '77777', ]); } } diff --git a/resources/views/components/layout/navbar/menus/admin.blade.php b/resources/views/components/layout/navbar/menus/admin.blade.php index 21bc4b5..c0430d2 100644 --- a/resources/views/components/layout/navbar/menus/admin.blade.php +++ b/resources/views/components/layout/navbar/menus/admin.blade.php @@ -2,7 +2,7 @@ {{--