From f2e68f7388c48165d5c0328b2ca36374b97e2cef Mon Sep 17 00:00:00 2001 From: Matt Young Date: Tue, 2 Jul 2024 10:58:21 -0500 Subject: [PATCH] AdminUserEdit Page Test - includes AdminUserUpdate --- app/Http/Controllers/Admin/UserController.php | 34 ++-- resources/views/admin/users/edit.blade.php | 2 +- tests/Feature/Pages/Admin/UsersEditTest.php | 160 ++++++++++++++++++ 3 files changed, 183 insertions(+), 13 deletions(-) create mode 100644 tests/Feature/Pages/Admin/UsersEditTest.php diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index ab5a1a6..60d38ef 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -2,8 +2,6 @@ namespace App\Http\Controllers\Admin; -use App\Events\AuditionChange; -use App\Events\RoomJudgeChange; use App\Http\Controllers\Controller; use App\Mail\NewUserPassword; use App\Models\School; @@ -18,28 +16,39 @@ class UserController extends Controller { public function index() { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $users = User::with('school')->orderBy('last_name')->orderBy('first_name')->get(); + return view('admin.users.index', ['users' => $users]); } public function edit(User $user) { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $schools = School::orderBy('name')->get(); - return view('admin.users.edit', ['user' => $user,'schools' => $schools]); + + return view('admin.users.edit', ['user' => $user, 'schools' => $schools]); } public function create() { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } $schools = School::orderBy('name')->get(); + return view('admin.users.create', ['schools' => $schools]); } public function update(Request $request, User $user) { - if (! Auth::user()->is_admin) abort(403); + if (! Auth::user()->is_admin) { + abort(403); + } request()->validate([ 'first_name' => ['required'], @@ -47,7 +56,7 @@ class UserController extends Controller 'email' => ['required', 'email'], 'cell_phone' => ['required'], 'judging_preference' => ['required'], - 'school_id' => ['required','exists:schools,id'], + 'school_id' => ['required', 'exists:schools,id'], ]); $user->update([ @@ -56,8 +65,9 @@ class UserController extends Controller 'email' => request('email'), 'cell_phone' => request('cell_phone'), 'judging_preference' => request('judging_preference'), - 'school_id' => request('school_id') + 'school_id' => request('school_id'), ]); + return redirect('/admin/users'); } @@ -66,7 +76,7 @@ class UserController extends Controller $request->validate([ 'first_name' => ['required'], 'last_name' => ['required'], - 'email' => ['required', 'email','unique:users'], + 'email' => ['required', 'email', 'unique:users'], ]); // Genearte a random password @@ -81,9 +91,9 @@ class UserController extends Controller 'password' => Hash::make($randomPassword), ]); - if (!is_null(request('school_id'))) { + if (! is_null(request('school_id'))) { $request->validate([ - 'school_id' => ['exists:schools,id'] + 'school_id' => ['exists:schools,id'], ]); } $user->school_id = request('school_id'); diff --git a/resources/views/admin/users/edit.blade.php b/resources/views/admin/users/edit.blade.php index 7dbd695..99c4aad 100644 --- a/resources/views/admin/users/edit.blade.php +++ b/resources/views/admin/users/edit.blade.php @@ -1,7 +1,7 @@ Edit User - + diff --git a/tests/Feature/Pages/Admin/UsersEditTest.php b/tests/Feature/Pages/Admin/UsersEditTest.php new file mode 100644 index 0000000..eacde34 --- /dev/null +++ b/tests/Feature/Pages/Admin/UsersEditTest.php @@ -0,0 +1,160 @@ +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.edit'; + 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 patch request', function () { + // Arrange + actingAs($this->adminUser); + // Act & Assert + $response = get(route('admin.users.edit', $this->users[0])); + $response->assertOk(); + $response->assertSeeInOrder([ + 'form', + 'method', + 'POST', + 'action=', + route('admin.users.update', $this->users[0]), + '/form', + ]); + $response->assertSee('', 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.edit', $this->users[0])); + $response->assertOk(); + foreach ($fieldNames as $fieldName) { + $response->assertSeeInOrder([ + 'input', + 'name=', + $fieldName, + '/', + ]); + } + $response->assertSeeInOrder([ + 'select', + 'name', + 'school_id', + '/select', + ]); +}); +it('is prefilled with existing user data', function () { + // Arrange + actingAs($this->adminUser); + $valueChecks = [ + 'first_name' => $this->users[0]->first_name, + 'last_name' => $this->users[0]->last_name, + 'email' => $this->users[0]->email, + 'cell_phone' => $this->users[0]->cell_phone, + 'judging_preference' => $this->users[0]->judging_preference, + ]; + // Act & Assert + $response = get(route('admin.users.edit', $this->users[0])); + $response->assertOk(); + foreach ($valueChecks as $check) { + $response->assertSeeInOrder( + [ + 'input', + 'value=', + $check, + '/', + ] + ); + } + $response->assertSeeInOrder([ + 'option', + 'value=', + $this->users[0]->school_id, + 'selected', + '/option', + ]); +}); +it('has all schools in a dropdown', function () { + // Arrange + actingAs($this->adminUser); + // Act & Assert + $response = get(route('admin.users.edit', $this->users[0])); + $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 = patch(route('admin.users.update', $this->users[0]), [ + 'first_name' => 'New First Name', + 'last_name' => 'New Last Name', + ]); + $response->assertRedirect(route('dashboard')); +}); +it('allows an administrator to modify 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 = patch(route('admin.users.update', $this->users[0]), $newData); + $response + ->assertSessionHasNoErrors() + ->assertRedirect(route('admin.users.index')); + $this->users[0]->refresh(); + expect($this->users[0]->first_name)->toBe($newData['first_name']) + ->and($this->users[0]->last_name)->toBe($newData['last_name']) + ->and($this->users[0]->email)->toBe($newData['email']) + ->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); +});