Write tests - Write tests for what was done to this point that will be kept #11
|
|
@ -1,7 +1,7 @@
|
|||
<x-layout.app>
|
||||
<x-card.card class="mx-auto max-w-lg">
|
||||
<x-card.heading>Create User</x-card.heading>
|
||||
<x-form.form method="POST" action="/admin/users">
|
||||
<x-form.form method="POST" action="{{ route('admin.users.store') }}">
|
||||
<x-form.body-grid>
|
||||
<x-form.field name="first_name" label_text="First Name" colspan="3" />
|
||||
<x-form.field name="last_name" label_text="Last Name" colspan="3" />
|
||||
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
</x-form.select>
|
||||
</x-form.body-grid>
|
||||
<x-form.footer>
|
||||
<x-form.footer class="pb-5">
|
||||
<x-form.button>Create User</x-form.button>
|
||||
</x-form.footer>
|
||||
</x-form.form>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,140 @@
|
|||
<?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, $this->users[0]))->assertRedirect(route('home'));
|
||||
actingAs($this->adminUser);
|
||||
get(route($checkRoute, $this->users[0]))->assertOk();
|
||||
actingAs($this->nonAdminUser);
|
||||
get(route($checkRoute, $this->users[0]))->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 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);
|
||||
});
|
||||
|
|
@ -147,6 +147,7 @@ it('allows an administrator to modify a user', function () {
|
|||
];
|
||||
// Act
|
||||
$response = patch(route('admin.users.update', $this->users[0]), $newData);
|
||||
/** @noinspection PhpUnhandledExceptionInspection */
|
||||
$response
|
||||
->assertSessionHasNoErrors()
|
||||
->assertRedirect(route('admin.users.index'));
|
||||
|
|
@ -157,4 +158,13 @@ it('allows an administrator to modify a user', function () {
|
|||
->and($this->users[0]->cell_phone)->toBe($newData['cell_phone'])
|
||||
->and($this->users[0]->judging_preference)->toBe($newData['judging_preference'])
|
||||
->and($this->users[0]->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);
|
||||
});
|
||||
|
|
|
|||
Loading…
Reference in New Issue