diff --git a/app/Models/Audition.php b/app/Models/Audition.php index 6c86d5f..9ae5c8a 100644 --- a/app/Models/Audition.php +++ b/app/Models/Audition.php @@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Support\Collection; use function in_array; @@ -165,6 +166,11 @@ class Audition extends Model return $this->hasMany(Seat::class); } + public function prelimDefinition(): HasOne + { + return $this->hasOne(PrelimDefinition::class); + } + /** * @codeCoverageIgnoreStart */ diff --git a/app/Models/prelim_definition.php b/app/Models/PrelimDefinition.php similarity index 94% rename from app/Models/prelim_definition.php rename to app/Models/PrelimDefinition.php index 07480b3..dfa7f47 100644 --- a/app/Models/prelim_definition.php +++ b/app/Models/PrelimDefinition.php @@ -5,7 +5,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -class prelim_definition extends Model +class PrelimDefinition extends Model { protected $fillable = [ 'audition_id', diff --git a/database/migrations/2025_09_11_141701_create_prelim_definitions_table.php b/database/migrations/2025_09_11_141701_create_prelim_definitions_table.php index b374410..fbb61a6 100644 --- a/database/migrations/2025_09_11_141701_create_prelim_definitions_table.php +++ b/database/migrations/2025_09_11_141701_create_prelim_definitions_table.php @@ -13,7 +13,7 @@ return new class extends Migration { Schema::create('prelim_definitions', function (Blueprint $table) { $table->id(); - $table->foreignIdFor(Audition::class)->constrained()->cascadeOnDelete()->cascadeOnUpdate(); + $table->foreignIdFor(Audition::class)->unique()->constrained()->cascadeOnDelete()->cascadeOnUpdate(); $table->foreignIdFor(Room::class)->nullable()->constrained()->nullOnDelete()->cascadeOnUpdate(); $table->integer('order_in_room')->nullable(); $table->foreignIdFor(ScoringGuide::class)->nullable()->constrained()->nullOnDelete()->cascadeOnUpdate(); diff --git a/tests/Feature/app/Models/AuditionTest.php b/tests/Feature/app/Models/AuditionTest.php index 786dc1b..9c7346c 100644 --- a/tests/Feature/app/Models/AuditionTest.php +++ b/tests/Feature/app/Models/AuditionTest.php @@ -3,6 +3,7 @@ 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; @@ -198,3 +199,16 @@ it('can return its seats if any exits', function () { 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); +}); diff --git a/tests/Feature/app/Models/PrelimDefinitionTest.php b/tests/Feature/app/Models/PrelimDefinitionTest.php new file mode 100644 index 0000000..27c10cf --- /dev/null +++ b/tests/Feature/app/Models/PrelimDefinitionTest.php @@ -0,0 +1,41 @@ +audition = Audition::factory()->create(); + $this->prelim = PrelimDefinition::create([ + 'audition_id' => $this->audition->id, + 'passing_score' => 80, + ]); +}); + +it('can provide its audition', function () { + expect($this->prelim->audition->name)->toEqual($this->audition->name); +}); + +it('can return its room if one is set', function () { + $room = Room::factory()->create(); + $this->prelim->room()->associate($room); + expect($this->prelim->room->name)->toEqual($room->name); +}); + +it('returns null if no room is set', function () { + expect($this->prelim->room)->toBeNull(); +}); + +it('returns its scoring guide if one is set', function () { + $guide = ScoringGuide::factory()->create(); + $this->prelim->scoringGuide()->associate($guide); + expect($this->prelim->scoringGuide->name)->toEqual($guide->name); +}); + +it('returns null if no scoring guide is set', function () { + expect($this->prelim->scoringGuide)->toBeNull(); +});