From e46889ea2a103574271c44209ab9c1e31b39c10e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filippa=20H=C3=B6gn=C3=A4sbacka?= Date: Tue, 25 Nov 2025 10:39:39 +0000 Subject: [PATCH] added tests for multiple choice exercises --- .../api/admin/exercises/multichoice/route.js | 4 +- .../admin/exercises/multichoice/route.test.js | 68 +++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 gradesa/src/app/api/admin/exercises/multichoice/route.test.js diff --git a/gradesa/src/app/api/admin/exercises/multichoice/route.js b/gradesa/src/app/api/admin/exercises/multichoice/route.js index 3566829..30a5d46 100644 --- a/gradesa/src/app/api/admin/exercises/multichoice/route.js +++ b/gradesa/src/app/api/admin/exercises/multichoice/route.js @@ -44,14 +44,14 @@ export async function POST(request) { let contentOrder = 1; for (const item of content) { const contentRes = await DB.pool( - `INSERT INTO multichoice_content + `INSERT INTO multichoice_content (multichoice_exercise_id, content_type, content_value, content_order, correct_answer) VALUES ($1, $2, $3, $4, $5) RETURNING id`, [ multichoice_id, item.type, - item.value ?? null, + item.value ?? "", contentOrder, item.type === "multichoice" ? item.correct : null, ] diff --git a/gradesa/src/app/api/admin/exercises/multichoice/route.test.js b/gradesa/src/app/api/admin/exercises/multichoice/route.test.js new file mode 100644 index 0000000..82d9986 --- /dev/null +++ b/gradesa/src/app/api/admin/exercises/multichoice/route.test.js @@ -0,0 +1,68 @@ +import { describe, it, expect } from "vitest"; +import { POST } from "./route"; +import { useTestDatabase } from "@/backend/test/testdb"; +import { useTestRequest } from "@/backend/test/mock-request"; +import { TestFactory } from "@/backend/test/testfactory"; +import { DB } from "@/backend/db"; +describe("POST /api/admin/exercises/multichoice", () => { + useTestDatabase(); + + it("should create a multichoice exercise with valid input", async () => { + const admin = await TestFactory.user({ is_admin: true }); + const { mockPost } = useTestRequest(admin); + + const validInput = { + title: "Where is Paris located?", + description: "Geography question", + content: [ + { + type: "text", + value: "Select the country where Paris is located", + }, + { + type: "multichoice", + value: null, + correct: "France", + options: ["France", "Germany", "Spain", "Italy"], + }, + ], + }; + + const response = await POST( + mockPost("/api/admin/exercises/multichoice", validInput) + ); + + expect(response.status).toBe(201); + const { exerciseId } = await response.json(); + + const exerciseResult = await DB.pool( + "SELECT * FROM exercises WHERE id = $1", + [exerciseId] + ); + expect(exerciseResult.rows.length).toBe(1); + + const multichoiceExerciseResult = await DB.pool( + "SELECT * FROM multichoice_exercises WHERE exercise_id = $1", + [exerciseId] + ); + expect(multichoiceExerciseResult.rows.length).toBe(1); + + const content = await DB.pool( + "SELECT * FROM multichoice_content WHERE multichoice_exercise_id = $1", + [multichoiceExerciseResult.rows[0].id] + ); + expect(content.rows.length).toBe(2); + + const multichoiceContent = content.rows.find( + (row) => row.content_type === "multichoice" + ); + expect(multichoiceContent).toBeDefined(); + expect(multichoiceContent.content_type).toBe("multichoice"); + + const options = await DB.pool( + "SELECT * FROM multichoice_options WHERE multichoice_content_id = $1", + [multichoiceContent.id] + ); + expect(options.rows.length).toBe(4); + }); +});