76 lines
3.1 KiB
PHP
76 lines
3.1 KiB
PHP
<?php
|
|
|
|
use App\Models\Audition;
|
|
use App\Models\Entry;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
|
|
uses(RefreshDatabase::class);
|
|
|
|
it('allows admin to seat entries and returns to the index with a status message', function () {
|
|
$audition = Audition::factory()->create();
|
|
Entry::factory()->count(10)->create(['audition_id' => $audition->id]);
|
|
actAsAdmin();
|
|
/** @noinspection PhpUnhandledExceptionInspection */
|
|
$this->post(route('admin.draw.store'), ['audition' => [$audition->id => 'on']])
|
|
->assertSessionHasNoErrors()
|
|
->assertSessionHas('status', 'Draw completed successfully')
|
|
->assertRedirect(route('admin.draw.index'));
|
|
});
|
|
it('returns an error message if no auditions were selected', function () {
|
|
// Arrange
|
|
actAsAdmin();
|
|
// Act & Assert
|
|
$response = $this->post(route('admin.draw.store'));
|
|
$response
|
|
->assertSessionHas('error', 'No auditions were selected')
|
|
->assertRedirect(route('admin.draw.index'));
|
|
});
|
|
it('only allows admin to run a draw', function () {
|
|
// Act & Assert
|
|
$this->post(route('admin.draw.store'))->assertRedirect(route('home'));
|
|
actAsNormal();
|
|
$this->post(route('admin.draw.store'))
|
|
->assertSessionHas('error', 'You are not authorized to perform this action')
|
|
->assertRedirect(route('dashboard'));
|
|
});
|
|
it('returns with error if a draw is requested for a non-extant audition', function () {
|
|
// Arrange
|
|
actAsAdmin();
|
|
// Act & Assert
|
|
$response = $this->post(route('admin.draw.store', ['audition[999]' => 'on']));
|
|
|
|
$response
|
|
->assertSessionHas('error', 'One or more invalid auditions were selected')
|
|
->assertRedirect(route('admin.draw.index'));
|
|
});
|
|
it('sets a drawn flag on the audition once a draw is run', function () {
|
|
// Arrange
|
|
$audition = Audition::factory()->create();
|
|
actAsAdmin();
|
|
// Act & Assert
|
|
$response = $this->post(route('admin.draw.store', ['audition['.$audition->id.']' => 'on']));
|
|
expect($audition->hasFlag('drawn'))->toBeTrue();
|
|
});
|
|
it('refuses to draw an audition that has an existing draw', function () {
|
|
// Arrange
|
|
$audition = Audition::factory()->create();
|
|
$audition->addFlag('drawn');
|
|
actAsAdmin();
|
|
// Act & Assert
|
|
$this->post(route('admin.draw.store', ['audition['.$audition->id.']' => 'on']))
|
|
->assertSessionHas('error', 'Invalid attempt to draw an audition that has already been drawn')
|
|
->assertRedirect(route('admin.draw.index'));
|
|
});
|
|
it('randomizes the order of the entries in the audition', function () {
|
|
// Arrange
|
|
$audition = Audition::factory()->hasEntries(10)->create();
|
|
$entries = Entry::factory()->count(30)->create(['audition_id' => $audition->id]);
|
|
actAsAdmin();
|
|
// Act & Assert
|
|
$this->post(route('admin.draw.store'), ['audition['.$audition->id.']' => 'on']);
|
|
// assert that entries sorted by draw_number are in a random order
|
|
expect($audition->entries->sortBy('draw_number')->pluck('id'))
|
|
->not()->toBe($entries->pluck('id'));
|
|
});
|
|
// sets the draw_number column on each entry in the audition based on the randomized entry order
|