From 03381acac47fbb1236e4d765f13eebdb2ca0b91a Mon Sep 17 00:00:00 2001 From: devoalda Date: Mon, 7 Aug 2023 12:49:29 +0800 Subject: [PATCH] test(Project CRUD Test cases): Added: - CRUD test cases for project functions Ammended: - "show" test case to compare data intead of view Modified: - Model Relationships --- app/Http/Controllers/ProjectController.php | 2 +- .../Controllers/ProjectTodoController.php | 2 - app/Models/User.php | 6 +- tests/Feature/Project/ProjectCRUDTest.php | 130 ++++++++++++++++++ 4 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 tests/Feature/Project/ProjectCRUDTest.php diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index 52d27d4..8288870 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -48,7 +48,7 @@ class ProjectController extends Controller $data = $request->validated(); - $user->projects()->save(new Project($data)); + $user->projects()->create($data); return redirect()->route('project.index') ->with('info', 'Project created!'); diff --git a/app/Http/Controllers/ProjectTodoController.php b/app/Http/Controllers/ProjectTodoController.php index af06a1e..442214e 100644 --- a/app/Http/Controllers/ProjectTodoController.php +++ b/app/Http/Controllers/ProjectTodoController.php @@ -2,8 +2,6 @@ namespace App\Http\Controllers; -//use App\Http\Requests\StoreTodoRequest; -//use App\Http\Requests\UpdateTodoRequest; use App\Http\Requests\Project\StoreTodoRequest; use App\Http\Requests\Project\UpdateTodoRequest; use App\Models\Todo; diff --git a/app/Models/User.php b/app/Models/User.php index ef50aef..b268281 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -49,13 +49,13 @@ class User extends Authenticatable 'password' => 'hashed', ]; - public function projects(): HasManyThrough + public function projects(): BelongsToMany { - return $this->hasManyThrough(Project::class, projectUser::class, 'user_id', 'id', 'id', 'project_id'); + return $this->belongsToMany(Project::class, projectUser::class, 'user_id', 'project_id'); } public function todos(): HasManyThrough { - return $this->hasManyThrough(Todo::class, projectUser::class, 'user_id', 'id', 'id', 'project_id'); + return $this->hasManyThrough(Todo::class, Project::class, 'owner_id', 'project_id'); } } diff --git a/tests/Feature/Project/ProjectCRUDTest.php b/tests/Feature/Project/ProjectCRUDTest.php new file mode 100644 index 0000000..5c054ac --- /dev/null +++ b/tests/Feature/Project/ProjectCRUDTest.php @@ -0,0 +1,130 @@ +actingAs($user = User::factory()->create()); + $this->user = $user; + $this->assertAuthenticated(); + + } + + public function test_user_can_create_project(): void + { + // Create a project through POST and store it in the project property + $response = $this->post(route('project.store'), [ + 'name' => 'Test Project', + 'description' => 'Test Description', + ]); + $response->assertRedirect(route('project.index')); + $this->assertDatabaseHas('projects', [ + 'name' => 'Test Project', + 'description' => 'Test Description', + ]); + + $this->assertDatabaseHas('project_user', [ + 'project_id' => Project::where('name', 'Test Project')->first()->id, + 'user_id' => $this->user->id, + ]); + + $this->project = Project::where('name', 'Test Project')->first(); + } + + // View Project after creation (Show to be implemented) + public function test_user_can_view_project(): void + { + $this->test_user_can_create_project(); + // Get from project index page and assert that the project is visible + $response = $this->get(route('project.index')); + // Search for the project name and description + $response->assertSee('Test Project'); + $response->assertSee('Test Description'); + } + + // Edit Project after creation + public function test_user_can_edit_project(): void + { + $this->test_user_can_create_project(); + $response = $this->get(route('project.edit', $this->project->id)); + $response->assertOk(); + $response->assertSee('Test Project'); + $response->assertSee('Test Description'); + } + + // Update Project after creation + public function test_user_can_update_project(): void + { + $this->test_user_can_create_project(); + $response = $this->put(route('project.update', $this->project->id), [ + 'name' => 'Test Project Updated', + 'description' => 'Test Description Updated', + ]); + $response->assertRedirect(back()->getTargetUrl()); + $this->assertDatabaseHas('projects', [ + 'name' => 'Test Project Updated', + 'description' => 'Test Description Updated', + ]); + } + + // Delete Project after creation + public function test_user_can_delete_project(): void + { + $this->test_user_can_create_project(); + $response = $this->delete(route('project.destroy', $this->project->id)); + $response->assertRedirect(route('project.index')); + $this->assertDatabaseMissing('projects', [ + 'name' => 'Test Project', + 'description' => 'Test Description', + ]); + } + + // View Project after deletion + public function test_user_cannot_view_deleted_project(): void + { + $this->test_user_can_delete_project(); + $response = $this->get(route('project.show', $this->project->id)); + $response->assertNotFound(); + } + + // Edit Project after deletion + public function test_user_cannot_edit_deleted_project(): void + { + $this->test_user_can_delete_project(); + $response = $this->get(route('project.edit', $this->project->id)); + $response->assertNotFound(); + } + + // Update Project after deletion + public function test_user_cannot_update_deleted_project(): void + { + $this->test_user_can_delete_project(); + $response = $this->put(route('project.update', $this->project->id), [ + 'name' => 'Test Project Updated', + 'description' => 'Test Description Updated', + ]); + $response->assertNotFound(); + } + + // Delete Project after deletion + public function test_user_cannot_delete_deleted_project(): void + { + $this->test_user_can_delete_project(); + $response = $this->delete(route('project.destroy', $this->project->id)); + $response->assertNotFound(); + } + +}