From 69a2df6d6d413aaec7a54696a305e3f97c75cc40 Mon Sep 17 00:00:00 2001 From: Matt Young Date: Mon, 30 Jun 2025 15:35:47 -0500 Subject: [PATCH] Create app/actions/CreateEntriesTest --- .../app/Actions/Entries/CreateEntriesTest.php | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 tests/Feature/app/Actions/Entries/CreateEntriesTest.php diff --git a/tests/Feature/app/Actions/Entries/CreateEntriesTest.php b/tests/Feature/app/Actions/Entries/CreateEntriesTest.php new file mode 100644 index 0000000..1ba766c --- /dev/null +++ b/tests/Feature/app/Actions/Entries/CreateEntriesTest.php @@ -0,0 +1,138 @@ +scribe = app(CreateEntry::class); +}); + +it('can create an entry', function () { + $student = Student::factory()->create(['grade' => 9]); + $audition = Audition::factory()->create(['minimum_grade' => 9, 'maximum_grade' => 12]); + $this->scribe->createEntry($student, $audition); + $thisEntry = Entry::where('student_id', $student->id)->first(); + + expect($thisEntry)->toBeInstanceOf(Entry::class); +}); + +it('defaults to entering seating and advancement', function () { + $student = Student::factory()->create(['grade' => 9]); + $audition = Audition::factory()->create(['minimum_grade' => 9, 'maximum_grade' => 12]); + $this->scribe->createEntry($student, $audition); + $thisEntry = Entry::where('student_id', $student->id)->first(); + + expect($thisEntry->for_seating)->toBeTruthy() + ->and($thisEntry->for_advancement)->toBeTruthy(); +}); + +it('allows setting only seating', function () { + $student = Student::factory()->create(['grade' => 9]); + $audition = Audition::factory()->create(['minimum_grade' => 9, 'maximum_grade' => 12]); + $this->scribe->createEntry($student, $audition, 'seating'); + $thisEntry = Entry::where('student_id', $student->id)->first(); + + expect($thisEntry->for_seating)->toBeTruthy() + ->and($thisEntry->for_advancement)->toBeFalsy(); +}); + +test('allows setting only advancement', function () { + $student = Student::factory()->create(['grade' => 9]); + $audition = Audition::factory()->create(['minimum_grade' => 9, 'maximum_grade' => 12]); + $this->scribe->createEntry($student, $audition, 'advancement'); + $thisEntry = Entry::where('student_id', $student->id)->first(); + + expect($thisEntry->for_seating)->toBeFalsy() + ->and($thisEntry->for_advancement)->toBeTruthy(); +}); + +it('does not assign a draw number if the audition is not drawn', function () { + $student = Student::factory()->create(['grade' => 9]); + $audition = Audition::factory()->create(['minimum_grade' => 9, 'maximum_grade' => 12]); + $this->scribe->createEntry($student, $audition); + $thisEntry = Entry::where('student_id', $student->id)->first(); + + expect($thisEntry->draw_number)->toBeNull(); +}); + +it('assigns the next available draw number if the audition is drawn', function () { + $audition = Audition::factory() + ->has(Entry::factory()->count(5)) + ->create(['minimum_grade' => 9, 'maximum_grade' => 12]); + AuditionFlag::create(['audition_id' => $audition->id, 'flag_name' => 'drawn']); + $n = 1; + foreach ($audition->entries as $entry) { + $entry->update(['draw_number' => $n]); + $n++; + } + $student = Student::factory()->create(['grade' => 9]); + $this->scribe->createEntry($student, $audition); + $thisEntry = Entry::where('student_id', $student->id)->first(); + expect($thisEntry->draw_number)->toEqual($n); +}); + +it('throws an exception if the audition seating is published', function () { + $audition = Audition::factory()->create(['minimum_grade' => 9, 'maximum_grade' => 12]); + AuditionFlag::create(['audition_id' => $audition->id, 'flag_name' => 'seats_published']); + $student = Student::factory()->create(['grade' => 9]); + $this->scribe->createEntry($student, $audition); +})->throws(AuditionAdminException::class, 'Cannot add an entry to an audition where seats are published'); + +it('throws an exception if the audition advancement is published', function () { + $audition = Audition::factory()->create(['minimum_grade' => 9, 'maximum_grade' => 12]); + AuditionFlag::create(['audition_id' => $audition->id, 'flag_name' => 'advancement_published']); + $student = Student::factory()->create(['grade' => 9]); + $this->scribe->createEntry($student, $audition); +})->throws(AuditionAdminException::class, 'Cannot add an entry to an audition where advancement is published'); + +it('throws an exception if the student does not exist', function () { + $audition = Audition::factory()->create(['minimum_grade' => 9, 'maximum_grade' => 12]); + $student = Student::factory()->make(['grade' => 9]); + $this->scribe->createEntry($student, $audition); +})->throws(AuditionAdminException::class, 'Invalid student provided'); + +it('throws an exception if the audition does not exist', function () { + $audition = Audition::factory()->make(['minimum_grade' => 9, 'maximum_grade' => 12]); + $student = Student::factory()->create(['grade' => 9]); + $this->scribe->createEntry($student, $audition); +})->throws(AuditionAdminException::class, 'Invalid audition provided'); + +it('throws an exception if the student is already entered in the audition', function () { + $og_entry = Entry::factory()->create(); + $this->scribe->createEntry($og_entry->student, $og_entry->audition); +})->throws(AuditionAdminException::class, 'That student is already entered in that audition'); + +it('throws and exception if the student is below the minimum grade for the audition', function () { + $student = Student::factory()->create(['grade' => 8]); + $audition = Audition::factory()->create(['minimum_grade' => 9, 'maximum_grade' => 12]); + $this->scribe->createEntry($student, $audition); +})->throws(AuditionAdminException::class, 'The grade of the student does not meet the minimum for that audition'); + +it('throws and exception if the student is above the maximum grade for the audition', function () { + $student = Student::factory()->create(['grade' => 12]); + $audition = Audition::factory()->create(['minimum_grade' => 9, 'maximum_grade' => 10]); + $this->scribe->createEntry($student, $audition); +})->throws(AuditionAdminException::class, 'The grade of the student exceeds the maximum for that audition'); + +it('logs the entry creation', function () { + actAsAdmin(); + $student = Student::factory()->create(['grade' => 9]); + $audition = Audition::factory()->create(['minimum_grade' => 9, 'maximum_grade' => 12]); + $this->scribe->createEntry($student, $audition); + $thisEntry = Entry::where('student_id', $student->id)->first(); + $logEntry = AuditLogEntry::first(); + expect($logEntry->message)->toEqual('Entered '.$thisEntry->student->full_name().' from '.$thisEntry->student->school->name.' in '.$audition->name.'.') + ->and($logEntry->affected['entries'])->toEqual([$thisEntry->id]) + ->and($logEntry->affected['students'])->toEqual([$thisEntry->student_id]) + ->and($logEntry->affected['auditions'])->toEqual([$thisEntry->audition_id]) + ->and($logEntry->affected['schools'])->toEqual([$thisEntry->student->school->id]) + ->and($logEntry->user)->toEqual(auth()->user()->email); +});