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 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); });