Files
alrahma_sunday_school_api/tests/Feature/Api/V1/FullSurface/ApiEmptyDatasetAndNullStateContractTest.php
T
2026-06-09 02:32:58 -04:00

93 lines
3.3 KiB
PHP

<?php
namespace Tests\Feature\Api\V1\FullSurface;
use Illuminate\Support\Facades\DB;
use Tests\Feature\Api\V1\FullSurface\Support\FullSurfaceE2EContractCase;
class ApiEmptyDatasetAndNullStateContractTest extends FullSurfaceE2EContractCase
{
public function test_list_endpoints_return_stable_empty_shapes_when_filters_match_nothing(): void
{
foreach ($this->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<string> */
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<string> */
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<string> */
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",
];
}
}