Skip to content

Commit bd03932

Browse files
tests: case controller ep tests
1 parent eecbdf7 commit bd03932

File tree

2 files changed

+240
-3
lines changed

2 files changed

+240
-3
lines changed

routes/v1_1/api.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@
3232
Route::name('cases.')->prefix('cases')->group(function () {
3333
// Route to list all cases
3434
Route::get('get_all_cases', [CaseController::class, 'getAllCases'])
35-
->name('cases.all_cases');
35+
->name('all_cases');
3636

3737
// Route to list all in-progress cases
3838
Route::get('get_in_progress', [CaseController::class, 'getInProgress'])
39-
->name('cases.in_progress');
39+
->name('in_progress');
4040

4141
// Route to list all completed cases
4242
Route::get('get_completed', [CaseController::class, 'getCompleted'])
43-
->name('cases.completed');
43+
->name('completed');
4444
});
4545
});
Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,237 @@
1+
<?php
2+
3+
namespace Tests\Feature\Api\V1_1;
4+
5+
use Illuminate\Support\Facades\Hash;
6+
use ProcessMaker\Models\CaseParticipated;
7+
use ProcessMaker\Models\CaseStarted;
8+
use ProcessMaker\Models\User;
9+
use Tests\Feature\Shared\RequestHelper;
10+
use Tests\TestCase;
11+
12+
class CaseControllerTest extends TestCase
13+
{
14+
use RequestHelper;
15+
16+
private function createUser(string $username, string $password = 'secret', string $status = 'ACTIVE'): User
17+
{
18+
return User::factory()->create([
19+
'username' => $username,
20+
'password' => Hash::make($password),
21+
'status' => $status,
22+
]);
23+
}
24+
25+
private function createCasesStartedForUser(int $userId, int $count = 1, $data = [])
26+
{
27+
return CaseStarted::factory()->count($count)->create(array_merge(['user_id' => $userId], $data));
28+
}
29+
30+
private function createCasesParticipatedForUser(int $userId, int $count = 1, $data = [])
31+
{
32+
return CaseParticipated::factory()->count($count)->create(array_merge(['user_id' => $userId], $data));
33+
}
34+
35+
public function test_get_all_cases(): void
36+
{
37+
$userA = $this->createUser('user_a');
38+
$cases = $this->createCasesStartedForUser($userA->id, 10);
39+
40+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases'));
41+
$response->assertStatus(200);
42+
$response->assertJsonCount($cases->count(), 'data');
43+
}
44+
45+
public function test_get_in_progress(): void
46+
{
47+
$userA = $this->createUser('user_a');
48+
$cases = $this->createCasesParticipatedForUser($userA->id, 5, ['case_status' => 'IN_PROGRESS']);
49+
50+
$response = $this->apiCall('GET', route('api.1.1.cases.in_progress'));
51+
$response->assertStatus(200);
52+
$response->assertJsonCount($cases->count(), 'data');
53+
$response->assertJsonFragment(['case_status' => 'IN_PROGRESS']);
54+
$response->assertJsonMissing(['case_status' => 'COMPLETED']);
55+
}
56+
57+
public function test_get_completed(): void
58+
{
59+
$userA = $this->createUser('user_a');
60+
$cases = $this->createCasesParticipatedForUser($userA->id, 5, ['case_status' => 'COMPLETED']);
61+
62+
$response = $this->apiCall('GET', route('api.1.1.cases.completed'));
63+
$response->assertStatus(200);
64+
$response->assertJsonCount($cases->count(), 'data');
65+
$response->assertJsonFragment(['case_status' => 'COMPLETED']);
66+
$response->assertJsonMissing(['case_status' => 'IN_PROGRESS']);
67+
}
68+
69+
public function test_get_all_cases_by_users(): void
70+
{
71+
$userA = $this->createUser('user_a');
72+
$userB = $this->createUser('user_b');
73+
74+
$casesA = $this->createCasesStartedForUser($userA->id, 5, ['case_status' => 'IN_PROGRESS']);
75+
$casesB = $this->createCasesStartedForUser($userB->id, 6, ['case_status' => 'COMPLETED']);
76+
$casesC = $this->createCasesStartedForUser($userA->id, 4, ['case_status' => 'IN_PROGRESS']);
77+
78+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases'));
79+
80+
$total = $casesA->count() + $casesB->count() + $casesC->count();
81+
$response->assertStatus(200);
82+
$response->assertJsonCount($total, 'data');
83+
84+
$totalUserA = $casesA->count() + $casesC->count();
85+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['userId' => $userA->id]));
86+
$response->assertStatus(200);
87+
$response->assertJsonCount($totalUserA, 'data');
88+
$response->assertJsonMissing(['user_id' => $userB->id]);
89+
90+
$totalUserB = $casesB->count();
91+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['userId' => $userB->id]));
92+
$response->assertStatus(200);
93+
$response->assertJsonCount($totalUserB, 'data');
94+
$response->assertJsonMissing(['user_id' => $userA->id]);
95+
}
96+
97+
public function test_get_all_cases_by_status(): void
98+
{
99+
$userA = $this->createUser('user_a');
100+
$userB = $this->createUser('user_b');
101+
102+
$casesA = $this->createCasesStartedForUser($userA->id, 5, ['case_status' => 'COMPLETED']);
103+
$casesB = $this->createCasesStartedForUser($userB->id, 6, ['case_status' => 'IN_PROGRESS']);
104+
$casesC = $this->createCasesStartedForUser($userA->id, 4, ['case_status' => 'COMPLETED']);
105+
106+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['status' => 'IN_PROGRESS']));
107+
$response->assertStatus(200);
108+
$response->assertJsonCount($casesB->count(), 'data');
109+
110+
$totalCompleted = $casesA->count() + $casesC->count();
111+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['status' => 'COMPLETED']));
112+
$response->assertStatus(200);
113+
$response->assertJsonCount($totalCompleted, 'data');
114+
}
115+
116+
public function test_get_in_progress_by_user(): void
117+
{
118+
$userA = $this->createUser('user_a');
119+
$userB = $this->createUser('user_b');
120+
$userC = $this->createUser('user_c');
121+
$casesA = $this->createCasesParticipatedForUser($userA->id, 5, ['case_status' => 'IN_PROGRESS']);
122+
$casesB = $this->createCasesParticipatedForUser($userB->id, 6, ['case_status' => 'IN_PROGRESS']);
123+
$casesC = $this->createCasesParticipatedForUser($userC->id, 4, ['case_status' => 'IN_PROGRESS']);
124+
125+
$response = $this->apiCall('GET', route('api.1.1.cases.in_progress', ['userId' => $userA->id]));
126+
$response->assertStatus(200);
127+
$response->assertJsonCount($casesA->count(), 'data');
128+
129+
$response = $this->apiCall('GET', route('api.1.1.cases.in_progress', ['userId' => $userB->id]));
130+
$response->assertStatus(200);
131+
$response->assertJsonCount($casesB->count(), 'data');
132+
133+
$response = $this->apiCall('GET', route('api.1.1.cases.in_progress', ['userId' => $userC->id]));
134+
$response->assertStatus(200);
135+
$response->assertJsonCount($casesC->count(), 'data');
136+
}
137+
138+
public function test_search_all_cases_by_case_number(): void
139+
{
140+
$userA = $this->createUser('user_a');
141+
$this->createCasesStartedForUser($userA->id, 5);
142+
$caseNumber = 123456;
143+
$this->createCasesStartedForUser($userA->id, 1, ['case_number' => $caseNumber]);
144+
145+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases'));
146+
$response->assertStatus(200);
147+
$response->assertJsonCount(6, 'data');
148+
149+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['search' => $caseNumber]));
150+
$response->assertStatus(200);
151+
$response->assertJsonCount(1, 'data');
152+
}
153+
154+
public function test_get_all_cases_sort_by_case_number(): void
155+
{
156+
$userA = $this->createUser('user_a');
157+
$cases = $this->createCasesStartedForUser($userA->id, 10);
158+
$casesSorted = $cases->sortBy('case_number');
159+
160+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => 'case_number:asc']));
161+
$response->assertStatus(200);
162+
$response->assertJsonCount($cases->count(), 'data');
163+
$response->assertJsonPath('data.0.case_number', $casesSorted->first()->case_number);
164+
165+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => 'case_number:desc']));
166+
$response->assertStatus(200);
167+
$response->assertJsonCount($cases->count(), 'data');
168+
$response->assertJsonPath('data.0.case_number', $casesSorted->last()->case_number);
169+
}
170+
171+
public function test_get_all_cases_sort_by_completed_at(): void
172+
{
173+
$userA = $this->createUser('user_a');
174+
$cases = $this->createCasesStartedForUser($userA->id, 10);
175+
$casesSorted = $cases->sortBy('completed_at');
176+
177+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => 'completed_at:asc']));
178+
$response->assertStatus(200);
179+
$response->assertJsonCount($cases->count(), 'data');
180+
$response->assertJsonPath('data.0.completed_at', $casesSorted->first()->completed_at->format('Y-m-d\TH:i:s.u\Z'));
181+
182+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => 'completed_at:desc']));
183+
$response->assertStatus(200);
184+
$response->assertJsonCount($cases->count(), 'data');
185+
$response->assertJsonPath('data.0.completed_at', $casesSorted->last()->completed_at->format('Y-m-d\TH:i:s.u\Z'));
186+
}
187+
188+
public function test_get_all_cases_sort_by_invalid_field(): void
189+
{
190+
$invalidField = 'invalid_field';
191+
192+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => $invalidField]));
193+
$response->assertStatus(422);
194+
$response->assertJsonPath('message', 'The sortBy must be a comma-separated list of field:asc|desc.');
195+
196+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['sortBy' => "$invalidField:asc"]));
197+
$response->assertStatus(422);
198+
$response->assertJsonFragment(['message' => "Sort by field $invalidField is not allowed."]);
199+
}
200+
201+
public function test_get_all_cases_filter_by(): void
202+
{
203+
$userA = $this->createUser('user_a');
204+
$casesA = $this->createCasesStartedForUser($userA->id, 5);
205+
$caseNumber = 123456;
206+
$casesB = $this->createCasesStartedForUser($userA->id, 1, ['case_number' => $caseNumber, 'case_status' => 'IN_PROGRESS']);
207+
208+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases'));
209+
$response->assertStatus(200);
210+
$response->assertJsonCount(6, 'data');
211+
212+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['filterBy' => ['case_number' => $caseNumber]]));
213+
$response->assertStatus(200);
214+
$response->assertJsonCount(1, 'data');
215+
$response->assertJsonFragment(['case_number' => $caseNumber]);
216+
217+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['filterBy' => ['case_status' => 'IN_PROGRESS']]));
218+
$response->assertStatus(200);
219+
$total = $casesA->where('case_status', 'IN_PROGRESS')->count() + $casesB->where('case_status', 'IN_PROGRESS')->count();
220+
$response->assertJsonCount($total, 'data');
221+
$response->assertJsonFragment(['case_status' => 'IN_PROGRESS']);
222+
$response->assertJsonMissing(['case_status' => 'COMPLETED']);
223+
}
224+
225+
public function test_get_all_cases_filter_by_invalid_field(): void
226+
{
227+
$invalidField = 'invalid_field';
228+
229+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['filterBy' => '']));
230+
$response->assertStatus(422);
231+
$response->assertJsonPath('message', 'The Filter by field must be an array.');
232+
233+
$response = $this->apiCall('GET', route('api.1.1.cases.all_cases', ['filterBy' => [$invalidField => 'value']]));
234+
$response->assertStatus(422);
235+
$response->assertJsonPath('message', "Filter by field $invalidField is not allowed.");
236+
}
237+
}

0 commit comments

Comments
 (0)