215 lines
9.2 KiB
PHP
215 lines
9.2 KiB
PHP
<?php
|
|
|
|
use App\Models\Audition;
|
|
use App\Models\Ensemble;
|
|
use App\Models\Entry;
|
|
use App\Models\PrelimDefinition;
|
|
use App\Models\Room;
|
|
use App\Models\ScoringGuide;
|
|
use App\Models\Seat;
|
|
use App\Models\SeatingLimit;
|
|
use App\Models\SubscoreDefinition;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
beforeEach(function () {
|
|
$this->audition = Audition::factory()->create(['entry_fee' => 2000]);
|
|
});
|
|
|
|
it('can return its event', function () {
|
|
expect($this->audition->event)->toBeInstanceOf(App\Models\Event::class);
|
|
});
|
|
|
|
it('can return its entries', function () {
|
|
Entry::factory()->count(5)->create(['audition_id' => $this->audition->id]);
|
|
expect($this->audition->entries)->toBeInstanceOf(Illuminate\Database\Eloquent\Collection::class)
|
|
->and($this->audition->entries->count())->toBeGreaterThan(0)
|
|
->and($this->audition->entries->first())->toBeInstanceOf(App\Models\Entry::class);
|
|
});
|
|
|
|
it('can return its unscored entries', function () {
|
|
$entries = Entry::factory()->count(25)->create(['audition_id' => $this->audition->id]);
|
|
DB::table('entry_total_scores')->insert([
|
|
'entry_id' => $entries[0]->id,
|
|
'seating_total' => 10,
|
|
'advancement_total' => 10,
|
|
'seating_subscore_totals' => json_encode([5, 5]),
|
|
'advancement_subscore_totals' => json_encode([5, 5]),
|
|
]);
|
|
$entries[1]->addFlag('no_show');
|
|
$entries[2]->addFlag('failed_prelim');
|
|
expect($this->audition->unscoredEntries)->toBeInstanceOf(Illuminate\Database\Eloquent\Collection::class)
|
|
->and($this->audition->unscoredEntries->count())->toBe(22)
|
|
->and($this->audition->unscoredEntries->first())->toBeInstanceOf(App\Models\Entry::class)
|
|
->and($this->audition->unscoredEntries->doesntContain($entries[0]))->toBeTrue()
|
|
->and($this->audition->unscoredEntries->doesntContain($entries[1]))->toBeTrue()
|
|
->and($this->audition->unscoredEntries->doesntContain($entries[2]))->toBeTrue()
|
|
->and($this->audition->unscoredEntries->contains($entries[12]))->toBeTrue()
|
|
->and($this->audition->unscoredEntries->contains($entries[8]))->toBeTrue();
|
|
});
|
|
|
|
it('can return its room if one is set', function () {
|
|
expect($this->audition->room)->toBeNull();
|
|
$room = Room::factory()->create();
|
|
$this->audition->room()->associate($room);
|
|
$this->audition->save();
|
|
expect($this->audition->room)->toBeInstanceOf(App\Models\Room::class);
|
|
});
|
|
|
|
it('can return its scoring guide if one is set', function () {
|
|
expect($this->audition->scoringGuide)->toBeNull();
|
|
$guide = App\Models\ScoringGuide::factory()->create();
|
|
$this->audition->scoringGuide()->associate($guide);
|
|
$this->audition->save();
|
|
expect($this->audition->scoringGuide)->toBeInstanceOf(App\Models\ScoringGuide::class);
|
|
});
|
|
|
|
it('can return the subscore definitions for its scoring guide if one is set', function () {
|
|
expect($this->audition->scoringGuide)->toBeNull();
|
|
$guide = ScoringGuide::factory()->create();
|
|
$subscores = SubscoreDefinition::orderBy('display_order')->get();
|
|
$n = 1;
|
|
foreach ($subscores as $subscore) {
|
|
$subscore->update(['display_order' => $n]);
|
|
$n++;
|
|
}
|
|
$subscores[0]->update(['for_seating' => 0]);
|
|
$subscores[4]->update(['for_advance' => 0]);
|
|
$this->audition->scoringGuide()->associate($guide);
|
|
$this->audition->save();
|
|
expect($this->audition->scoringGuide)->toBeInstanceOf(ScoringGuide::class)
|
|
->and($this->audition->getSeatingSubscores()->contains('id', $subscores[0]->id))->toBeFalse()
|
|
->and($this->audition->getSeatingSubscores()->contains('id', $subscores[1]->id))->toBeTrue()
|
|
->and($this->audition->getSeatingSubscores()->contains('id', $subscores[2]->id))->toBeTrue()
|
|
->and($this->audition->getSeatingSubscores()->contains('id', $subscores[3]->id))->toBeTrue()
|
|
->and($this->audition->getSeatingSubscores()->contains('id', $subscores[4]->id))->toBeTrue()
|
|
->and($this->audition->getAdvancementSubscores()->contains('id', $subscores[4]->id))->toBeFalse()
|
|
->and($this->audition->getAdvancementSubscores()->contains('id', $subscores[3]->id))->toBeTrue()
|
|
->and($this->audition->getAdvancementSubscores()->contains('id', $subscores[2]->id))->toBeTrue()
|
|
->and($this->audition->getAdvancementSubscores()->contains('id', $subscores[1]->id))->toBeTrue()
|
|
->and($this->audition->getAdvancementSubscores()->contains('id', $subscores[0]->id))->toBeTrue();
|
|
|
|
});
|
|
|
|
it('can return its bonus score definition if one is set', function () {
|
|
expect($this->audition->bonusScore()->count())->toBe(0);
|
|
$definition = App\Models\BonusScoreDefinition::factory()->create();
|
|
$this->audition->bonusScore()->attach($definition);
|
|
$this->audition->save();
|
|
expect($this->audition->bonusScore->first())->toBeInstanceOf(App\Models\BonusScoreDefinition::class);
|
|
});
|
|
|
|
it('can return its seating limits if any are set', function () {
|
|
$we = Ensemble::create([
|
|
'code' => 'we',
|
|
'name' => 'Wind Ensemble',
|
|
'event_id' => $this->audition->event_id,
|
|
'rank' => 1,
|
|
]);
|
|
$alt = Ensemble::create([
|
|
'code' => 'alt',
|
|
'name' => 'Alternates',
|
|
'event_id' => $this->audition->event_id,
|
|
'rank' => 2,
|
|
]);
|
|
expect($this->audition->seatingLimits()->count())->toBe(0);
|
|
SeatingLimit::create(['ensemble_id' => $we->id, 'audition_id' => $this->audition->id, 'maximum_accepted' => 8]);
|
|
SeatingLimit::create(['ensemble_id' => $alt->id, 'audition_id' => $this->audition->id, 'maximum_accepted' => 2]);
|
|
expect($this->audition->seatingLimits()->count())->toBe(2)
|
|
->and($this->audition->seatingLimits->first())->toBeInstanceOf(App\Models\SeatingLimit::class)
|
|
->and($this->audition->seatingLimits->first()->maximum_accepted)->toBe(8)
|
|
->and($this->audition->seatingLimits->first()->ensemble->name)->toBe('Wind Ensemble');
|
|
});
|
|
|
|
it('returns entry fee in currency format', function () {
|
|
expect($this->audition->display_fee())->toBe('$20.00');
|
|
});
|
|
|
|
it('can return its judges', function () {
|
|
expect($this->audition->judges()->count())->toBe(0);
|
|
$room = Room::factory()->create();
|
|
$this->audition->room()->associate($room);
|
|
$this->audition->save();
|
|
$judge = App\Models\User::factory()->create();
|
|
$room->judges()->attach($judge);
|
|
expect($this->audition->judges()->count())->toBe(1)
|
|
->and($this->audition->judges->first())->toBeInstanceOf(App\Models\User::class);
|
|
});
|
|
|
|
it('can return a count of judges', function () {
|
|
expect($this->audition->judges()->count())->toBe(0);
|
|
$room = Room::factory()->create();
|
|
$this->audition->room()->associate($room);
|
|
$this->audition->save();
|
|
$judge = App\Models\User::factory()->create();
|
|
$room->judges()->attach($judge);
|
|
expect($this->audition->judges_count)->toBe(1);
|
|
});
|
|
|
|
it('can return all of its flags', function () {
|
|
expect($this->audition->flags()->count())->toBe(0);
|
|
$this->audition->addFlag('seats_published');
|
|
$this->audition->addFlag('advancement_published');
|
|
$this->audition->refresh();
|
|
expect($this->audition->flags()->count())->toBe(2);
|
|
});
|
|
|
|
it('can check for a specific flag', function () {
|
|
expect($this->audition->flags()->count())->toBe(0);
|
|
$this->audition->addFlag('seats_published');
|
|
$this->audition->refresh();
|
|
expect($this->audition->hasFlag('seats_published'))->toBeTrue()
|
|
->and($this->audition->hasFlag('advancement_published'))->toBeFalse();
|
|
});
|
|
|
|
it('can remove a flag', function () {
|
|
expect($this->audition->flags()->count())->toBe(0);
|
|
$this->audition->addFlag('seats_published');
|
|
$this->audition->refresh();
|
|
expect($this->audition->hasFlag('seats_published'))->toBeTrue();
|
|
$this->audition->removeFlag('seats_published');
|
|
$this->audition->refresh();
|
|
expect($this->audition->hasFlag('seats_published'))->toBeFalse();
|
|
});
|
|
|
|
it('will not add a flag that already exists', function () {
|
|
expect($this->audition->flags()->count())->toBe(0);
|
|
$this->audition->addFlag('seats_published');
|
|
$this->audition->refresh();
|
|
expect($this->audition->hasFlag('seats_published'))->toBeTrue();
|
|
$this->audition->addFlag('seats_published');
|
|
expect($this->audition->flags()->count())->toBe(1);
|
|
});
|
|
|
|
it('can return its seats if any exits', function () {
|
|
expect($this->audition->seats()->count())->toBe(0);
|
|
$ensemble = Ensemble::factory()->create();
|
|
$entries = Entry::factory()->count(5)->create(['audition_id' => $this->audition->id]);
|
|
$n = 1;
|
|
foreach ($entries as $entry) {
|
|
Seat::create([
|
|
'ensemble_id' => $ensemble->id,
|
|
'audition_id' => $this->audition->id,
|
|
'entry_id' => $entry->id,
|
|
'seat' => $n,
|
|
]);
|
|
$n++;
|
|
}
|
|
expect($this->audition->seats()->count())->toBe(5)
|
|
->and($this->audition->seats->first())->toBeInstanceOf(Seat::class);
|
|
});
|
|
|
|
it('returns null if a prelim definition is requested and none exists', function () {
|
|
expect($this->audition->prelimDefinition)->toBeNull();
|
|
});
|
|
|
|
it('can return its prelim definition if one exists', function () {
|
|
|
|
$prelimDefinition = PrelimDefinition::create([
|
|
'audition_id' => $this->audition->id,
|
|
'passing_score' => 72,
|
|
]);
|
|
expect($this->audition->prelimDefinition->passing_score)->toEqual(72);
|
|
});
|