Files
PolyMPR/tests/unit/enseignements_test.ts
T
djalim 714486f43c
Check Deno code / Check Deno code (pull_request) Successful in 5s
Tests / Unit tests (pull_request) Successful in 12s
Tests / Integration tests (pull_request) Successful in 1m9s
Check Deno code / Check Deno code (push) Successful in 6s
Tests / Unit tests (push) Successful in 12s
Tests / Integration tests (push) Successful in 1m13s
chore: formated tests
2026-04-26 19:07:15 +02:00

240 lines
6.8 KiB
TypeScript

// Unit tests for /enseignements endpoints — fixtures, mock API, mock DB
import { assertEquals, assertExists } from "@std/assert";
import { mockFetch, restoreFetch } from "../helpers/api_mock.ts";
import { createMockDb } from "../helpers/db_mock.ts";
import { enseignements } from "../helpers/fixtures.ts";
interface Enseignement {
idProf: string;
idModule: string;
idPromo: string;
}
// --- Fixtures ---
Deno.test("enseignements: fixtures have correct shape", () => {
assertEquals(enseignements.length, 3);
assertEquals(typeof enseignements[0].idModule, "string");
assertEquals(typeof enseignements[0].idPromo, "string");
});
// --- Mock API ---
Deno.test("mock API: POST /enseignements creates enseignement (201) as employee", async () => {
const newEns: Enseignement = {
idProf: "prof.dupont",
idModule: "JIN702C",
idPromo: "4AFISE25/26",
};
mockFetch({
"/enseignements": { method: "POST", status: 201, body: newEns },
});
try {
const res = await fetch("http://localhost/api/enseignements", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify(newEns),
});
assertEquals(res.status, 201);
const data: Enseignement = await res.json();
assertEquals(data.idModule, "JIN702C");
} finally {
restoreFetch();
}
});
Deno.test("mock API: POST /enseignements 403 for non-employee", async () => {
mockFetch({ "/enseignements": { method: "POST", status: 403 } });
try {
const res = await fetch("http://localhost/api/enseignements", {
method: "POST",
});
assertEquals(res.status, 403);
} finally {
restoreFetch();
}
});
Deno.test("mock API: POST /enseignements 400 on missing fields", async () => {
mockFetch({ "/enseignements": { method: "POST", status: 400 } });
try {
const res = await fetch("http://localhost/api/enseignements", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ idProf: "prof.dupont" }),
});
assertEquals(res.status, 400);
} finally {
restoreFetch();
}
});
Deno.test("mock API: POST /enseignements 409 on duplicate", async () => {
mockFetch({
"/enseignements": {
method: "POST",
status: 409,
body: { error: "Cet enseignement existe déjà." },
},
});
try {
const res = await fetch("http://localhost/api/enseignements", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
idProf: "prof.dupont",
idModule: "JIN702C",
idPromo: "4AFISE25/26",
}),
});
assertEquals(res.status, 409);
const data = await res.json();
assertExists(data.error);
} finally {
restoreFetch();
}
});
Deno.test("mock API: GET /enseignements/:idProf/:idModule/:idPromo returns enseignement (employee)", async () => {
const ens: Enseignement = {
idProf: "prof.dupont",
idModule: "JIN702C",
idPromo: "4AFISE25/26",
};
mockFetch({ "/enseignements/prof.dupont/JIN702C/4AFISE25": ens });
try {
const res = await fetch(
"http://localhost/api/enseignements/prof.dupont/JIN702C/4AFISE25%2F26",
);
assertEquals(res.status, 200);
const data: Enseignement = await res.json();
assertEquals(data.idProf, "prof.dupont");
assertEquals(data.idModule, "JIN702C");
} finally {
restoreFetch();
}
});
Deno.test("mock API: GET /enseignements/:idProf/:idModule/:idPromo 403 for non-employee", async () => {
mockFetch({ "/enseignements/prof.dupont/JIN702C/4AFISE25": { status: 403 } });
try {
const res = await fetch(
"http://localhost/api/enseignements/prof.dupont/JIN702C/4AFISE25%2F26",
);
assertEquals(res.status, 403);
} finally {
restoreFetch();
}
});
Deno.test("mock API: GET /enseignements/:idProf/:idModule/:idPromo 404 when not found", async () => {
mockFetch({
"/enseignements/ghost/GHOST/GHOST": {
status: 404,
body: { error: "Ressource introuvable" },
},
});
try {
const res = await fetch(
"http://localhost/api/enseignements/ghost/GHOST/GHOST",
);
assertEquals(res.status, 404);
} finally {
restoreFetch();
}
});
Deno.test("mock API: DELETE /enseignements/:idProf/:idModule/:idPromo returns 204 (employee)", async () => {
mockFetch({
"/enseignements/prof.dupont/JIN702C/4AFISE25": {
method: "DELETE",
status: 204,
},
});
try {
const res = await fetch(
"http://localhost/api/enseignements/prof.dupont/JIN702C/4AFISE25%2F26",
{
method: "DELETE",
},
);
assertEquals(res.status, 204);
} finally {
restoreFetch();
}
});
Deno.test("mock API: DELETE /enseignements/:idProf/:idModule/:idPromo 403 for non-employee", async () => {
mockFetch({
"/enseignements/prof.dupont/JIN702C/4AFISE25": {
method: "DELETE",
status: 403,
},
});
try {
const res = await fetch(
"http://localhost/api/enseignements/prof.dupont/JIN702C/4AFISE25%2F26",
{
method: "DELETE",
},
);
assertEquals(res.status, 403);
} finally {
restoreFetch();
}
});
// --- Mock DB ---
Deno.test("mock DB: find enseignement by composite key", () => {
const data = [
{ idProf: "prof.dupont", idModule: "JIN702C", idPromo: "4AFISE25/26" },
{ idProf: "prof.moreau", idModule: "JIN703C", idPromo: "4AFISE25/26" },
];
const db = createMockDb({ tables: { enseignements: data } });
const e = db.findOne<Enseignement>(
"enseignements",
(e) => e.idProf === "prof.dupont" && e.idModule === "JIN702C",
);
assertExists(e);
assertEquals(e.idPromo, "4AFISE25/26");
});
Deno.test("mock DB: insert enseignement", () => {
const db = createMockDb({ tables: { enseignements: [] } });
db.insert<Enseignement>("enseignements", {
idProf: "prof.dupont",
idModule: "JIN702C",
idPromo: "4AFISE25/26",
});
assertEquals(db.getTable("enseignements").length, 1);
});
Deno.test("mock DB: delete enseignement", () => {
const data = [
{ idProf: "prof.dupont", idModule: "JIN702C", idPromo: "4AFISE25/26" },
{ idProf: "prof.moreau", idModule: "JIN703C", idPromo: "4AFISE25/26" },
];
const db = createMockDb({ tables: { enseignements: data } });
db.deleteWhere<Enseignement>(
"enseignements",
(e) => e.idProf === "prof.dupont",
);
assertEquals(db.getTable("enseignements").length, 1);
});
Deno.test("mock DB: filter enseignements by idModule", () => {
const data = [
{ idProf: "prof.dupont", idModule: "JIN702C", idPromo: "4AFISE25/26" },
{ idProf: "prof.dupont", idModule: "JIN702C", idPromo: "3AFISE25/26" },
{ idProf: "prof.moreau", idModule: "JIN703C", idPromo: "4AFISE25/26" },
];
const db = createMockDb({ tables: { enseignements: data } });
const rows = db.findMany<Enseignement>(
"enseignements",
(e) => e.idModule === "JIN702C",
);
assertEquals(rows.length, 2);
});