From 86080b8042f22bc47a4bf93aa4db552764fd07a8 Mon Sep 17 00:00:00 2001 From: Djalim Simaila Date: Sun, 26 Apr 2026 14:07:51 +0200 Subject: [PATCH] test(permissions): add unit and e2e tests for GET /permissions (#115) Handler is static (no DB), tests verify the 9 known permissions are returned with correct id/nom shapes. --- tests/e2e/permissions_test.ts | 44 +++++++++++++++++++++++ tests/unit/permissions_test.ts | 65 ++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 tests/e2e/permissions_test.ts create mode 100644 tests/unit/permissions_test.ts diff --git a/tests/e2e/permissions_test.ts b/tests/e2e/permissions_test.ts new file mode 100644 index 0000000..73efe1d --- /dev/null +++ b/tests/e2e/permissions_test.ts @@ -0,0 +1,44 @@ +// #115 - E2E tests for GET /permissions +// Handler statique (pas de DB), test direct du handler + +import { assertEquals, assertExists } from "@std/assert"; +import { makeEmployeeContext, makeGetRequest } from "../helpers/handler.ts"; +import { handler as permissionsHandler } from "$apps/admin/api/permissions.ts"; + +Deno.test({ + name: "e2e permissions: GET /permissions returns all 9 permissions", + fn() { + const res = permissionsHandler.GET!( + makeGetRequest("/permissions"), + makeEmployeeContext(), + ); + assertEquals(res.status, 200); + const body = JSON.parse(res.body ? "" : "[]"); + // handler returns synchronously — parse via text + return res.text().then((text) => { + const data = JSON.parse(text); + assertEquals(data.length, 9); + assertExists(data.find((p: { id: string }) => p.id === "student_read")); + assertExists(data.find((p: { id: string }) => p.id === "role_write")); + }); + }, + sanitizeResources: false, + sanitizeOps: false, +}); + +Deno.test({ + name: "e2e permissions: GET /permissions - all entries have id and nom", + async fn() { + const res = permissionsHandler.GET!( + makeGetRequest("/permissions"), + makeEmployeeContext(), + ); + const data: { id: string; nom: string }[] = await res.json(); + for (const p of data) { + assertEquals(typeof p.id, "string"); + assertEquals(typeof p.nom, "string"); + } + }, + sanitizeResources: false, + sanitizeOps: false, +}); diff --git a/tests/unit/permissions_test.ts b/tests/unit/permissions_test.ts new file mode 100644 index 0000000..c3a8052 --- /dev/null +++ b/tests/unit/permissions_test.ts @@ -0,0 +1,65 @@ +// #115 - Unit tests for GET /permissions + +import { assertEquals, assertExists } from "@std/assert"; +import { mockFetch, restoreFetch } from "../helpers/api_mock.ts"; + +interface Permission { + id: string; + nom: string; +} + +const EXPECTED_PERMISSIONS: Permission[] = [ + { id: "student_read", nom: "Consulter les élèves" }, + { id: "student_write", nom: "Gérer les élèves" }, + { id: "note_read", nom: "Consulter les notes" }, + { id: "note_write", nom: "Gérer les notes" }, + { id: "module_read", nom: "Consulter les modules" }, + { id: "module_write", nom: "Gérer les modules" }, + { id: "user_read", nom: "Consulter les utilisateurs" }, + { id: "user_write", nom: "Gérer les utilisateurs" }, + { id: "role_write", nom: "Gérer les rôles" }, +]; + +Deno.test("permissions: known permission ids", () => { + const ids = EXPECTED_PERMISSIONS.map((p) => p.id); + assertEquals(ids.includes("student_read"), true); + assertEquals(ids.includes("student_write"), true); + assertEquals(ids.includes("note_read"), true); + assertEquals(ids.includes("role_write"), true); + assertEquals(ids.length, 9); +}); + +Deno.test("permissions: all permissions have string id and nom", () => { + for (const p of EXPECTED_PERMISSIONS) { + assertEquals(typeof p.id, "string"); + assertEquals(typeof p.nom, "string"); + } +}); + +Deno.test("mock API: GET /permissions returns all permissions", async () => { + mockFetch({ "/permissions": EXPECTED_PERMISSIONS }); + try { + const res = await fetch("http://localhost/api/permissions"); + assertEquals(res.status, 200); + const data: Permission[] = await res.json(); + assertEquals(data.length, 9); + assertExists(data.find((p) => p.id === "student_read")); + assertExists(data.find((p) => p.id === "role_write")); + } finally { + restoreFetch(); + } +}); + +Deno.test("mock API: GET /permissions - each permission has id and nom", async () => { + mockFetch({ "/permissions": EXPECTED_PERMISSIONS }); + try { + const res = await fetch("http://localhost/api/permissions"); + const data: Permission[] = await res.json(); + for (const p of data) { + assertExists(p.id); + assertExists(p.nom); + } + } finally { + restoreFetch(); + } +});