diff --git a/app/Http/Controllers/StudentController.php b/app/Http/Controllers/StudentController.php index f4d1186..ab9ff78 100644 --- a/app/Http/Controllers/StudentController.php +++ b/app/Http/Controllers/StudentController.php @@ -23,7 +23,7 @@ class StudentController extends Controller if (! Auth::user()->school_id) { return redirect()->route('dashboard'); } - $students = Auth::user()->students()->with('entries')->get(); + $students = Auth::user()->students()->withCount('entries')->get(); $auditions = Audition::all(); return view('students.index', ['students' => $students, 'auditions' => $auditions]); @@ -121,6 +121,6 @@ class StudentController extends Controller } $student->delete(); - return redirect('/students'); + return redirect(route('students.index')); } } diff --git a/app/Observers/StudentObserver.php b/app/Observers/StudentObserver.php index d9af204..8cec44c 100644 --- a/app/Observers/StudentObserver.php +++ b/app/Observers/StudentObserver.php @@ -21,8 +21,7 @@ class StudentObserver */ public function updated(Student $student): void { - AuditionChange::dispatch(); - EntryChange::dispatch(); + // } /** @@ -30,7 +29,7 @@ class StudentObserver */ public function deleted(Student $student): void { - AuditionChange::dispatch(); + // } /** diff --git a/resources/views/students/index.blade.php b/resources/views/students/index.blade.php index 6442743..4e195e0 100644 --- a/resources/views/students/index.blade.php +++ b/resources/views/students/index.blade.php @@ -6,7 +6,7 @@ Add Student - + @@ -46,10 +46,10 @@ {{ $student->full_name(true) }} {{ $student->grade }} - {{ $student->entries->count() }} + {{ $student->entries_count }} - @if( $student->entries->count() > 0) -
+ @if( $student->entries_count === 0) + @csrf @method('DELETE') | @endif - Edit + Edit @endforeach diff --git a/tests/Feature/Pages/StudentsIndexTest.php b/tests/Feature/Pages/StudentsIndexTest.php index 9e8ab04..0324afc 100644 --- a/tests/Feature/Pages/StudentsIndexTest.php +++ b/tests/Feature/Pages/StudentsIndexTest.php @@ -1,10 +1,12 @@ assertSessionHasErrors('last_name'); }); + +it('shows a delete link only if the student has no entries', function () { + // Arrange + $school = School::factory()->create(); + $user = User::factory()->create([ + 'school_id' => $school->id, + ]); + $studentWithNoEntries = Student::factory()->create([ + 'school_id' => $school->id, + ]); + $studentWithEntries = Student::factory()->create([ + 'school_id' => $school->id, + ]); + Entry::factory()->create([ + 'student_id' => $studentWithEntries->id, + ]); + // Act & Assert + $this->actingAs($user); + get(route('students.index')) + ->assertSee(route('students.destroy', $studentWithNoEntries)) + ->assertDontSeeText(route('students.destroy', $studentWithEntries)); +}); + +it('shows an edit link for each student', function () { + // Arrange + $school = School::factory()->create(); + $user = User::factory()->create([ + 'school_id' => $school->id, + ]); + $students = Student::factory(3)->create([ + 'school_id' => $school->id, + ]); + // Act & Assert + foreach ($students as $student) { + $this->actingAs($user); + get(route('students.index')) + ->assertSee(route('students.edit', $student)); + } + +}); + +it('deletes a student with no entries', function () { + // Arrange + $school = School::factory()->create(); + $user = User::factory()->create([ + 'school_id' => $school->id, + ]); + $student = Student::factory()->create([ + 'school_id' => $school->id, + 'first_name' => 'John Jacob', + ]); + + // Act & Assert + $this->actingAs($user); + get(route('students.index')) + ->assertSee('John Jacob'); + + expect($student->exists())->toBeTrue(); + + delete(route('students.destroy', $student)) + ->assertSessionHasNoErrors() + ->assertRedirect(route('students.index')); + + expect($student->exists())->toBeFalse(); + + get(route('students.index')) + ->assertOk() + ->assertDontSee('John Jacob'); +}); + +it('will not delete a student from another school', function () { + // Arrange + $school = School::factory()->create(); + $user = User::factory()->create([ + 'school_id' => $school->id, + ]); + $student = Student::factory()->create([ + 'first_name' => 'John Jacob', + ]); + // Act & Assert + expect($student->exists())->toBeTrue(); + + $this->actingAs($user); + get(route('students.index')) + ->assertOk() + ->assertDontSee('John Jacob'); + + delete(route('students.destroy', $student)) + ->assertStatus(403); + + expect($student->exists())->toBeTrue(); +});