listPaths() as $path) { $response = $this->requestAs($this->actorFor($path), 'GET', $path.'?search=__no_match_contract_probe__&page=1&per_page=5'); $this->assertStatusIn($response, [200, 204, 302, 400, 401, 403, 404, 405, 419, 422], "empty list $path"); $this->assertNoServerError($response, "empty list $path"); if ($response->getStatusCode() === 200 && $this->isJsonString($response->getContent())) { $json = $response->json(); $this->assertTrue( is_array($json) || $json === null, "$path empty list response should remain array/envelope/null, not scalar junk." ); } } } public function test_current_school_year_null_state_is_handled_without_crash(): void { DB::table('school_years')->update(['is_current' => false]); foreach ($this->schoolContextPaths() as $path) { $response = $this->requestAs($this->admin, 'GET', $path); $this->assertStatusIn($response, [200, 204, 302, 400, 401, 403, 404, 405, 409, 419, 422], "null school year $path"); $this->assertNoServerError($response, "null school year $path"); } } public function test_empty_class_roster_and_attendance_context_are_controlled(): void { $emptyClassSectionId = $this->seedClassSection(9911, 'Empty Contract Class', 99); $this->ids['classSectionId'] = $emptyClassSectionId; $this->ids['class_section_id'] = $emptyClassSectionId; foreach ($this->emptyClassPaths($emptyClassSectionId) as $path) { $response = $this->requestAs($this->admin, 'GET', $path); $this->assertStatusIn($response, [200, 204, 302, 400, 401, 403, 404, 405, 409, 419, 422], "empty class $path"); $this->assertNoServerError($response, "empty class $path"); } } /** @return list */ private function listPaths(): array { return [ 'api/v1/users', 'api/v1/students', 'api/v1/classes', 'api/v1/attendance', 'api/v1/finance/invoices', 'api/v1/inventory/items', 'api/v1/messages', 'api/v1/support', ]; } /** @return list */ private function schoolContextPaths(): array { return [ 'api/v1/system/semester', 'api/v1/school-years/current', 'api/v1/classes', 'api/v1/attendance', 'api/v1/report-cards', 'api/v1/finance/reports', ]; } /** @return list */ private function emptyClassPaths(int $classSectionId): array { return [ "api/v1/classes/$classSectionId/students", "api/v1/teacher/classes/$classSectionId/roster", "api/v1/attendance/class/$classSectionId", "api/v1/class-progress/$classSectionId", ]; } }