chore: formated tests
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
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
This commit was merged in pull request #145.
This commit is contained in:
@@ -26,10 +26,17 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Dupont", prenom: "Jean", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Dupont",
|
||||
prenom: "Jean",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [ue] = await seedUes([{ nom: "UE Info" }]);
|
||||
await seedAjustements([{ numEtud: s.numEtud, idUE: ue.id, valeur: 13.0 }]);
|
||||
const res = await ajustementsHandler.GET!(makeGetRequest("/ajustements"), makeEmployeeContext());
|
||||
const res = await ajustementsHandler.GET!(
|
||||
makeGetRequest("/ajustements"),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const body = await res.json();
|
||||
assertEquals(body.length, 1);
|
||||
@@ -43,8 +50,16 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s1] = await seedStudents([{ nom: "Dupont", prenom: "Jean", idPromo: "P1" }]);
|
||||
const [s2] = await seedStudents([{ nom: "Martin", prenom: "Alice", idPromo: "P1" }]);
|
||||
const [s1] = await seedStudents([{
|
||||
nom: "Dupont",
|
||||
prenom: "Jean",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [s2] = await seedStudents([{
|
||||
nom: "Martin",
|
||||
prenom: "Alice",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [ue] = await seedUes([{ nom: "UE Info" }]);
|
||||
await seedAjustements([
|
||||
{ numEtud: s1.numEtud, idUE: ue.id, valeur: 13.0 },
|
||||
@@ -80,14 +95,23 @@ Deno.test({
|
||||
// --- POST /ajustements ---
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ajustements: POST /ajustements creates ajustement (201) as employee",
|
||||
name:
|
||||
"e2e ajustements: POST /ajustements creates ajustement (201) as employee",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Leroy", prenom: "Paul", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Leroy",
|
||||
prenom: "Paul",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [ue] = await seedUes([{ nom: "UE Info" }]);
|
||||
const res = await ajustementsHandler.POST!(
|
||||
makeJsonRequest("/ajustements", "POST", { numEtud: s.numEtud, idUE: ue.id, valeur: 14.5 }),
|
||||
makeJsonRequest("/ajustements", "POST", {
|
||||
numEtud: s.numEtud,
|
||||
idUE: ue.id,
|
||||
valeur: 14.5,
|
||||
}),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 201);
|
||||
@@ -104,7 +128,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await ajustementsHandler.POST!(
|
||||
makeJsonRequest("/ajustements", "POST", { numEtud: 1, idUE: 1, valeur: 10.0 }),
|
||||
makeJsonRequest("/ajustements", "POST", {
|
||||
numEtud: 1,
|
||||
idUE: 1,
|
||||
valeur: 10.0,
|
||||
}),
|
||||
makeContextWithAffiliation("student"),
|
||||
);
|
||||
assertEquals(res.status, 403);
|
||||
@@ -130,7 +158,8 @@ Deno.test({
|
||||
// --- GET /ajustements/:numEtud/:idUE ---
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ajustements: GET /ajustements/:numEtud/:idUE returns correct ajustement (employee)",
|
||||
name:
|
||||
"e2e ajustements: GET /ajustements/:numEtud/:idUE returns correct ajustement (employee)",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
@@ -147,7 +176,10 @@ Deno.test({
|
||||
]);
|
||||
const res = await ajustementHandler.GET!(
|
||||
makeGetRequest(`/ajustements/${s1.numEtud}/${ue1.id}`),
|
||||
makeEmployeeContext({ numEtud: String(s1.numEtud), idUE: String(ue1.id) }),
|
||||
makeEmployeeContext({
|
||||
numEtud: String(s1.numEtud),
|
||||
idUE: String(ue1.id),
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const body = await res.json();
|
||||
@@ -189,19 +221,28 @@ Deno.test({
|
||||
// --- PUT /ajustements/:numEtud/:idUE ---
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ajustements: PUT /ajustements/:numEtud/:idUE updates only targeted row (employee)",
|
||||
name:
|
||||
"e2e ajustements: PUT /ajustements/:numEtud/:idUE updates only targeted row (employee)",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Thomas", prenom: "Eva", idPromo: "P1" }]);
|
||||
const [ue1, ue2] = await seedUes([{ nom: "UE Physique" }, { nom: "UE Chimie" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Thomas",
|
||||
prenom: "Eva",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [ue1, ue2] = await seedUes([{ nom: "UE Physique" }, {
|
||||
nom: "UE Chimie",
|
||||
}]);
|
||||
// Deux ajustements pour le même étudiant — seul ue1 doit être modifié
|
||||
await seedAjustements([
|
||||
{ numEtud: s.numEtud, idUE: ue1.id, valeur: 10.0 },
|
||||
{ numEtud: s.numEtud, idUE: ue2.id, valeur: 7.0 },
|
||||
]);
|
||||
const res = await ajustementHandler.PUT!(
|
||||
makeJsonRequest(`/ajustements/${s.numEtud}/${ue1.id}`, "PUT", { valeur: 19.0 }),
|
||||
makeJsonRequest(`/ajustements/${s.numEtud}/${ue1.id}`, "PUT", {
|
||||
valeur: 19.0,
|
||||
}),
|
||||
makeEmployeeContext({ numEtud: String(s.numEtud), idUE: String(ue1.id) }),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
@@ -247,11 +288,16 @@ Deno.test({
|
||||
// --- DELETE /ajustements/:numEtud/:idUE ---
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ajustements: DELETE /ajustements/:numEtud/:idUE deletes only targeted row (employee)",
|
||||
name:
|
||||
"e2e ajustements: DELETE /ajustements/:numEtud/:idUE deletes only targeted row (employee)",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Petit", prenom: "Hugo", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Petit",
|
||||
prenom: "Hugo",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [ue1, ue2] = await seedUes([{ nom: "UE Chimie" }, { nom: "UE Bio" }]);
|
||||
// Deux ajustements pour le même étudiant — seul ue1 doit être supprimé
|
||||
await seedAjustements([
|
||||
@@ -273,7 +319,8 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ajustements: DELETE /ajustements/:numEtud/:idUE 403 for non-employee",
|
||||
name:
|
||||
"e2e ajustements: DELETE /ajustements/:numEtud/:idUE 403 for non-employee",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await ajustementHandler.DELETE!(
|
||||
@@ -287,7 +334,8 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ajustements: DELETE /ajustements/:numEtud/:idUE 404 when not found",
|
||||
name:
|
||||
"e2e ajustements: DELETE /ajustements/:numEtud/:idUE 404 when not found",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await ajustementHandler.DELETE!(
|
||||
|
||||
@@ -20,14 +20,19 @@ import { handler as enseignementHandler } from "$apps/admin/api/enseignements/[i
|
||||
// --- POST /enseignements ---
|
||||
|
||||
Deno.test({
|
||||
name: "e2e enseignements: POST /enseignements creates enseignement (201) as employee",
|
||||
name:
|
||||
"e2e enseignements: POST /enseignements creates enseignement (201) as employee",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedUsers([{ id: "prof.dupont", nom: "Dupont", prenom: "Jean" }]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const res = await enseignementsHandler.POST!(
|
||||
makeJsonRequest("/enseignements", "POST", { idProf: "prof.dupont", idModule: "M1", idPromo: "P1" }),
|
||||
makeJsonRequest("/enseignements", "POST", {
|
||||
idProf: "prof.dupont",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 201);
|
||||
@@ -44,7 +49,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await enseignementsHandler.POST!(
|
||||
makeJsonRequest("/enseignements", "POST", { idProf: "p", idModule: "M1", idPromo: "P1" }),
|
||||
makeJsonRequest("/enseignements", "POST", {
|
||||
idProf: "p",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}),
|
||||
makeContextWithAffiliation("student"),
|
||||
);
|
||||
assertEquals(res.status, 403);
|
||||
@@ -74,9 +83,17 @@ Deno.test({
|
||||
await seedUsers([{ id: "prof.dupont", nom: "Dupont", prenom: "Jean" }]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
await seedEnseignements([{ idProf: "prof.dupont", idModule: "M1", idPromo: "P1" }]);
|
||||
await seedEnseignements([{
|
||||
idProf: "prof.dupont",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const res = await enseignementsHandler.POST!(
|
||||
makeJsonRequest("/enseignements", "POST", { idProf: "prof.dupont", idModule: "M1", idPromo: "P1" }),
|
||||
makeJsonRequest("/enseignements", "POST", {
|
||||
idProf: "prof.dupont",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 409);
|
||||
@@ -88,16 +105,25 @@ Deno.test({
|
||||
// --- GET /enseignements/:idProf/:idModule/:idPromo ---
|
||||
|
||||
Deno.test({
|
||||
name: "e2e enseignements: GET /enseignements/:idProf/:idModule/:idPromo returns enseignement (employee)",
|
||||
name:
|
||||
"e2e enseignements: GET /enseignements/:idProf/:idModule/:idPromo returns enseignement (employee)",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedUsers([{ id: "prof.dupont", nom: "Dupont", prenom: "Jean" }]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
await seedEnseignements([{ idProf: "prof.dupont", idModule: "M1", idPromo: "P1" }]);
|
||||
await seedEnseignements([{
|
||||
idProf: "prof.dupont",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const res = await enseignementHandler.GET!(
|
||||
makeGetRequest("/enseignements/prof.dupont/M1/P1"),
|
||||
makeEmployeeContext({ idProf: "prof.dupont", idModule: "M1", idPromo: "P1" }),
|
||||
makeEmployeeContext({
|
||||
idProf: "prof.dupont",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const body = await res.json();
|
||||
@@ -109,12 +135,17 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e enseignements: GET /enseignements/:idProf/:idModule/:idPromo 403 for non-employee",
|
||||
name:
|
||||
"e2e enseignements: GET /enseignements/:idProf/:idModule/:idPromo 403 for non-employee",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await enseignementHandler.GET!(
|
||||
makeGetRequest("/enseignements/p/M1/P1"),
|
||||
makeContextWithAffiliation("student", { idProf: "p", idModule: "M1", idPromo: "P1" }),
|
||||
makeContextWithAffiliation("student", {
|
||||
idProf: "p",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 403);
|
||||
},
|
||||
@@ -123,12 +154,17 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e enseignements: GET /enseignements/:idProf/:idModule/:idPromo 404 when not found",
|
||||
name:
|
||||
"e2e enseignements: GET /enseignements/:idProf/:idModule/:idPromo 404 when not found",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await enseignementHandler.GET!(
|
||||
makeGetRequest("/enseignements/ghost/GHOST/GHOST"),
|
||||
makeEmployeeContext({ idProf: "ghost", idModule: "GHOST", idPromo: "GHOST" }),
|
||||
makeEmployeeContext({
|
||||
idProf: "ghost",
|
||||
idModule: "GHOST",
|
||||
idPromo: "GHOST",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 404);
|
||||
},
|
||||
@@ -139,16 +175,25 @@ Deno.test({
|
||||
// --- DELETE /enseignements/:idProf/:idModule/:idPromo ---
|
||||
|
||||
Deno.test({
|
||||
name: "e2e enseignements: DELETE /enseignements/:idProf/:idModule/:idPromo returns 204 (employee)",
|
||||
name:
|
||||
"e2e enseignements: DELETE /enseignements/:idProf/:idModule/:idPromo returns 204 (employee)",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedUsers([{ id: "prof.dupont", nom: "Dupont", prenom: "Jean" }]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
await seedEnseignements([{ idProf: "prof.dupont", idModule: "M1", idPromo: "P1" }]);
|
||||
await seedEnseignements([{
|
||||
idProf: "prof.dupont",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const res = await enseignementHandler.DELETE!(
|
||||
makeGetRequest("/enseignements/prof.dupont/M1/P1"),
|
||||
makeEmployeeContext({ idProf: "prof.dupont", idModule: "M1", idPromo: "P1" }),
|
||||
makeEmployeeContext({
|
||||
idProf: "prof.dupont",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 204);
|
||||
},
|
||||
@@ -157,12 +202,17 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e enseignements: DELETE /enseignements/:idProf/:idModule/:idPromo 403 for non-employee",
|
||||
name:
|
||||
"e2e enseignements: DELETE /enseignements/:idProf/:idModule/:idPromo 403 for non-employee",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await enseignementHandler.DELETE!(
|
||||
makeGetRequest("/enseignements/p/M1/P1"),
|
||||
makeContextWithAffiliation("student", { idProf: "p", idModule: "M1", idPromo: "P1" }),
|
||||
makeContextWithAffiliation("student", {
|
||||
idProf: "p",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 403);
|
||||
},
|
||||
@@ -171,12 +221,17 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e enseignements: DELETE /enseignements/:idProf/:idModule/:idPromo 404 when not found",
|
||||
name:
|
||||
"e2e enseignements: DELETE /enseignements/:idProf/:idModule/:idPromo 404 when not found",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await enseignementHandler.DELETE!(
|
||||
makeGetRequest("/enseignements/ghost/GHOST/GHOST"),
|
||||
makeEmployeeContext({ idProf: "ghost", idModule: "GHOST", idPromo: "GHOST" }),
|
||||
makeEmployeeContext({
|
||||
idProf: "ghost",
|
||||
idModule: "GHOST",
|
||||
idPromo: "GHOST",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 404);
|
||||
},
|
||||
|
||||
+49
-10
@@ -23,13 +23,20 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Dupont", prenom: "Jean", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Dupont",
|
||||
prenom: "Jean",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }, { id: "M2", nom: "Mod B" }]);
|
||||
await seedNotes([
|
||||
{ numEtud: s.numEtud, idModule: "M1", note: 15.0 },
|
||||
{ numEtud: s.numEtud, idModule: "M2", note: 12.0 },
|
||||
]);
|
||||
const res = await notesHandler.GET!(makeGetRequest("/notes"), makeEmployeeContext());
|
||||
const res = await notesHandler.GET!(
|
||||
makeGetRequest("/notes"),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const body = await res.json();
|
||||
assertEquals(body.length, 2);
|
||||
@@ -43,8 +50,16 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s1] = await seedStudents([{ nom: "Dupont", prenom: "Jean", idPromo: "P1" }]);
|
||||
const [s2] = await seedStudents([{ nom: "Martin", prenom: "Alice", idPromo: "P1" }]);
|
||||
const [s1] = await seedStudents([{
|
||||
nom: "Dupont",
|
||||
prenom: "Jean",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [s2] = await seedStudents([{
|
||||
nom: "Martin",
|
||||
prenom: "Alice",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
await seedNotes([
|
||||
{ numEtud: s1.numEtud, idModule: "M1", note: 15.0 },
|
||||
@@ -82,7 +97,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Dupont", prenom: "Jean", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Dupont",
|
||||
prenom: "Jean",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }, { id: "M2", nom: "Mod B" }]);
|
||||
await seedNotes([
|
||||
{ numEtud: s.numEtud, idModule: "M1", note: 15.0 },
|
||||
@@ -108,10 +127,18 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Leroy", prenom: "Paul", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Leroy",
|
||||
prenom: "Paul",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
const res = await notesHandler.POST!(
|
||||
makeJsonRequest("/notes", "POST", { numEtud: s.numEtud, idModule: "M1", note: 14.0 }),
|
||||
makeJsonRequest("/notes", "POST", {
|
||||
numEtud: s.numEtud,
|
||||
idModule: "M1",
|
||||
note: 14.0,
|
||||
}),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 201);
|
||||
@@ -144,7 +171,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Bernard", prenom: "Lucie", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Bernard",
|
||||
prenom: "Lucie",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
await seedNotes([{ numEtud: s.numEtud, idModule: "M1", note: 18.0 }]);
|
||||
const res = await noteHandler.GET!(
|
||||
@@ -180,7 +211,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Thomas", prenom: "Eva", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Thomas",
|
||||
prenom: "Eva",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
await seedNotes([{ numEtud: s.numEtud, idModule: "M1", note: 10.0 }]);
|
||||
const res = await noteHandler.PUT!(
|
||||
@@ -216,7 +251,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Petit", prenom: "Hugo", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Petit",
|
||||
prenom: "Hugo",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
await seedNotes([{ numEtud: s.numEtud, idModule: "M1", note: 9.0 }]);
|
||||
const res = await noteHandler.DELETE!(
|
||||
|
||||
@@ -32,7 +32,10 @@ Deno.test({
|
||||
{ idModule: "M1", idUE: ue.id, idPromo: "P1", coeff: 2.0 },
|
||||
{ idModule: "M2", idUE: ue.id, idPromo: "P1", coeff: 3.0 },
|
||||
]);
|
||||
const res = await ueModulesHandler.GET!(makeGetRequest("/ue-modules"), makeEmployeeContext());
|
||||
const res = await ueModulesHandler.GET!(
|
||||
makeGetRequest("/ue-modules"),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const body = await res.json();
|
||||
assertEquals(body.length, 2);
|
||||
@@ -75,7 +78,12 @@ Deno.test({
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
const [ue] = await seedUes([{ nom: "UE Info" }]);
|
||||
const res = await ueModulesHandler.POST!(
|
||||
makeJsonRequest("/ue-modules", "POST", { idModule: "M1", idUE: ue.id, idPromo: "P1", coeff: 4.0 }),
|
||||
makeJsonRequest("/ue-modules", "POST", {
|
||||
idModule: "M1",
|
||||
idUE: ue.id,
|
||||
idPromo: "P1",
|
||||
coeff: 4.0,
|
||||
}),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 201);
|
||||
@@ -104,7 +112,8 @@ Deno.test({
|
||||
// --- GET /ue-modules/:idModule/:idUE/:idPromo ---
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ue_modules: GET /ue-modules/:idModule/:idUE/:idPromo returns correct association (employee)",
|
||||
name:
|
||||
"e2e ue_modules: GET /ue-modules/:idModule/:idUE/:idPromo returns correct association (employee)",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }, { id: "P2" }]);
|
||||
@@ -119,7 +128,11 @@ Deno.test({
|
||||
]);
|
||||
const res = await ueModuleHandler.GET!(
|
||||
makeGetRequest(`/ue-modules/M1/${ue1.id}/P1`),
|
||||
makeEmployeeContext({ idModule: "M1", idUE: String(ue1.id), idPromo: "P1" }),
|
||||
makeEmployeeContext({
|
||||
idModule: "M1",
|
||||
idUE: String(ue1.id),
|
||||
idPromo: "P1",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const body = await res.json();
|
||||
@@ -132,12 +145,17 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ue_modules: GET /ue-modules/:idModule/:idUE/:idPromo 403 for non-employee",
|
||||
name:
|
||||
"e2e ue_modules: GET /ue-modules/:idModule/:idUE/:idPromo 403 for non-employee",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await ueModuleHandler.GET!(
|
||||
makeGetRequest("/ue-modules/M1/1/P1"),
|
||||
makeContextWithAffiliation("student", { idModule: "M1", idUE: "1", idPromo: "P1" }),
|
||||
makeContextWithAffiliation("student", {
|
||||
idModule: "M1",
|
||||
idUE: "1",
|
||||
idPromo: "P1",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 403);
|
||||
},
|
||||
@@ -146,7 +164,8 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ue_modules: GET /ue-modules/:idModule/:idUE/:idPromo 404 when not found",
|
||||
name:
|
||||
"e2e ue_modules: GET /ue-modules/:idModule/:idUE/:idPromo 404 when not found",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await ueModuleHandler.GET!(
|
||||
@@ -162,7 +181,8 @@ Deno.test({
|
||||
// --- PUT /ue-modules/:idModule/:idUE/:idPromo ---
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ue_modules: PUT /ue-modules/:idModule/:idUE/:idPromo updates only the targeted row (employee)",
|
||||
name:
|
||||
"e2e ue_modules: PUT /ue-modules/:idModule/:idUE/:idPromo updates only the targeted row (employee)",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }, { id: "P2" }]);
|
||||
@@ -175,7 +195,11 @@ Deno.test({
|
||||
]);
|
||||
const res = await ueModuleHandler.PUT!(
|
||||
makeJsonRequest(`/ue-modules/M1/${ue1.id}/P1`, "PUT", { coeff: 5.0 }),
|
||||
makeEmployeeContext({ idModule: "M1", idUE: String(ue1.id), idPromo: "P1" }),
|
||||
makeEmployeeContext({
|
||||
idModule: "M1",
|
||||
idUE: String(ue1.id),
|
||||
idPromo: "P1",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const body = await res.json();
|
||||
@@ -187,12 +211,17 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ue_modules: PUT /ue-modules/:idModule/:idUE/:idPromo 403 for non-employee",
|
||||
name:
|
||||
"e2e ue_modules: PUT /ue-modules/:idModule/:idUE/:idPromo 403 for non-employee",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await ueModuleHandler.PUT!(
|
||||
makeJsonRequest("/ue-modules/M1/1/P1", "PUT", { coeff: 5.0 }),
|
||||
makeContextWithAffiliation("student", { idModule: "M1", idUE: "1", idPromo: "P1" }),
|
||||
makeContextWithAffiliation("student", {
|
||||
idModule: "M1",
|
||||
idUE: "1",
|
||||
idPromo: "P1",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 403);
|
||||
},
|
||||
@@ -201,7 +230,8 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ue_modules: PUT /ue-modules/:idModule/:idUE/:idPromo 404 when not found",
|
||||
name:
|
||||
"e2e ue_modules: PUT /ue-modules/:idModule/:idUE/:idPromo 404 when not found",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await ueModuleHandler.PUT!(
|
||||
@@ -217,7 +247,8 @@ Deno.test({
|
||||
// --- DELETE /ue-modules/:idModule/:idUE/:idPromo ---
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ue_modules: DELETE /ue-modules/:idModule/:idUE/:idPromo deletes only targeted row (employee)",
|
||||
name:
|
||||
"e2e ue_modules: DELETE /ue-modules/:idModule/:idUE/:idPromo deletes only targeted row (employee)",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }, { id: "P2" }]);
|
||||
@@ -230,7 +261,11 @@ Deno.test({
|
||||
]);
|
||||
const res = await ueModuleHandler.DELETE!(
|
||||
makeGetRequest(`/ue-modules/M1/${ue1.id}/P1`),
|
||||
makeEmployeeContext({ idModule: "M1", idUE: String(ue1.id), idPromo: "P1" }),
|
||||
makeEmployeeContext({
|
||||
idModule: "M1",
|
||||
idUE: String(ue1.id),
|
||||
idPromo: "P1",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 204);
|
||||
// L'autre ligne doit toujours exister
|
||||
@@ -243,12 +278,17 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ue_modules: DELETE /ue-modules/:idModule/:idUE/:idPromo 403 for non-employee",
|
||||
name:
|
||||
"e2e ue_modules: DELETE /ue-modules/:idModule/:idUE/:idPromo 403 for non-employee",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await ueModuleHandler.DELETE!(
|
||||
makeGetRequest("/ue-modules/M1/1/P1"),
|
||||
makeContextWithAffiliation("student", { idModule: "M1", idUE: "1", idPromo: "P1" }),
|
||||
makeContextWithAffiliation("student", {
|
||||
idModule: "M1",
|
||||
idUE: "1",
|
||||
idPromo: "P1",
|
||||
}),
|
||||
);
|
||||
assertEquals(res.status, 403);
|
||||
},
|
||||
@@ -257,7 +297,8 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "e2e ue_modules: DELETE /ue-modules/:idModule/:idUE/:idPromo 404 when not found",
|
||||
name:
|
||||
"e2e ue_modules: DELETE /ue-modules/:idModule/:idUE/:idPromo 404 when not found",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await ueModuleHandler.DELETE!(
|
||||
|
||||
+11
-3
@@ -17,7 +17,10 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedUes([{ nom: "UE Informatique" }, { nom: "UE Mathématiques" }]);
|
||||
const res = await uesHandler.GET!(makeGetRequest("/ues"), makeEmployeeContext());
|
||||
const res = await uesHandler.GET!(
|
||||
makeGetRequest("/ues"),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const body = await res.json();
|
||||
assertEquals(body.length, 2);
|
||||
@@ -30,7 +33,10 @@ Deno.test({
|
||||
name: "e2e ues: GET /ues returns empty when no UEs",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await uesHandler.GET!(makeGetRequest("/ues"), makeEmployeeContext());
|
||||
const res = await uesHandler.GET!(
|
||||
makeGetRequest("/ues"),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const body = await res.json();
|
||||
assertEquals(body.length, 0);
|
||||
@@ -113,7 +119,9 @@ Deno.test({
|
||||
await truncateAll();
|
||||
const [ue] = await seedUes([{ nom: "UE Biologie" }]);
|
||||
const res = await ueHandler.PUT!(
|
||||
makeJsonRequest(`/ues/${ue.id}`, "PUT", { nom: "UE Biologie moléculaire" }),
|
||||
makeJsonRequest(`/ues/${ue.id}`, "PUT", {
|
||||
nom: "UE Biologie moléculaire",
|
||||
}),
|
||||
makeEmployeeContext({ idUE: String(ue.id) }),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
|
||||
+28
-6
@@ -24,7 +24,10 @@ Deno.test({
|
||||
{ id: "dupont.jean", nom: "Dupont", prenom: "Jean" },
|
||||
{ id: "martin.alice", nom: "Martin", prenom: "Alice" },
|
||||
]);
|
||||
const res = await usersHandler.GET!(makeGetRequest("/users"), makeEmployeeContext());
|
||||
const res = await usersHandler.GET!(
|
||||
makeGetRequest("/users"),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const body = await res.json();
|
||||
assertEquals(body.length, 2);
|
||||
@@ -38,7 +41,10 @@ Deno.test({
|
||||
name: "e2e users: GET /users returns empty when no users",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await usersHandler.GET!(makeGetRequest("/users"), makeEmployeeContext());
|
||||
const res = await usersHandler.GET!(
|
||||
makeGetRequest("/users"),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const body = await res.json();
|
||||
assertEquals(body.length, 0);
|
||||
@@ -77,7 +83,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await usersHandler.POST!(
|
||||
makeJsonRequest("/users", "POST", { id: "new.user", nom: "New", prenom: "User" }),
|
||||
makeJsonRequest("/users", "POST", {
|
||||
id: "new.user",
|
||||
nom: "New",
|
||||
prenom: "User",
|
||||
}),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 201);
|
||||
@@ -109,7 +119,11 @@ Deno.test({
|
||||
await truncateAll();
|
||||
await seedUsers([{ id: "dupont.jean", nom: "Dupont", prenom: "Jean" }]);
|
||||
const res = await usersHandler.POST!(
|
||||
makeJsonRequest("/users", "POST", { id: "dupont.jean", nom: "Doublon", prenom: "X" }),
|
||||
makeJsonRequest("/users", "POST", {
|
||||
id: "dupont.jean",
|
||||
nom: "Doublon",
|
||||
prenom: "X",
|
||||
}),
|
||||
makeEmployeeContext(),
|
||||
);
|
||||
assertEquals(res.status, 409);
|
||||
@@ -160,7 +174,11 @@ Deno.test({
|
||||
await truncateAll();
|
||||
await seedUsers([{ id: "thomas.eva", nom: "Thomas", prenom: "Eva" }]);
|
||||
const res = await userHandler.PUT!(
|
||||
makeJsonRequest("/users/thomas.eva", "PUT", { nom: "Thomas-Modifié", prenom: "Eva", idRole: null }),
|
||||
makeJsonRequest("/users/thomas.eva", "PUT", {
|
||||
nom: "Thomas-Modifié",
|
||||
prenom: "Eva",
|
||||
idRole: null,
|
||||
}),
|
||||
makeEmployeeContext({ id: "thomas.eva" }),
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
@@ -176,7 +194,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const res = await userHandler.PUT!(
|
||||
makeJsonRequest("/users/ghost.user", "PUT", { nom: "X", prenom: "Y", idRole: null }),
|
||||
makeJsonRequest("/users/ghost.user", "PUT", {
|
||||
nom: "X",
|
||||
prenom: "Y",
|
||||
idRole: null,
|
||||
}),
|
||||
makeEmployeeContext({ id: "ghost.user" }),
|
||||
);
|
||||
assertEquals(res.status, 404);
|
||||
|
||||
@@ -17,7 +17,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Dupont", prenom: "Jean", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Dupont",
|
||||
prenom: "Jean",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [ue] = await seedUes([{ nom: "UE Info" }]);
|
||||
await seedAjustements([{ numEtud: s.numEtud, idUE: ue.id, valeur: 13.0 }]);
|
||||
const rows = await testDb.select().from(ajustements);
|
||||
@@ -32,7 +36,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Martin", prenom: "Alice", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Martin",
|
||||
prenom: "Alice",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [ue] = await seedUes([{ nom: "UE Maths" }]);
|
||||
|
||||
const [created] = await testDb
|
||||
@@ -45,7 +53,9 @@ Deno.test({
|
||||
const row = await testDb
|
||||
.select()
|
||||
.from(ajustements)
|
||||
.where(and(eq(ajustements.numEtud, s.numEtud), eq(ajustements.idUE, ue.id)))
|
||||
.where(
|
||||
and(eq(ajustements.numEtud, s.numEtud), eq(ajustements.idUE, ue.id)),
|
||||
)
|
||||
.then((r) => r[0] ?? null);
|
||||
assertExists(row);
|
||||
assertEquals(row.valeur, 15.5);
|
||||
@@ -55,7 +65,8 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "integration ajustements: get by composite key returns null when not found",
|
||||
name:
|
||||
"integration ajustements: get by composite key returns null when not found",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const row = await testDb
|
||||
@@ -74,11 +85,19 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Durand", prenom: "Claire", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Durand",
|
||||
prenom: "Claire",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [ue] = await seedUes([{ nom: "UE Info" }]);
|
||||
await seedAjustements([{ numEtud: s.numEtud, idUE: ue.id, valeur: 12.0 }]);
|
||||
await assertRejects(() =>
|
||||
testDb.insert(ajustements).values({ numEtud: s.numEtud, idUE: ue.id, valeur: 13.0 })
|
||||
testDb.insert(ajustements).values({
|
||||
numEtud: s.numEtud,
|
||||
idUE: ue.id,
|
||||
valeur: 13.0,
|
||||
})
|
||||
);
|
||||
},
|
||||
sanitizeResources: false,
|
||||
@@ -90,14 +109,20 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Bernard", prenom: "Lucie", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Bernard",
|
||||
prenom: "Lucie",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [ue] = await seedUes([{ nom: "UE Physique" }]);
|
||||
await seedAjustements([{ numEtud: s.numEtud, idUE: ue.id, valeur: 10.0 }]);
|
||||
|
||||
const [updated] = await testDb
|
||||
.update(ajustements)
|
||||
.set({ valeur: 18.0 })
|
||||
.where(and(eq(ajustements.numEtud, s.numEtud), eq(ajustements.idUE, ue.id)))
|
||||
.where(
|
||||
and(eq(ajustements.numEtud, s.numEtud), eq(ajustements.idUE, ue.id)),
|
||||
)
|
||||
.returning();
|
||||
assertEquals(updated.valeur, 18.0);
|
||||
},
|
||||
@@ -110,15 +135,23 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
const [s] = await seedStudents([{ nom: "Thomas", prenom: "Eva", idPromo: "P1" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Thomas",
|
||||
prenom: "Eva",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
const [ue] = await seedUes([{ nom: "UE Chimie" }]);
|
||||
await seedAjustements([{ numEtud: s.numEtud, idUE: ue.id, valeur: 11.0 }]);
|
||||
|
||||
await testDb.delete(ajustements).where(and(eq(ajustements.numEtud, s.numEtud), eq(ajustements.idUE, ue.id)));
|
||||
await testDb.delete(ajustements).where(
|
||||
and(eq(ajustements.numEtud, s.numEtud), eq(ajustements.idUE, ue.id)),
|
||||
);
|
||||
const row = await testDb
|
||||
.select()
|
||||
.from(ajustements)
|
||||
.where(and(eq(ajustements.numEtud, s.numEtud), eq(ajustements.idUE, ue.id)))
|
||||
.where(
|
||||
and(eq(ajustements.numEtud, s.numEtud), eq(ajustements.idUE, ue.id)),
|
||||
)
|
||||
.then((r) => r[0] ?? null);
|
||||
assertEquals(row, null);
|
||||
},
|
||||
|
||||
@@ -63,7 +63,8 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "integration enseignements: get by composite key returns null when not found",
|
||||
name:
|
||||
"integration enseignements: get by composite key returns null when not found",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const row = await testDb
|
||||
@@ -90,9 +91,17 @@ Deno.test({
|
||||
await seedUsers([{ id: "prof.dupont", nom: "Dupont", prenom: "Jean" }]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
await seedEnseignements([{ idProf: "prof.dupont", idModule: "M1", idPromo: "P1" }]);
|
||||
await seedEnseignements([{
|
||||
idProf: "prof.dupont",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
await assertRejects(() =>
|
||||
testDb.insert(enseignements).values({ idProf: "prof.dupont", idModule: "M1", idPromo: "P1" })
|
||||
testDb.insert(enseignements).values({
|
||||
idProf: "prof.dupont",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
})
|
||||
);
|
||||
},
|
||||
sanitizeResources: false,
|
||||
@@ -106,7 +115,11 @@ Deno.test({
|
||||
await seedUsers([{ id: "prof.dupont", nom: "Dupont", prenom: "Jean" }]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
await seedEnseignements([{ idProf: "prof.dupont", idModule: "M1", idPromo: "P1" }]);
|
||||
await seedEnseignements([{
|
||||
idProf: "prof.dupont",
|
||||
idModule: "M1",
|
||||
idPromo: "P1",
|
||||
}]);
|
||||
|
||||
await testDb
|
||||
.delete(enseignements)
|
||||
|
||||
@@ -17,7 +17,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "PROMO-2024" }]);
|
||||
const [s] = await seedStudents([{ nom: "Dupont", prenom: "Jean", idPromo: "PROMO-2024" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Dupont",
|
||||
prenom: "Jean",
|
||||
idPromo: "PROMO-2024",
|
||||
}]);
|
||||
await seedModules([{ id: "MOD101", nom: "Module A" }]);
|
||||
await seedNotes([{ numEtud: s.numEtud, idModule: "MOD101", note: 15.5 }]);
|
||||
const rows = await testDb.select().from(notes);
|
||||
@@ -32,10 +36,18 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "PROMO-2024" }]);
|
||||
const [s] = await seedStudents([{ nom: "Martin", prenom: "Alice", idPromo: "PROMO-2024" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Martin",
|
||||
prenom: "Alice",
|
||||
idPromo: "PROMO-2024",
|
||||
}]);
|
||||
await seedModules([{ id: "MOD102", nom: "Module B" }]);
|
||||
|
||||
const [created] = await testDb.insert(notes).values({ numEtud: s.numEtud, idModule: "MOD102", note: 12.0 }).returning();
|
||||
const [created] = await testDb.insert(notes).values({
|
||||
numEtud: s.numEtud,
|
||||
idModule: "MOD102",
|
||||
note: 12.0,
|
||||
}).returning();
|
||||
assertExists(created);
|
||||
assertEquals(created.note, 12.0);
|
||||
|
||||
@@ -71,11 +83,19 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "PROMO-2024" }]);
|
||||
const [s] = await seedStudents([{ nom: "Durand", prenom: "Claire", idPromo: "PROMO-2024" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Durand",
|
||||
prenom: "Claire",
|
||||
idPromo: "PROMO-2024",
|
||||
}]);
|
||||
await seedModules([{ id: "MOD103", nom: "Module C" }]);
|
||||
await seedNotes([{ numEtud: s.numEtud, idModule: "MOD103", note: 10.0 }]);
|
||||
await assertRejects(() =>
|
||||
testDb.insert(notes).values({ numEtud: s.numEtud, idModule: "MOD103", note: 11.0 })
|
||||
testDb.insert(notes).values({
|
||||
numEtud: s.numEtud,
|
||||
idModule: "MOD103",
|
||||
note: 11.0,
|
||||
})
|
||||
);
|
||||
},
|
||||
sanitizeResources: false,
|
||||
@@ -87,7 +107,11 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "PROMO-2024" }]);
|
||||
const [s] = await seedStudents([{ nom: "Bernard", prenom: "Lucie", idPromo: "PROMO-2024" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Bernard",
|
||||
prenom: "Lucie",
|
||||
idPromo: "PROMO-2024",
|
||||
}]);
|
||||
await seedModules([{ id: "MOD104", nom: "Module D" }]);
|
||||
await seedNotes([{ numEtud: s.numEtud, idModule: "MOD104", note: 8.0 }]);
|
||||
|
||||
@@ -107,11 +131,17 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
await seedPromotions([{ id: "PROMO-2024" }]);
|
||||
const [s] = await seedStudents([{ nom: "Thomas", prenom: "Eva", idPromo: "PROMO-2024" }]);
|
||||
const [s] = await seedStudents([{
|
||||
nom: "Thomas",
|
||||
prenom: "Eva",
|
||||
idPromo: "PROMO-2024",
|
||||
}]);
|
||||
await seedModules([{ id: "MOD105", nom: "Module E" }]);
|
||||
await seedNotes([{ numEtud: s.numEtud, idModule: "MOD105", note: 14.0 }]);
|
||||
|
||||
await testDb.delete(notes).where(and(eq(notes.numEtud, s.numEtud), eq(notes.idModule, "MOD105")));
|
||||
await testDb.delete(notes).where(
|
||||
and(eq(notes.numEtud, s.numEtud), eq(notes.idModule, "MOD105")),
|
||||
);
|
||||
const row = await testDb
|
||||
.select()
|
||||
.from(notes)
|
||||
|
||||
@@ -48,7 +48,13 @@ Deno.test({
|
||||
const row = await testDb
|
||||
.select()
|
||||
.from(ueModules)
|
||||
.where(and(eq(ueModules.idModule, "M1"), eq(ueModules.idUE, ue.id), eq(ueModules.idPromo, "P1")))
|
||||
.where(
|
||||
and(
|
||||
eq(ueModules.idModule, "M1"),
|
||||
eq(ueModules.idUE, ue.id),
|
||||
eq(ueModules.idPromo, "P1"),
|
||||
),
|
||||
)
|
||||
.then((r) => r[0] ?? null);
|
||||
assertExists(row);
|
||||
assertEquals(row.coeff, 4.0);
|
||||
@@ -58,13 +64,20 @@ Deno.test({
|
||||
});
|
||||
|
||||
Deno.test({
|
||||
name: "integration ue_modules: get by composite key returns null when not found",
|
||||
name:
|
||||
"integration ue_modules: get by composite key returns null when not found",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const row = await testDb
|
||||
.select()
|
||||
.from(ueModules)
|
||||
.where(and(eq(ueModules.idModule, "GHOST"), eq(ueModules.idUE, 99), eq(ueModules.idPromo, "GHOST")))
|
||||
.where(
|
||||
and(
|
||||
eq(ueModules.idModule, "GHOST"),
|
||||
eq(ueModules.idUE, 99),
|
||||
eq(ueModules.idPromo, "GHOST"),
|
||||
),
|
||||
)
|
||||
.then((r) => r[0] ?? null);
|
||||
assertEquals(row, null);
|
||||
},
|
||||
@@ -79,9 +92,19 @@ Deno.test({
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
const [ue] = await seedUes([{ nom: "UE Info" }]);
|
||||
await seedUeModules([{ idModule: "M1", idUE: ue.id, idPromo: "P1", coeff: 2.0 }]);
|
||||
await seedUeModules([{
|
||||
idModule: "M1",
|
||||
idUE: ue.id,
|
||||
idPromo: "P1",
|
||||
coeff: 2.0,
|
||||
}]);
|
||||
await assertRejects(() =>
|
||||
testDb.insert(ueModules).values({ idModule: "M1", idUE: ue.id, idPromo: "P1", coeff: 5.0 })
|
||||
testDb.insert(ueModules).values({
|
||||
idModule: "M1",
|
||||
idUE: ue.id,
|
||||
idPromo: "P1",
|
||||
coeff: 5.0,
|
||||
})
|
||||
);
|
||||
},
|
||||
sanitizeResources: false,
|
||||
@@ -95,12 +118,23 @@ Deno.test({
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
const [ue] = await seedUes([{ nom: "UE Info" }]);
|
||||
await seedUeModules([{ idModule: "M1", idUE: ue.id, idPromo: "P1", coeff: 2.0 }]);
|
||||
await seedUeModules([{
|
||||
idModule: "M1",
|
||||
idUE: ue.id,
|
||||
idPromo: "P1",
|
||||
coeff: 2.0,
|
||||
}]);
|
||||
|
||||
const [updated] = await testDb
|
||||
.update(ueModules)
|
||||
.set({ coeff: 6.0 })
|
||||
.where(and(eq(ueModules.idModule, "M1"), eq(ueModules.idUE, ue.id), eq(ueModules.idPromo, "P1")))
|
||||
.where(
|
||||
and(
|
||||
eq(ueModules.idModule, "M1"),
|
||||
eq(ueModules.idUE, ue.id),
|
||||
eq(ueModules.idPromo, "P1"),
|
||||
),
|
||||
)
|
||||
.returning();
|
||||
assertEquals(updated.coeff, 6.0);
|
||||
},
|
||||
@@ -115,15 +149,32 @@ Deno.test({
|
||||
await seedPromotions([{ id: "P1" }]);
|
||||
await seedModules([{ id: "M1", nom: "Mod A" }]);
|
||||
const [ue] = await seedUes([{ nom: "UE Info" }]);
|
||||
await seedUeModules([{ idModule: "M1", idUE: ue.id, idPromo: "P1", coeff: 2.0 }]);
|
||||
await seedUeModules([{
|
||||
idModule: "M1",
|
||||
idUE: ue.id,
|
||||
idPromo: "P1",
|
||||
coeff: 2.0,
|
||||
}]);
|
||||
|
||||
await testDb
|
||||
.delete(ueModules)
|
||||
.where(and(eq(ueModules.idModule, "M1"), eq(ueModules.idUE, ue.id), eq(ueModules.idPromo, "P1")));
|
||||
.where(
|
||||
and(
|
||||
eq(ueModules.idModule, "M1"),
|
||||
eq(ueModules.idUE, ue.id),
|
||||
eq(ueModules.idPromo, "P1"),
|
||||
),
|
||||
);
|
||||
const row = await testDb
|
||||
.select()
|
||||
.from(ueModules)
|
||||
.where(and(eq(ueModules.idModule, "M1"), eq(ueModules.idUE, ue.id), eq(ueModules.idPromo, "P1")))
|
||||
.where(
|
||||
and(
|
||||
eq(ueModules.idModule, "M1"),
|
||||
eq(ueModules.idUE, ue.id),
|
||||
eq(ueModules.idPromo, "P1"),
|
||||
),
|
||||
)
|
||||
.then((r) => r[0] ?? null);
|
||||
assertEquals(row, null);
|
||||
},
|
||||
|
||||
@@ -21,12 +21,14 @@ Deno.test({
|
||||
name: "integration ues: create and retrieve by id",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const [created] = await testDb.insert(ues).values({ nom: "UE Physique" }).returning();
|
||||
const [created] = await testDb.insert(ues).values({ nom: "UE Physique" })
|
||||
.returning();
|
||||
assertExists(created);
|
||||
assertExists(created.id);
|
||||
assertEquals(created.nom, "UE Physique");
|
||||
|
||||
const row = await testDb.select().from(ues).where(eq(ues.id, created.id)).then((r) => r[0] ?? null);
|
||||
const row = await testDb.select().from(ues).where(eq(ues.id, created.id))
|
||||
.then((r) => r[0] ?? null);
|
||||
assertExists(row);
|
||||
assertEquals(row.nom, "UE Physique");
|
||||
},
|
||||
@@ -38,7 +40,9 @@ Deno.test({
|
||||
name: "integration ues: get by id returns null when not found",
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const row = await testDb.select().from(ues).where(eq(ues.id, 99999)).then((r) => r[0] ?? null);
|
||||
const row = await testDb.select().from(ues).where(eq(ues.id, 99999)).then((
|
||||
r,
|
||||
) => r[0] ?? null);
|
||||
assertEquals(row, null);
|
||||
},
|
||||
sanitizeResources: false,
|
||||
@@ -50,7 +54,9 @@ Deno.test({
|
||||
async fn() {
|
||||
await truncateAll();
|
||||
const [ue] = await seedUes([{ nom: "UE Chimie" }]);
|
||||
const [updated] = await testDb.update(ues).set({ nom: "UE Chimie organique" }).where(eq(ues.id, ue.id)).returning();
|
||||
const [updated] = await testDb.update(ues).set({
|
||||
nom: "UE Chimie organique",
|
||||
}).where(eq(ues.id, ue.id)).returning();
|
||||
assertEquals(updated.nom, "UE Chimie organique");
|
||||
},
|
||||
sanitizeResources: false,
|
||||
@@ -63,7 +69,9 @@ Deno.test({
|
||||
await truncateAll();
|
||||
const [ue] = await seedUes([{ nom: "UE à supprimer" }]);
|
||||
await testDb.delete(ues).where(eq(ues.id, ue.id));
|
||||
const row = await testDb.select().from(ues).where(eq(ues.id, ue.id)).then((r) => r[0] ?? null);
|
||||
const row = await testDb.select().from(ues).where(eq(ues.id, ue.id)).then((
|
||||
r,
|
||||
) => r[0] ?? null);
|
||||
assertEquals(row, null);
|
||||
},
|
||||
sanitizeResources: false,
|
||||
@@ -80,4 +88,3 @@ Deno.test({
|
||||
sanitizeResources: false,
|
||||
sanitizeOps: false,
|
||||
});
|
||||
|
||||
|
||||
@@ -32,7 +32,9 @@ Deno.test("mock API: GET /ajustements?numEtud filters by student", async () => {
|
||||
const filtered = ajustements.filter((a) => a.numEtud === 21212006);
|
||||
mockFetch({ "/ajustements": filtered });
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ajustements?numEtud=21212006");
|
||||
const res = await fetch(
|
||||
"http://localhost/api/ajustements?numEtud=21212006",
|
||||
);
|
||||
const data: Ajustement[] = await res.json();
|
||||
assertEquals(data.length, 1);
|
||||
assertEquals(data[0].numEtud, 21212006);
|
||||
@@ -53,7 +55,9 @@ Deno.test("mock API: GET /ajustements?numEtud=NaN returns 400", async () => {
|
||||
|
||||
Deno.test("mock API: POST /ajustements creates ajustement (201) as employee", async () => {
|
||||
const newAjust: Ajustement = { numEtud: 21212007, idUE: 2, valeur: 14.0 };
|
||||
mockFetch({ "/ajustements": { method: "POST", status: 201, body: newAjust } });
|
||||
mockFetch({
|
||||
"/ajustements": { method: "POST", status: 201, body: newAjust },
|
||||
});
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ajustements", {
|
||||
method: "POST",
|
||||
@@ -72,7 +76,9 @@ Deno.test("mock API: POST /ajustements creates ajustement (201) as employee", as
|
||||
Deno.test("mock API: POST /ajustements 403 for non-employee", async () => {
|
||||
mockFetch({ "/ajustements": { method: "POST", status: 403 } });
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ajustements", { method: "POST" });
|
||||
const res = await fetch("http://localhost/api/ajustements", {
|
||||
method: "POST",
|
||||
});
|
||||
assertEquals(res.status, 403);
|
||||
} finally {
|
||||
restoreFetch();
|
||||
@@ -116,7 +122,12 @@ Deno.test("mock API: GET /ajustements/:numEtud/:idUE 403 for non-employee", asyn
|
||||
});
|
||||
|
||||
Deno.test("mock API: GET /ajustements/:numEtud/:idUE 404 when not found", async () => {
|
||||
mockFetch({ "/ajustements/99999/9": { status: 404, body: { error: "Ajustement introuvable" } } });
|
||||
mockFetch({
|
||||
"/ajustements/99999/9": {
|
||||
status: 404,
|
||||
body: { error: "Ajustement introuvable" },
|
||||
},
|
||||
});
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ajustements/99999/9");
|
||||
assertEquals(res.status, 404);
|
||||
@@ -127,7 +138,9 @@ Deno.test("mock API: GET /ajustements/:numEtud/:idUE 404 when not found", async
|
||||
|
||||
Deno.test("mock API: PUT /ajustements/:numEtud/:idUE updates valeur", async () => {
|
||||
const updated: Ajustement = { ...ajustements[0], valeur: 18.0 };
|
||||
mockFetch({ "/ajustements/21212006/1": { method: "PUT", status: 200, body: updated } });
|
||||
mockFetch({
|
||||
"/ajustements/21212006/1": { method: "PUT", status: 200, body: updated },
|
||||
});
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ajustements/21212006/1", {
|
||||
method: "PUT",
|
||||
@@ -145,7 +158,9 @@ Deno.test("mock API: PUT /ajustements/:numEtud/:idUE updates valeur", async () =
|
||||
Deno.test("mock API: DELETE /ajustements/:numEtud/:idUE returns 204", async () => {
|
||||
mockFetch({ "/ajustements/21212006/1": { method: "DELETE", status: 204 } });
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ajustements/21212006/1", { method: "DELETE" });
|
||||
const res = await fetch("http://localhost/api/ajustements/21212006/1", {
|
||||
method: "DELETE",
|
||||
});
|
||||
assertEquals(res.status, 204);
|
||||
} finally {
|
||||
restoreFetch();
|
||||
@@ -156,34 +171,54 @@ Deno.test("mock API: DELETE /ajustements/:numEtud/:idUE returns 204", async () =
|
||||
|
||||
Deno.test("mock DB: find ajustement by composite key", () => {
|
||||
const db = createMockDb({ tables: { ajustements: [...ajustements] } });
|
||||
const a = db.findOne<Ajustement>("ajustements", (a) => a.numEtud === 21212006 && a.idUE === 1);
|
||||
const a = db.findOne<Ajustement>(
|
||||
"ajustements",
|
||||
(a) => a.numEtud === 21212006 && a.idUE === 1,
|
||||
);
|
||||
assertExists(a);
|
||||
assertEquals(a.valeur, 13.25);
|
||||
});
|
||||
|
||||
Deno.test("mock DB: filter ajustements by numEtud", () => {
|
||||
const db = createMockDb({ tables: { ajustements: [...ajustements] } });
|
||||
const rows = db.findMany<Ajustement>("ajustements", (a) => a.numEtud === 21212006);
|
||||
const rows = db.findMany<Ajustement>(
|
||||
"ajustements",
|
||||
(a) => a.numEtud === 21212006,
|
||||
);
|
||||
assertEquals(rows.length, 1);
|
||||
});
|
||||
|
||||
Deno.test("mock DB: insert ajustement", () => {
|
||||
const db = createMockDb({ tables: { ajustements: [...ajustements] } });
|
||||
db.insert<Ajustement>("ajustements", { numEtud: 21212007, idUE: 2, valeur: 14.0 });
|
||||
db.insert<Ajustement>("ajustements", {
|
||||
numEtud: 21212007,
|
||||
idUE: 2,
|
||||
valeur: 14.0,
|
||||
});
|
||||
assertEquals(db.getTable("ajustements").length, 3);
|
||||
});
|
||||
|
||||
Deno.test("mock DB: update ajustement valeur", () => {
|
||||
const db = createMockDb({ tables: { ajustements: [...ajustements] } });
|
||||
db.updateWhere<Ajustement>("ajustements", (a) => a.numEtud === 21212006 && a.idUE === 1, { valeur: 20.0 });
|
||||
db.updateWhere<Ajustement>(
|
||||
"ajustements",
|
||||
(a) => a.numEtud === 21212006 && a.idUE === 1,
|
||||
{ valeur: 20.0 },
|
||||
);
|
||||
assertEquals(
|
||||
db.findOne<Ajustement>("ajustements", (a) => a.numEtud === 21212006 && a.idUE === 1)?.valeur,
|
||||
db.findOne<Ajustement>(
|
||||
"ajustements",
|
||||
(a) => a.numEtud === 21212006 && a.idUE === 1,
|
||||
)?.valeur,
|
||||
20.0,
|
||||
);
|
||||
});
|
||||
|
||||
Deno.test("mock DB: delete ajustement", () => {
|
||||
const db = createMockDb({ tables: { ajustements: [...ajustements] } });
|
||||
db.deleteWhere<Ajustement>("ajustements", (a) => a.numEtud === 21212006 && a.idUE === 1);
|
||||
db.deleteWhere<Ajustement>(
|
||||
"ajustements",
|
||||
(a) => a.numEtud === 21212006 && a.idUE === 1,
|
||||
);
|
||||
assertEquals(db.getTable("ajustements").length, 1);
|
||||
});
|
||||
|
||||
@@ -22,8 +22,14 @@ Deno.test("enseignements: fixtures have correct shape", () => {
|
||||
// --- 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 } });
|
||||
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",
|
||||
@@ -41,7 +47,9 @@ Deno.test("mock API: POST /enseignements creates enseignement (201) as employee"
|
||||
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" });
|
||||
const res = await fetch("http://localhost/api/enseignements", {
|
||||
method: "POST",
|
||||
});
|
||||
assertEquals(res.status, 403);
|
||||
} finally {
|
||||
restoreFetch();
|
||||
@@ -64,13 +72,21 @@ Deno.test("mock API: POST /enseignements 400 on missing fields", async () => {
|
||||
|
||||
Deno.test("mock API: POST /enseignements 409 on duplicate", async () => {
|
||||
mockFetch({
|
||||
"/enseignements": { method: "POST", status: 409, body: { error: "Cet enseignement existe déjà." } },
|
||||
"/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" }),
|
||||
body: JSON.stringify({
|
||||
idProf: "prof.dupont",
|
||||
idModule: "JIN702C",
|
||||
idPromo: "4AFISE25/26",
|
||||
}),
|
||||
});
|
||||
assertEquals(res.status, 409);
|
||||
const data = await res.json();
|
||||
@@ -81,10 +97,16 @@ Deno.test("mock API: POST /enseignements 409 on duplicate", async () => {
|
||||
});
|
||||
|
||||
Deno.test("mock API: GET /enseignements/:idProf/:idModule/:idPromo returns enseignement (employee)", async () => {
|
||||
const ens: Enseignement = { idProf: "prof.dupont", idModule: "JIN702C", idPromo: "4AFISE25/26" };
|
||||
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");
|
||||
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");
|
||||
@@ -97,7 +119,9 @@ Deno.test("mock API: GET /enseignements/:idProf/:idModule/:idPromo returns ensei
|
||||
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");
|
||||
const res = await fetch(
|
||||
"http://localhost/api/enseignements/prof.dupont/JIN702C/4AFISE25%2F26",
|
||||
);
|
||||
assertEquals(res.status, 403);
|
||||
} finally {
|
||||
restoreFetch();
|
||||
@@ -105,9 +129,16 @@ Deno.test("mock API: GET /enseignements/:idProf/:idModule/:idPromo 403 for non-e
|
||||
});
|
||||
|
||||
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" } } });
|
||||
mockFetch({
|
||||
"/enseignements/ghost/GHOST/GHOST": {
|
||||
status: 404,
|
||||
body: { error: "Ressource introuvable" },
|
||||
},
|
||||
});
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/enseignements/ghost/GHOST/GHOST");
|
||||
const res = await fetch(
|
||||
"http://localhost/api/enseignements/ghost/GHOST/GHOST",
|
||||
);
|
||||
assertEquals(res.status, 404);
|
||||
} finally {
|
||||
restoreFetch();
|
||||
@@ -115,11 +146,19 @@ Deno.test("mock API: GET /enseignements/:idProf/:idModule/:idPromo 404 when not
|
||||
});
|
||||
|
||||
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", {
|
||||
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();
|
||||
@@ -127,11 +166,19 @@ Deno.test("mock API: DELETE /enseignements/:idProf/:idModule/:idPromo returns 20
|
||||
});
|
||||
|
||||
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", {
|
||||
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();
|
||||
@@ -146,14 +193,21 @@ Deno.test("mock DB: find enseignement by composite key", () => {
|
||||
{ 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");
|
||||
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" });
|
||||
db.insert<Enseignement>("enseignements", {
|
||||
idProf: "prof.dupont",
|
||||
idModule: "JIN702C",
|
||||
idPromo: "4AFISE25/26",
|
||||
});
|
||||
assertEquals(db.getTable("enseignements").length, 1);
|
||||
});
|
||||
|
||||
@@ -163,7 +217,10 @@ Deno.test("mock DB: delete enseignement", () => {
|
||||
{ idProf: "prof.moreau", idModule: "JIN703C", idPromo: "4AFISE25/26" },
|
||||
];
|
||||
const db = createMockDb({ tables: { enseignements: data } });
|
||||
db.deleteWhere<Enseignement>("enseignements", (e) => e.idProf === "prof.dupont");
|
||||
db.deleteWhere<Enseignement>(
|
||||
"enseignements",
|
||||
(e) => e.idProf === "prof.dupont",
|
||||
);
|
||||
assertEquals(db.getTable("enseignements").length, 1);
|
||||
});
|
||||
|
||||
@@ -174,6 +231,9 @@ Deno.test("mock DB: filter enseignements by idModule", () => {
|
||||
{ idProf: "prof.moreau", idModule: "JIN703C", idPromo: "4AFISE25/26" },
|
||||
];
|
||||
const db = createMockDb({ tables: { enseignements: data } });
|
||||
const rows = db.findMany<Enseignement>("enseignements", (e) => e.idModule === "JIN702C");
|
||||
const rows = db.findMany<Enseignement>(
|
||||
"enseignements",
|
||||
(e) => e.idModule === "JIN702C",
|
||||
);
|
||||
assertEquals(rows.length, 2);
|
||||
});
|
||||
|
||||
@@ -113,7 +113,12 @@ Deno.test("mock API: GET /notes/:numEtud/:idModule returns note", async () => {
|
||||
});
|
||||
|
||||
Deno.test("mock API: GET /notes/:numEtud/:idModule 404 when not found", async () => {
|
||||
mockFetch({ "/notes/99999/GHOST": { status: 404, body: { error: "Ressource introuvable" } } });
|
||||
mockFetch({
|
||||
"/notes/99999/GHOST": {
|
||||
status: 404,
|
||||
body: { error: "Ressource introuvable" },
|
||||
},
|
||||
});
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/notes/99999/GHOST");
|
||||
assertEquals(res.status, 404);
|
||||
@@ -124,7 +129,9 @@ Deno.test("mock API: GET /notes/:numEtud/:idModule 404 when not found", async ()
|
||||
|
||||
Deno.test("mock API: PUT /notes/:numEtud/:idModule updates note", async () => {
|
||||
const updated: Note = { ...notes[0], note: 17.0 };
|
||||
mockFetch({ "/notes/21212006/JIN702C": { method: "PUT", status: 200, body: updated } });
|
||||
mockFetch({
|
||||
"/notes/21212006/JIN702C": { method: "PUT", status: 200, body: updated },
|
||||
});
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/notes/21212006/JIN702C", {
|
||||
method: "PUT",
|
||||
@@ -142,7 +149,9 @@ Deno.test("mock API: PUT /notes/:numEtud/:idModule updates note", async () => {
|
||||
Deno.test("mock API: DELETE /notes/:numEtud/:idModule returns 204", async () => {
|
||||
mockFetch({ "/notes/21212006/JIN702C": { method: "DELETE", status: 204 } });
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/notes/21212006/JIN702C", { method: "DELETE" });
|
||||
const res = await fetch("http://localhost/api/notes/21212006/JIN702C", {
|
||||
method: "DELETE",
|
||||
});
|
||||
assertEquals(res.status, 204);
|
||||
} finally {
|
||||
restoreFetch();
|
||||
@@ -152,7 +161,9 @@ Deno.test("mock API: DELETE /notes/:numEtud/:idModule returns 204", async () =>
|
||||
Deno.test("mock API: DELETE /notes/:numEtud/:idModule 404 when not found", async () => {
|
||||
mockFetch({ "/notes/99999/GHOST": { method: "DELETE", status: 404 } });
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/notes/99999/GHOST", { method: "DELETE" });
|
||||
const res = await fetch("http://localhost/api/notes/99999/GHOST", {
|
||||
method: "DELETE",
|
||||
});
|
||||
assertEquals(res.status, 404);
|
||||
} finally {
|
||||
restoreFetch();
|
||||
@@ -163,7 +174,10 @@ Deno.test("mock API: DELETE /notes/:numEtud/:idModule 404 when not found", async
|
||||
|
||||
Deno.test("mock DB: find note by composite key", () => {
|
||||
const db = createMockDb({ tables: { notes: [...notes] } });
|
||||
const n = db.findOne<Note>("notes", (n) => n.numEtud === 21212006 && n.idModule === "JIN702C");
|
||||
const n = db.findOne<Note>(
|
||||
"notes",
|
||||
(n) => n.numEtud === 21212006 && n.idModule === "JIN702C",
|
||||
);
|
||||
assertExists(n);
|
||||
assertEquals(n.note, 15.5);
|
||||
});
|
||||
@@ -176,21 +190,35 @@ Deno.test("mock DB: filter notes by numEtud", () => {
|
||||
|
||||
Deno.test("mock DB: insert note", () => {
|
||||
const db = createMockDb({ tables: { notes: [...notes] } });
|
||||
db.insert<Note>("notes", { note: 10.0, numEtud: 21212006, idModule: "JIN704C" });
|
||||
db.insert<Note>("notes", {
|
||||
note: 10.0,
|
||||
numEtud: 21212006,
|
||||
idModule: "JIN704C",
|
||||
});
|
||||
assertEquals(db.getTable("notes").length, 5);
|
||||
});
|
||||
|
||||
Deno.test("mock DB: update note value", () => {
|
||||
const db = createMockDb({ tables: { notes: [...notes] } });
|
||||
db.updateWhere<Note>("notes", (n) => n.numEtud === 21212006 && n.idModule === "JIN702C", { note: 20.0 });
|
||||
db.updateWhere<Note>(
|
||||
"notes",
|
||||
(n) => n.numEtud === 21212006 && n.idModule === "JIN702C",
|
||||
{ note: 20.0 },
|
||||
);
|
||||
assertEquals(
|
||||
db.findOne<Note>("notes", (n) => n.numEtud === 21212006 && n.idModule === "JIN702C")?.note,
|
||||
db.findOne<Note>(
|
||||
"notes",
|
||||
(n) => n.numEtud === 21212006 && n.idModule === "JIN702C",
|
||||
)?.note,
|
||||
20.0,
|
||||
);
|
||||
});
|
||||
|
||||
Deno.test("mock DB: delete note", () => {
|
||||
const db = createMockDb({ tables: { notes: [...notes] } });
|
||||
db.deleteWhere<Note>("notes", (n) => n.numEtud === 21212006 && n.idModule === "JIN702C");
|
||||
db.deleteWhere<Note>(
|
||||
"notes",
|
||||
(n) => n.numEtud === 21212006 && n.idModule === "JIN702C",
|
||||
);
|
||||
assertEquals(db.getTable("notes").length, 3);
|
||||
});
|
||||
|
||||
@@ -33,7 +33,9 @@ Deno.test("mock API: GET /ue-modules?idPromo filters by promo", async () => {
|
||||
const filtered = ueModules.filter((u) => u.idPromo === "4AFISE25/26");
|
||||
mockFetch({ "/ue-modules": filtered });
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ue-modules?idPromo=4AFISE25%2F26");
|
||||
const res = await fetch(
|
||||
"http://localhost/api/ue-modules?idPromo=4AFISE25%2F26",
|
||||
);
|
||||
const data: UeModule[] = await res.json();
|
||||
assertEquals(data.length, 2);
|
||||
assertEquals(data.every((u) => u.idPromo === "4AFISE25/26"), true);
|
||||
@@ -56,8 +58,15 @@ Deno.test("mock API: GET /ue-modules?idUE filters by UE", async () => {
|
||||
});
|
||||
|
||||
Deno.test("mock API: POST /ue-modules creates association (201)", async () => {
|
||||
const newUeModule: UeModule = { idModule: "JIN705C", idUE: 2, idPromo: "3AFISE25/26", coeff: 3.0 };
|
||||
mockFetch({ "/ue-modules": { method: "POST", status: 201, body: newUeModule } });
|
||||
const newUeModule: UeModule = {
|
||||
idModule: "JIN705C",
|
||||
idUE: 2,
|
||||
idPromo: "3AFISE25/26",
|
||||
coeff: 3.0,
|
||||
};
|
||||
mockFetch({
|
||||
"/ue-modules": { method: "POST", status: 201, body: newUeModule },
|
||||
});
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ue-modules", {
|
||||
method: "POST",
|
||||
@@ -90,7 +99,9 @@ Deno.test("mock API: POST /ue-modules 400 on missing fields", async () => {
|
||||
Deno.test("mock API: GET /ue-modules/:idModule/:idUE/:idPromo returns association (employee)", async () => {
|
||||
mockFetch({ "/ue-modules/JIN702C/1/4AFISE25": ueModules[0] });
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ue-modules/JIN702C/1/4AFISE25%2F26");
|
||||
const res = await fetch(
|
||||
"http://localhost/api/ue-modules/JIN702C/1/4AFISE25%2F26",
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const data: UeModule = await res.json();
|
||||
assertEquals(data.coeff, 3.0);
|
||||
@@ -102,7 +113,9 @@ Deno.test("mock API: GET /ue-modules/:idModule/:idUE/:idPromo returns associatio
|
||||
Deno.test("mock API: GET /ue-modules/:idModule/:idUE/:idPromo 403 for non-employee", async () => {
|
||||
mockFetch({ "/ue-modules/JIN702C/1/4AFISE25": { status: 403 } });
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ue-modules/JIN702C/1/4AFISE25%2F26");
|
||||
const res = await fetch(
|
||||
"http://localhost/api/ue-modules/JIN702C/1/4AFISE25%2F26",
|
||||
);
|
||||
assertEquals(res.status, 403);
|
||||
} finally {
|
||||
restoreFetch();
|
||||
@@ -111,13 +124,22 @@ Deno.test("mock API: GET /ue-modules/:idModule/:idUE/:idPromo 403 for non-employ
|
||||
|
||||
Deno.test("mock API: PUT /ue-modules/:idModule/:idUE/:idPromo updates coeff", async () => {
|
||||
const updated: UeModule = { ...ueModules[0], coeff: 5.0 };
|
||||
mockFetch({ "/ue-modules/JIN702C/1/4AFISE25": { method: "PUT", status: 200, body: updated } });
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ue-modules/JIN702C/1/4AFISE25%2F26", {
|
||||
mockFetch({
|
||||
"/ue-modules/JIN702C/1/4AFISE25": {
|
||||
method: "PUT",
|
||||
headers: { "content-type": "application/json" },
|
||||
body: JSON.stringify({ coeff: 5.0 }),
|
||||
});
|
||||
status: 200,
|
||||
body: updated,
|
||||
},
|
||||
});
|
||||
try {
|
||||
const res = await fetch(
|
||||
"http://localhost/api/ue-modules/JIN702C/1/4AFISE25%2F26",
|
||||
{
|
||||
method: "PUT",
|
||||
headers: { "content-type": "application/json" },
|
||||
body: JSON.stringify({ coeff: 5.0 }),
|
||||
},
|
||||
);
|
||||
assertEquals(res.status, 200);
|
||||
const data: UeModule = await res.json();
|
||||
assertEquals(data.coeff, 5.0);
|
||||
@@ -127,9 +149,14 @@ Deno.test("mock API: PUT /ue-modules/:idModule/:idUE/:idPromo updates coeff", as
|
||||
});
|
||||
|
||||
Deno.test("mock API: DELETE /ue-modules/:idModule/:idUE/:idPromo returns 204", async () => {
|
||||
mockFetch({ "/ue-modules/JIN702C/1/4AFISE25": { method: "DELETE", status: 204 } });
|
||||
mockFetch({
|
||||
"/ue-modules/JIN702C/1/4AFISE25": { method: "DELETE", status: 204 },
|
||||
});
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ue-modules/JIN702C/1/4AFISE25%2F26", { method: "DELETE" });
|
||||
const res = await fetch(
|
||||
"http://localhost/api/ue-modules/JIN702C/1/4AFISE25%2F26",
|
||||
{ method: "DELETE" },
|
||||
);
|
||||
assertEquals(res.status, 204);
|
||||
} finally {
|
||||
restoreFetch();
|
||||
@@ -140,34 +167,56 @@ Deno.test("mock API: DELETE /ue-modules/:idModule/:idUE/:idPromo returns 204", a
|
||||
|
||||
Deno.test("mock DB: find ue-module by composite key", () => {
|
||||
const db = createMockDb({ tables: { ueModules: [...ueModules] } });
|
||||
const u = db.findOne<UeModule>("ueModules", (u) => u.idModule === "JIN702C" && u.idUE === 1 && u.idPromo === "4AFISE25/26");
|
||||
const u = db.findOne<UeModule>(
|
||||
"ueModules",
|
||||
(u) =>
|
||||
u.idModule === "JIN702C" && u.idUE === 1 && u.idPromo === "4AFISE25/26",
|
||||
);
|
||||
assertExists(u);
|
||||
assertEquals(u.coeff, 3.0);
|
||||
});
|
||||
|
||||
Deno.test("mock DB: filter ue-modules by promo", () => {
|
||||
const db = createMockDb({ tables: { ueModules: [...ueModules] } });
|
||||
const rows = db.findMany<UeModule>("ueModules", (u) => u.idPromo === "4AFISE25/26");
|
||||
const rows = db.findMany<UeModule>(
|
||||
"ueModules",
|
||||
(u) => u.idPromo === "4AFISE25/26",
|
||||
);
|
||||
assertEquals(rows.length, 2);
|
||||
});
|
||||
|
||||
Deno.test("mock DB: insert ue-module", () => {
|
||||
const db = createMockDb({ tables: { ueModules: [...ueModules] } });
|
||||
db.insert<UeModule>("ueModules", { idModule: "JIN705C", idUE: 2, idPromo: "3AFISE25/26", coeff: 1.5 });
|
||||
db.insert<UeModule>("ueModules", {
|
||||
idModule: "JIN705C",
|
||||
idUE: 2,
|
||||
idPromo: "3AFISE25/26",
|
||||
coeff: 1.5,
|
||||
});
|
||||
assertEquals(db.getTable("ueModules").length, 4);
|
||||
});
|
||||
|
||||
Deno.test("mock DB: update ue-module coeff", () => {
|
||||
const db = createMockDb({ tables: { ueModules: [...ueModules] } });
|
||||
db.updateWhere<UeModule>("ueModules", (u) => u.idModule === "JIN702C" && u.idUE === 1, { coeff: 6.0 });
|
||||
db.updateWhere<UeModule>(
|
||||
"ueModules",
|
||||
(u) => u.idModule === "JIN702C" && u.idUE === 1,
|
||||
{ coeff: 6.0 },
|
||||
);
|
||||
assertEquals(
|
||||
db.findOne<UeModule>("ueModules", (u) => u.idModule === "JIN702C" && u.idUE === 1)?.coeff,
|
||||
db.findOne<UeModule>(
|
||||
"ueModules",
|
||||
(u) => u.idModule === "JIN702C" && u.idUE === 1,
|
||||
)?.coeff,
|
||||
6.0,
|
||||
);
|
||||
});
|
||||
|
||||
Deno.test("mock DB: delete ue-module", () => {
|
||||
const db = createMockDb({ tables: { ueModules: [...ueModules] } });
|
||||
db.deleteWhere<UeModule>("ueModules", (u) => u.idModule === "JIN702C" && u.idUE === 1);
|
||||
db.deleteWhere<UeModule>(
|
||||
"ueModules",
|
||||
(u) => u.idModule === "JIN702C" && u.idUE === 1,
|
||||
);
|
||||
assertEquals(db.getTable("ueModules").length, 2);
|
||||
});
|
||||
|
||||
@@ -42,7 +42,9 @@ Deno.test("mock API: GET /ues/:id returns one UE", async () => {
|
||||
});
|
||||
|
||||
Deno.test("mock API: GET /ues/:id 404 when not found", async () => {
|
||||
mockFetch({ "/ues/99": { status: 404, body: { error: "Ressource introuvable" } } });
|
||||
mockFetch({
|
||||
"/ues/99": { status: 404, body: { error: "Ressource introuvable" } },
|
||||
});
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ues/99");
|
||||
assertEquals(res.status, 404);
|
||||
@@ -125,7 +127,9 @@ Deno.test("mock API: DELETE /ues/:id returns 204", async () => {
|
||||
Deno.test("mock API: DELETE /ues/:id 404 when not found", async () => {
|
||||
mockFetch({ "/ues/99": { method: "DELETE", status: 404 } });
|
||||
try {
|
||||
const res = await fetch("http://localhost/api/ues/99", { method: "DELETE" });
|
||||
const res = await fetch("http://localhost/api/ues/99", {
|
||||
method: "DELETE",
|
||||
});
|
||||
assertEquals(res.status, 404);
|
||||
} finally {
|
||||
restoreFetch();
|
||||
|
||||
Reference in New Issue
Block a user