Implement enum for EntryFlags
This commit is contained in:
parent
a9fdc1a7f0
commit
a0913861fc
|
|
@ -0,0 +1,12 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Enums;
|
||||||
|
|
||||||
|
enum EntryFlags: string
|
||||||
|
{
|
||||||
|
case WILL_ADVANCE = 'will_advance';
|
||||||
|
case DECLINED = 'declined';
|
||||||
|
case NO_SHOW = 'no_show';
|
||||||
|
case FAILED_PRELIM = 'failed_prelim';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -83,7 +83,6 @@ class Audition extends Model
|
||||||
$flags[] = $checkFlag->flag_name->value;
|
$flags[] = $checkFlag->flag_name->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
// return true if any flag in $this->flags has a flag_name of declined without making another db query if flags are loaded
|
|
||||||
return in_array($flag, $flags);
|
return in_array($flag, $flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
|
use App\Enums\EntryFlags;
|
||||||
use Illuminate\Database\Eloquent\Builder;
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
@ -66,8 +67,12 @@ class Entry extends Model
|
||||||
|
|
||||||
public function hasFlag($flag): bool
|
public function hasFlag($flag): bool
|
||||||
{
|
{
|
||||||
// return true if any flag in $this->flags has a flag_name of declined without making another db query if flags are loaded
|
$flags = [];
|
||||||
return $this->flags->contains('flag_name', $flag);
|
foreach ($this->flags as $checkFlag) {
|
||||||
|
$flags[] = $checkFlag->flag_name->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return in_array($flag, $flags);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -76,7 +81,13 @@ class Entry extends Model
|
||||||
if ($this->hasFlag($flag)) {
|
if ($this->hasFlag($flag)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$this->flags()->create(['flag_name' => $flag]);
|
$enum = match ($flag) {
|
||||||
|
'will_advance' => EntryFlags::WILL_ADVANCE,
|
||||||
|
'declined' => EntryFlags::DECLINED,
|
||||||
|
'no_show' => EntryFlags::NO_SHOW,
|
||||||
|
'failed_prelim' => EntryFlags::FAILED_PRELIM,
|
||||||
|
};
|
||||||
|
$this->flags()->create(['flag_name' => $enum]);
|
||||||
$this->load('flags');
|
$this->load('flags');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -118,8 +129,8 @@ class Entry extends Model
|
||||||
{
|
{
|
||||||
$query->whereDoesntHave('flags', function (Builder $query) {
|
$query->whereDoesntHave('flags', function (Builder $query) {
|
||||||
$query->where('flag_name', 'declined')
|
$query->where('flag_name', 'declined')
|
||||||
->orWhere('flag_name', 'no-show')
|
->orWhere('flag_name', 'no_show')
|
||||||
->orWhere('flag_name', 'failed-prelim');
|
->orWhere('flag_name', 'failed_prelim');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
|
use App\Enums\EntryFlags;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
|
|
||||||
|
|
@ -9,8 +10,10 @@ class EntryFlag extends Model
|
||||||
{
|
{
|
||||||
protected $guarded = [];
|
protected $guarded = [];
|
||||||
|
|
||||||
// Possible flags include
|
protected $casts = [
|
||||||
// - declined: used if a doubler declines a seat in this audition. Checked by DoublerService
|
'flag_name' => EntryFlags::class,
|
||||||
|
];
|
||||||
|
|
||||||
public function entry(): BelongsTo
|
public function entry(): BelongsTo
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Entry::class);
|
return $this->belongsTo(Entry::class);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use App\Enums\EntryFlags;
|
||||||
use App\Models\Audition;
|
use App\Models\Audition;
|
||||||
use App\Models\Ensemble;
|
use App\Models\Ensemble;
|
||||||
use App\Models\Entry;
|
use App\Models\Entry;
|
||||||
|
|
@ -77,11 +78,11 @@ test('has advancement votes', function () {
|
||||||
it('can have flags and can check for a specific flag', function () {
|
it('can have flags and can check for a specific flag', function () {
|
||||||
// Arrange
|
// Arrange
|
||||||
$entry = Entry::factory()->create();
|
$entry = Entry::factory()->create();
|
||||||
EntryFlag::create(['entry_id' => $entry->id, 'flag_name' => 'declined']);
|
EntryFlag::create(['entry_id' => $entry->id, 'flag_name' => EntryFlags::DECLINED]);
|
||||||
EntryFlag::create(['entry_id' => $entry->id, 'flag_name' => 'no-show']);
|
EntryFlag::create(['entry_id' => $entry->id, 'flag_name' => EntryFlags::NO_SHOW]);
|
||||||
// Act & Assert
|
// Act & Assert
|
||||||
expect($entry->flags->count())->toBe(2)
|
expect($entry->flags->count())->toBe(2)
|
||||||
->and($entry->flags->first()->flag_name)->toBe('declined')
|
->and($entry->flags->first()->flag_name->value)->toBe('declined')
|
||||||
->and($entry->hasFlag('declined'))->toBeTrue()
|
->and($entry->hasFlag('declined'))->toBeTrue()
|
||||||
->and($entry->hasFlag('random'))->toBeFalse();
|
->and($entry->hasFlag('random'))->toBeFalse();
|
||||||
});
|
});
|
||||||
|
|
@ -90,15 +91,15 @@ it('can set and remove a flag', function () {
|
||||||
// Arrange
|
// Arrange
|
||||||
$entry = Entry::factory()->create();
|
$entry = Entry::factory()->create();
|
||||||
// Act
|
// Act
|
||||||
$entry->addFlag('Test Flag');
|
$entry->addFlag('declined');
|
||||||
$entry->addFlag('Second Flag');
|
$entry->addFlag('will_advance');
|
||||||
// Assert
|
// Assert
|
||||||
expect($entry->hasFlag('Test Flag'))->toBeTrue()
|
expect($entry->hasFlag('declined'))->toBeTrue()
|
||||||
->and($entry->hasFlag('Second Flag'))->toBeTrue()
|
->and($entry->hasFlag('will_advance'))->toBeTrue()
|
||||||
->and($entry->hasFlag('random'))->toBeFalse();
|
->and($entry->hasFlag('random'))->toBeFalse();
|
||||||
$entry->removeFlag('Test Flag');
|
$entry->removeFlag('declined');
|
||||||
expect($entry->hasFlag('Test Flag'))->toBeFalse()
|
expect($entry->hasFlag('declined'))->toBeFalse()
|
||||||
->and($entry->hasFlag('Second Flag'))->toBeTrue();
|
->and($entry->hasFlag('will_advance'))->toBeTrue();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('always has a score sheet count available', function () {
|
it('always has a score sheet count available', function () {
|
||||||
|
|
@ -176,8 +177,8 @@ it('has a forAdvancement scope that only returns those entries entered for advan
|
||||||
it('has an available scope that returns only auditions without a flag that would prevent seating', function () {
|
it('has an available scope that returns only auditions without a flag that would prevent seating', function () {
|
||||||
Entry::factory()->count(10)->create();
|
Entry::factory()->count(10)->create();
|
||||||
Entry::factory()->create()->addFlag('declined');
|
Entry::factory()->create()->addFlag('declined');
|
||||||
Entry::factory()->create()->addFlag('no-show');
|
Entry::factory()->create()->addFlag('no_show');
|
||||||
Entry::factory()->create()->addFlag('failed-prelim');
|
Entry::factory()->create()->addFlag('failed_prelim');
|
||||||
// Act & Assert
|
// Act & Assert
|
||||||
expect(Entry::all()->count())->toBe(13)
|
expect(Entry::all()->count())->toBe(13)
|
||||||
->and(Entry::available()->count())->toBe(10)
|
->and(Entry::available()->count())->toBe(10)
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,7 @@ it('allows an assigned judge to enter scores', function () {
|
||||||
$score[$subscore->id] = mt_rand(0, 100);
|
$score[$subscore->id] = mt_rand(0, 100);
|
||||||
}
|
}
|
||||||
// Act & Assert
|
// Act & Assert
|
||||||
|
/** @noinspection PhpUnhandledExceptionInspection */
|
||||||
$this->post(route('judging.saveScoreSheet', $this->entries->first()),
|
$this->post(route('judging.saveScoreSheet', $this->entries->first()),
|
||||||
['advancement-vote' => 'yes', 'score' => $score])
|
['advancement-vote' => 'yes', 'score' => $score])
|
||||||
->assertSessionHasNoErrors()
|
->assertSessionHasNoErrors()
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue