// #109 - Integration tests for /students endpoints // Teste les opérations DB directement avec une vraie base de données import { assertEquals, assertExists } from "@std/assert"; import { seedPromotions, seedStudents, testDb, truncateAll, } from "../helpers/db_integration.ts"; import { students } from "$root/databases/schema.ts"; import { eq } from "npm:drizzle-orm@0.45.2"; Deno.test({ name: "integration students: list all students", async fn() { await truncateAll(); await seedPromotions([{ id: "PEIP1-2024" }]); await seedStudents([ { nom: "Dupont", prenom: "Jean", idPromo: "PEIP1-2024" }, { nom: "Martin", prenom: "Alice", idPromo: "PEIP1-2024" }, ]); const rows = await testDb.select().from(students); assertEquals(rows.length, 2); }, sanitizeResources: false, sanitizeOps: false, }); Deno.test({ name: "integration students: filter by idPromo", async fn() { await truncateAll(); await seedPromotions([{ id: "PEIP1-2024" }, { id: "PEIP2-2024" }]); await seedStudents([ { nom: "Dupont", prenom: "Jean", idPromo: "PEIP1-2024" }, { nom: "Martin", prenom: "Alice", idPromo: "PEIP1-2024" }, { nom: "Durand", prenom: "Claire", idPromo: "PEIP2-2024" }, ]); const rows = await testDb .select() .from(students) .where(eq(students.idPromo, "PEIP1-2024")); assertEquals(rows.length, 2); assertEquals(rows.every((s) => s.idPromo === "PEIP1-2024"), true); }, sanitizeResources: false, sanitizeOps: false, }); Deno.test({ name: "integration students: create and retrieve by numEtud", async fn() { await truncateAll(); await seedPromotions([{ id: "INFO3-2024" }]); const [created] = await testDb .insert(students) .values({ nom: "Leroy", prenom: "Paul", idPromo: "INFO3-2024" }) .returning(); assertExists(created.numEtud); const row = await testDb .select() .from(students) .where(eq(students.numEtud, created.numEtud)) .then((r) => r[0] ?? null); assertExists(row); assertEquals(row.nom, "Leroy"); assertEquals(row.idPromo, "INFO3-2024"); }, sanitizeResources: false, sanitizeOps: false, }); Deno.test({ name: "integration students: get by numEtud returns null when not found", async fn() { await truncateAll(); const row = await testDb .select() .from(students) .where(eq(students.numEtud, 999999)) .then((r) => r[0] ?? null); assertEquals(row, null); }, sanitizeResources: false, sanitizeOps: false, }); Deno.test({ name: "integration students: update student fields", async fn() { await truncateAll(); await seedPromotions([{ id: "INFO3-2024" }, { id: "INFO4-2024" }]); const [s] = await seedStudents([ { nom: "Petit", prenom: "Hugo", idPromo: "INFO3-2024" }, ]); const [updated] = await testDb .update(students) .set({ nom: "Grand", idPromo: "INFO4-2024" }) .where(eq(students.numEtud, s.numEtud)) .returning(); assertEquals(updated.nom, "Grand"); assertEquals(updated.idPromo, "INFO4-2024"); }, sanitizeResources: false, sanitizeOps: false, }); Deno.test({ name: "integration students: delete student", async fn() { await truncateAll(); await seedPromotions([{ id: "INFO3-2024" }]); const [s] = await seedStudents([ { nom: "Thomas", prenom: "Eva", idPromo: "INFO3-2024" }, ]); await testDb.delete(students).where(eq(students.numEtud, s.numEtud)); const row = await testDb .select() .from(students) .where(eq(students.numEtud, s.numEtud)) .then((r) => r[0] ?? null); assertEquals(row, null); }, sanitizeResources: false, sanitizeOps: false, }); Deno.test({ name: "integration students: update non-existent student returns empty", async fn() { await truncateAll(); const result = await testDb .update(students) .set({ nom: "Ghost" }) .where(eq(students.numEtud, 999999)) .returning(); assertEquals(result.length, 0); }, sanitizeResources: false, sanitizeOps: false, }); Deno.test({ name: "integration students: delete non-existent student returns empty", async fn() { await truncateAll(); const result = await testDb .delete(students) .where(eq(students.numEtud, 999999)) .returning(); assertEquals(result.length, 0); }, sanitizeResources: false, sanitizeOps: false, });