auditionadmin/tests-old/Feature/Pages/Admin/UsersCreateTest.php

155 lines
4.5 KiB
PHP

<?php
use App\Models\School;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use function Pest\Laravel\actingAs;
use function Pest\Laravel\get;
use function Pest\Laravel\post;
uses(RefreshDatabase::class);
beforeEach(function () {
$this->adminUser = User::factory()->admin()->create();
$this->nonAdminUser = User::factory()->create();
$this->tabUser = User::factory()->tab()->create();
$this->users = User::factory(3)->create();
$this->schools = [];
foreach ($this->users as $user) {
$school = School::factory()->create();
$user->school_id = $school->id;
$user->save();
}
});
it('only shows for an admin user', function () {
// Act & Assert
$checkRoute = 'admin.users.create';
get(route($checkRoute))->assertRedirect(route('home'));
actingAs($this->adminUser);
get(route($checkRoute))->assertOk();
actingAs($this->nonAdminUser);
get(route($checkRoute))->assertRedirect(route('dashboard'));
});
it('submits a post request', function () {
// Arrange
actingAs($this->adminUser);
// Act & Assert
$response = get(route('admin.users.create'));
$response->assertOk();
$response->assertSeeInOrder([
'form',
'method',
'POST',
'action=',
route('admin.users.store'),
'/form',
]);
});
it('has a Create User submit button', function () {
// Arrange
actingAs($this->adminUser);
// Act & Assert
$response = get(route('admin.users.create'));
$response->assertOk();
$response->assertSeeInOrder([
'button',
'type',
'submit',
'Create User',
'/button',
], false);
});
it('has all needed fields', function () {
// Arrange
actingAs($this->adminUser);
$fieldNames = [
'first_name',
'last_name',
'email',
'cell_phone',
'judging_preference',
];
// Act & Assert
$response = get(route('admin.users.create'));
$response->assertOk();
foreach ($fieldNames as $fieldName) {
$response->assertSeeInOrder([
'input',
'name=',
$fieldName,
'/',
]);
}
$response->assertSeeInOrder([
'select',
'name',
'school_id',
'/select',
]);
});
it('has all schools in a dropdown', function () {
// Arrange
actingAs($this->adminUser);
// Act & Assert
$response = get(route('admin.users.create'));
$response->assertOk();
foreach ($this->schools as $school) {
$response->assertSeeInOrder([
'option',
'value=',
$school->id,
$school->name,
'/option',
]);
}
});
it('rejects a submission by a non administrator', function () {
// Arrange
actingAs($this->nonAdminUser);
// Act & Assert
$response = post(route('admin.users.store'), [
'first_name' => 'New First Name',
'last_name' => 'New Last Name',
]);
$response->assertRedirect(route('dashboard'));
});
it('allows an administrator to create a user', function () {
// Arrange
$newSchool = School::factory()->create(['name' => 'New School']);
actingAs($this->adminUser);
$newData = [
'first_name' => 'New First Name',
'last_name' => 'New Last Name',
'email' => 'new@emailllllll.com',
'cell_phone' => '123-456-7890',
'judging_preference' => 'New Judging Preference',
'school_id' => $newSchool->id,
];
// Act
$response = post(route('admin.users.store'), $newData);
/** @noinspection PhpUnhandledExceptionInspection */
$response
->assertSessionHasNoErrors()
->assertRedirect(route('admin.users.index'));
// Get the latest created user
$createdUser = User::where('email', $newData['email'])->first();
expect($createdUser->first_name)->toBe($newData['first_name'])
->and($createdUser->last_name)->toBe($newData['last_name'])
->and($createdUser->email)->toBe($newData['email'])
->and($createdUser->cell_phone)->toBe($newData['cell_phone'])
->and($createdUser->judging_preference)->toBe($newData['judging_preference'])
->and($createdUser->school->name)->toBe($newSchool->name);
get(route('admin.users.index'))
->assertOk()
->assertSee($newData['first_name'])
->assertSee($newData['last_name'])
->assertSee($newData['email'])
->assertSee($newData['cell_phone'])
->assertSee($newData['judging_preference'])
->assertSee($newSchool->name);
});