128 lines
5.9 KiB
PHP
128 lines
5.9 KiB
PHP
<?php
|
|
|
|
/** @noinspection PhpUnhandledExceptionInspection */
|
|
|
|
use App\Actions\Tabulation\EnterScore;
|
|
use App\Exceptions\AuditionAdminException;
|
|
use App\Models\Audition;
|
|
use App\Models\Entry;
|
|
use App\Models\ScoreSheet;
|
|
use App\Models\SubscoreDefinition;
|
|
use App\Models\User;
|
|
use Database\Seeders\AuditionWithScoringGuideAndRoom;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
beforeEach(function () {
|
|
(new AuditionWithScoringGuideAndRoom)->run();
|
|
SubscoreDefinition::where('id', '<', 900)->delete();
|
|
$this->audition = Audition::first();
|
|
$this->judge1 = User::factory()->create();
|
|
$this->judge2 = User::factory()->create();
|
|
$this->audition->judges()->attach([$this->judge1->id, $this->judge2->id]);
|
|
$this->entry1 = Entry::factory()->create(['audition_id' => $this->audition->id]);
|
|
$this->entry2 = Entry::factory()->create(['audition_id' => $this->audition->id]);
|
|
$this->scribe = app(EnterScore::class);
|
|
$this->possibleScoreArray = [
|
|
1001 => 10,
|
|
1002 => 11,
|
|
1003 => 12,
|
|
1004 => 13,
|
|
1005 => 14,
|
|
];
|
|
$this->anotherPossibleScoreArray = [
|
|
1001 => 20,
|
|
1002 => 21,
|
|
1003 => 22,
|
|
1004 => 23,
|
|
1005 => 24,
|
|
];
|
|
});
|
|
|
|
it('can enter a score', function () {
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
expect($this->entry1->scoreSheets()->count())->toBe(1)
|
|
->and($this->entry1->scoreSheets()->first()->seating_total)->toBe(11.875)
|
|
->and($this->entry1->scoreSheets()->first()->advancement_total)->toBe(12.375);
|
|
});
|
|
|
|
it('will not enter a score for a judge that does not exist', function () {
|
|
$fakeJudge = User::factory()->make();
|
|
($this->scribe)($fakeJudge, $this->entry1, $this->possibleScoreArray);
|
|
})->throws(AuditionAdminException::class, 'User does not exist');
|
|
|
|
it('will not enter a score for an entry that does not exist', function () {
|
|
$fakeEntry = Entry::factory()->make();
|
|
($this->scribe)($this->judge1, $fakeEntry, $this->possibleScoreArray);
|
|
})->throws(AuditionAdminException::class, 'Entry does not exist');
|
|
|
|
it('will not score an entry if the audition seats are published', function () {
|
|
$this->audition->addFlag('seats_published');
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
})->throws(AuditionAdminException::class, 'Cannot score an entry in an audition where seats are published');
|
|
|
|
it('will not score an entry if the audition advancement is published', function () {
|
|
$this->audition->addFlag('advancement_published');
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
})->throws(AuditionAdminException::class, 'Cannot score an entry in an audition where advancement is published');
|
|
|
|
it('will not score an entry if the judge is not assigned to judge the entry', function () {
|
|
$fakeJudge = User::factory()->create();
|
|
($this->scribe)($fakeJudge, $this->entry1, $this->possibleScoreArray);
|
|
})->throws(AuditionAdminException::class, 'This judge is not assigned to judge this entry');
|
|
|
|
it('can modify an existing score sheet', function () {
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
$scoreSheet = ScoreSheet::first();
|
|
($this->scribe)($this->judge1, $this->entry1, $this->anotherPossibleScoreArray, $scoreSheet);
|
|
expect($this->entry1->scoreSheets()->count())->toBe(1)
|
|
->and($this->entry1->scoreSheets()->first()->seating_total)->toBe(21.875)
|
|
->and($this->entry1->scoreSheets()->first()->advancement_total)->toBe(22.375);
|
|
});
|
|
|
|
it('will not change the judge on a score sheet', function () {
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
$scoreSheet = ScoreSheet::first();
|
|
($this->scribe)($this->judge2, $this->entry1, $this->anotherPossibleScoreArray, $scoreSheet);
|
|
})->throws(AuditionAdminException::class, 'Existing score sheet is from a different judge');
|
|
|
|
it('will not accept a second score sheet for a judge ane entry', function () {
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
($this->scribe)($this->judge1, $this->entry1, $this->anotherPossibleScoreArray);
|
|
})->throws(AuditionAdminException::class, 'That judge has already entered scores for that entry');
|
|
|
|
it('will not change the entry on a score sheet', function () {
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
$scoreSheet = ScoreSheet::first();
|
|
($this->scribe)($this->judge1, $this->entry2, $this->anotherPossibleScoreArray, $scoreSheet);
|
|
})->throws(AuditionAdminException::class, 'Existing score sheet is for a different entry');
|
|
|
|
it('will not accept an incorrect number of subscores', function () {
|
|
array_pop($this->possibleScoreArray);
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
})->throws(AuditionAdminException::class, 'Invalid number of scores');
|
|
|
|
it('will not accept an invalid subscores', function () {
|
|
array_pop($this->possibleScoreArray);
|
|
$this->possibleScoreArray[3001] = 100;
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
})->throws(AuditionAdminException::class, 'Invalid Score Submission');
|
|
|
|
it('will. not accept a subscore in excess of its maximum', function () {
|
|
$this->possibleScoreArray[1001] = 1500;
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
})->throws(AuditionAdminException::class, 'Supplied subscore exceeds maximum allowed');
|
|
|
|
it('removes a no-show flag from an entry', function () {
|
|
$this->entry1->addFlag('no_show');
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
expect($this->entry1->hasFlag('no_show'))->toBeFalse();
|
|
});
|
|
|
|
it('logs score entry', function () {
|
|
($this->scribe)($this->judge1, $this->entry1, $this->possibleScoreArray);
|
|
$logEntry = \App\Models\AuditLogEntry::latest()->first();
|
|
expect($logEntry->message)->toStartWith('Entered Score for entry id ');
|
|
});
|