doublerService = App::make(DoublerService::class); }); it('throws an error if an invalid event is provided', function () { $event = Event::factory()->make(); $this->doublerService->doublersForEvent($event); })->throws(TabulationException::class, 'Invalid event provided'); it('returns doublers for an event', function () { $concertEvent = Event::factory()->create(['name' => 'Concert Band', 'id' => 1000]); $jazzEvent = Event::factory()->create(['name' => 'Jazz Band', 'id' => 1001]); Audition::factory()->create([ 'event_id' => 1000, 'name' => 'Alto Sax', 'minimum_grade' => 7, 'maximum_grade' => 12, 'id' => 1000, ]); Audition::factory()->create([ 'event_id' => 1000, 'name' => 'Tenor Sax', 'minimum_grade' => 7, 'maximum_grade' => 12, 'id' => 1001, ]); Audition::factory()->create([ 'event_id' => 1000, 'name' => 'Baritone Sax', 'minimum_grade' => 7, 'maximum_grade' => 12, 'id' => 1002, ]); Audition::factory()->create([ 'event_id' => 1000, 'name' => 'Clarinet', 'minimum_grade' => 7, 'maximum_grade' => 12, 'id' => 1003, ]); Audition::factory()->create([ 'event_id' => 1000, 'name' => 'Bass Clarinet', 'minimum_grade' => 7, 'maximum_grade' => 12, 'id' => 1004, ]); Audition::factory()->create([ 'event_id' => 1001, 'name' => 'Jazz Alto', 'minimum_grade' => 7, 'maximum_grade' => 12, 'id' => 1005, ]); Audition::factory()->create([ 'event_id' => 1001, 'name' => 'Jazz Tenor', 'minimum_grade' => 7, 'maximum_grade' => 12, 'id' => 1006, ]); Audition::factory()->create([ 'event_id' => 1001, 'name' => 'Jazz Baritone', 'minimum_grade' => 7, 'maximum_grade' => 12, 'id' => 1007, ]); $allSaxDude = Student::factory()->create(['grade' => 11, 'id' => 1000]); Student::factory()->create(['grade' => 9, 'id' => 1001]); Student::factory()->create(['grade' => 9, 'id' => 1002]); Entry::create(['student_id' => 1000, 'audition_id' => 1000]); Entry::create(['student_id' => 1000, 'audition_id' => 1001]); Entry::create(['student_id' => 1000, 'audition_id' => 1002]); Entry::create(['student_id' => 1000, 'audition_id' => 1005]); Entry::create(['student_id' => 1000, 'audition_id' => 1006]); Entry::create(['student_id' => 1000, 'audition_id' => 1007]); Entry::create(['student_id' => 1001, 'audition_id' => 1003]); Entry::create(['student_id' => 1001, 'audition_id' => 1004]); Entry::create(['student_id' => 1002, 'audition_id' => 1000]); Entry::create(['student_id' => 1002, 'audition_id' => 1005]); $return = $this->doublerService->doublersForEvent($concertEvent); expect(count($return))->toBe(2) ->and($return[1000]['student_id'])->toBe($allSaxDude->id) ->and($return[1000]['entries']->count())->toBe(3) ->and($return[1001]['entries']->count())->toBe(2); assertArrayNotHasKey(1002, $return); $return = $this->doublerService->doublersForEvent($jazzEvent); expect(count($return))->toBe(1) ->and($return[1000]['student_id'])->toBe($allSaxDude->id) ->and($return[1000]['entries']->count())->toBe(3); });