auditionadmin/tests/Feature/Pages/Seating/statusTest.php

163 lines
6.1 KiB
PHP

<?php
use App\Models\Audition;
use App\Models\Entry;
use App\Models\ScoreSheet;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use function Pest\Laravel\get;
uses(RefreshDatabase::class);
it('will not answer to guest or normal user', function () {
get(route('seating.status'))
->assertRedirect(route('home'));
actAsNormal();
get(route('seating.status'))
->assertRedirect(route('dashboard'))
->assertSessionHas('error', 'You are not authorized to perform this action');
});
it('responds to an admin', function () {
// Arrange
actAsAdmin();
// Act & Assert
get(route('seating.status'))
->assertOk();
});
it('responds to a tabulator', function () {
// Arrange
actAsTab();
// Act & Assert
get(route('seating.status'))
->assertOk();
});
it('sends the view a collection of audition data that includes data needed by the view', function () {
// Arrange
$auditions = Audition::factory()->count(5)->create();
actAsAdmin();
// Act
$response = get(route('seating.status'));
// Assert
foreach ($auditions as $audition) {
$response->assertOk()
->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['id'] === $audition->id;
});
$response->assertOk()
->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['name'] === $audition->name;
});
}
});
it('has correct count info for an audition with 5 entries none scored', function () {
$audition = Audition::factory()->create();
Entry::factory()->count(5)->create(['audition_id' => $audition->id]);
actAsAdmin();
$response = get(route('seating.status'));
$response->assertOk();
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['scoredEntriesCount'] === 0;
});
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['totalEntriesCount'] === 5;
});
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['scoredPercentage'] === 0;
});
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['scoringComplete'] === false;
});
});
it('has correct count info for an audition with 8 entries 2 scored', function () {
$judge = User::factory()->create();
$audition = Audition::factory()->create();
$entries = Entry::factory()->count(2)->create(['audition_id' => $audition->id]);
$entries->each(fn ($entry) => ScoreSheet::create([
'user_id' => $judge->id,
'entry_id' => $entry->id,
'subscores' => 7,
]));
Entry::factory()->count(6)->create(['audition_id' => $audition->id]);
actAsAdmin();
$response = get(route('seating.status'));
$response->assertOk();
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['scoredEntriesCount'] === 2;
});
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['totalEntriesCount'] === 8;
});
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['scoredPercentage'] == 25;
});
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['scoringComplete'] === false;
});
});
it('has correct count info for an audition with 1 entries 1 scored', function () {
$judge = User::factory()->create();
$audition = Audition::factory()->create();
$entry = Entry::factory()->create(['audition_id' => $audition->id]);
ScoreSheet::create([
'user_id' => $judge->id,
'entry_id' => $entry->id,
'subscores' => 3,
]);
actAsAdmin();
$response = get(route('seating.status'));
$response->assertOk();
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['scoredEntriesCount'] === 1;
});
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['totalEntriesCount'] === 1;
});
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['scoredPercentage'] == 100;
});
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['scoringComplete'] === true;
});
});
it('correctly shows a flag when the audition is flagged as seated', function () {
$audition = Audition::factory()->create();
actAsAdmin();
$response = get(route('seating.status'));
$response->assertOk();
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['seatsPublished'] === false;
});
$audition->addFlag('seats_published');
$response = get(route('seating.status'));
$response->assertOk();
$response->assertViewHas('auditionData', function ($viewAuditionData) use ($audition) {
return $viewAuditionData[$audition->id]['seatsPublished'] === true;
});
});
it('shows seating auditions', function() {
$audition = Audition::factory()->create();
actAsAdmin();
get(route('seating.status'))
->assertOk()
->assertSee($audition->name);
});
it('does not show advancement only auditions', function() {
$audition = Audition::factory()->advancementOnly()->create();
actAsAdmin();
get(route('seating.status'))
->assertOk()
->assertDontSee($audition->name);
});