2025SELab2-project-Dwengo/backend/tests/services/learning-objects/database-learning-object-provider.test.ts

106 lines
5.7 KiB
TypeScript

import {beforeAll, describe, expect, it} from "vitest";
import {setupTestApp} from "../../setup-tests";
import {getLearningObjectRepository, getLearningPathRepository} from "../../../src/data/repositories";
import example from "../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example";
import {LearningObject} from "../../../src/entities/content/learning-object.entity";
import databaseLearningObjectProvider from "../../../src/services/learning-objects/database-learning-object-provider";
import {expectToBeCorrectFilteredLearningObject} from "../../test-utils/expectations";
import {FilteredLearningObject} from "../../../src/interfaces/learning-content";
import {Language} from "../../../src/entities/content/language";
import learningObjectExample from "../../test-assets/learning-objects/pn-werkingnotebooks/pn-werkingnotebooks-example";
import learningPathExample from "../../test-assets/learning-paths/pn-werking-example";
import {LearningPath} from "../../../src/entities/content/learning-path.entity";
async function initExampleData(): Promise<{learningObject: LearningObject, learningPath: LearningPath}> {
const learningObjectRepo = getLearningObjectRepository();
const learningPathRepo = getLearningPathRepository();
let learningObject = learningObjectExample.createLearningObject();
let learningPath = learningPathExample.createLearningPath();
await learningObjectRepo.save(learningObject);
await learningPathRepo.save(learningPath);
return { learningObject, learningPath };
}
const EXPECTED_TITLE_FROM_DWENGO_LEARNING_OBJECT = "Notebook opslaan";
describe("DatabaseLearningObjectProvider", () => {
let exampleLearningObject: LearningObject;
let exampleLearningPath: LearningPath;
beforeAll(async () => {
await setupTestApp();
let exampleData = await initExampleData();
exampleLearningObject = exampleData.learningObject;
exampleLearningPath = exampleData.learningPath;
});
describe("getLearningObjectById", () => {
it("should return the learning object when it is queried by its id", async () => {
const result: FilteredLearningObject | null = await databaseLearningObjectProvider.getLearningObjectById(exampleLearningObject);
expect(result).toBeTruthy();
expectToBeCorrectFilteredLearningObject(result!, exampleLearningObject);
});
it("should return the learning object when it is queried by only hruid and language (but not version)", async () => {
const result: FilteredLearningObject | null = await databaseLearningObjectProvider.getLearningObjectById({
hruid: exampleLearningObject.hruid,
language: exampleLearningObject.language
});
expect(result).toBeTruthy();
expectToBeCorrectFilteredLearningObject(result!, exampleLearningObject);
});
it("should return null when queried with an id that does not exist", async () => {
const result: FilteredLearningObject | null = await databaseLearningObjectProvider.getLearningObjectById({
hruid: "non_existing_hruid",
language: Language.Dutch
});
expect(result).toBeNull();
});
});
describe("getLearningObjectHTML", () => {
it("should return the correct rendering of the learning object", async () => {
const result = await databaseLearningObjectProvider.getLearningObjectHTML(exampleLearningObject);
expect(result).toEqual(example.getHTMLRendering());
});
it("should return null for a non-existing learning object", async () => {
const result = await databaseLearningObjectProvider.getLearningObjectHTML({
hruid: "non_existing_hruid",
language: Language.Dutch
});
expect(result).toBeNull();
});
});
describe("getLearningObjectIdsFromPath", () => {
it("should return all learning object IDs from a path", async () => {
const result = await databaseLearningObjectProvider.getLearningObjectIdsFromPath(exampleLearningPath);
expect(new Set(result))
.toEqual(new Set(exampleLearningPath.nodes.map(it => it.learningObjectHruid)));
});
it("should throw an error if queried with a path identifier for which there is no learning path", async () => {
await expect((async () => {
await databaseLearningObjectProvider.getLearningObjectIdsFromPath({
hruid: "non_existing_hruid",
language: Language.Dutch
});
})()).rejects.toThrowError();
});
});
describe("getLearningObjectsFromPath", () => {
it("should correctly return all learning objects which are on the path, even those who are not in the database", async () => {
const result = await databaseLearningObjectProvider.getLearningObjectsFromPath(exampleLearningPath);
expect(result.length).toBe(exampleLearningPath.nodes.length);
expect(new Set(result.map(it => it.key)))
.toEqual(new Set(exampleLearningPath.nodes.map(it => it.learningObjectHruid)));
expect(result.map(it => it.title)).toContainEqual(EXPECTED_TITLE_FROM_DWENGO_LEARNING_OBJECT);
});
it("should throw an error if queried with a path identifier for which there is no learning path", async () => {
await expect((async () => {
await databaseLearningObjectProvider.getLearningObjectsFromPath({
hruid: "non_existing_hruid",
language: Language.Dutch
});
})()).rejects.toThrowError();
});
});
});