fix(backend): Testen DatabaseLearningObjectProvider gerepareerd na refactoring.
This commit is contained in:
		
							parent
							
								
									ee9afab6ca
								
							
						
					
					
						commit
						51268af79c
					
				
					 20 changed files with 72 additions and 210 deletions
				
			
		|  | @ -1,4 +1,4 @@ | |||
| import { Embedded, Entity, Enum, ManyToMany, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'; | ||||
| import {ArrayType, Embedded, Entity, Enum, ManyToMany, OneToMany, PrimaryKey, Property} from '@mikro-orm/core'; | ||||
| import { Attachment } from './attachment.entity.js'; | ||||
| import { Teacher } from '../users/teacher.entity.js'; | ||||
| import { DwengoContentType } from '../../services/learning-objects/processing/content-type.js'; | ||||
|  | @ -42,7 +42,7 @@ export class LearningObject { | |||
|     @Property({ type: 'array' }) | ||||
|     keywords: string[] = []; | ||||
| 
 | ||||
|     @Property({ type: 'array', nullable: true }) | ||||
|     @Property({ type: new ArrayType(i => +i), nullable: true }) | ||||
|     targetAges?: number[] = []; | ||||
| 
 | ||||
|     @Property({ type: 'bool' }) | ||||
|  |  | |||
|  | @ -9,7 +9,7 @@ export class LearningPathNode { | |||
|     learningPath!: Rel<LearningPath>; | ||||
| 
 | ||||
|     @PrimaryKey({ type: 'integer', autoincrement: true }) | ||||
|     nodeNumber!: number; | ||||
|     nodeNumber?: number; | ||||
| 
 | ||||
|     @Property({ type: 'string' }) | ||||
|     learningObjectHruid!: string; | ||||
|  |  | |||
|  | @ -8,12 +8,13 @@ import { | |||
|     LearningPathResponse, | ||||
| } from '@dwengo-1/common/interfaces/learning-content'; | ||||
| import { getLogger } from '../logging/initalize.js'; | ||||
| import {v4} from "uuid"; | ||||
| 
 | ||||
| function filterData(data: LearningObjectMetadata, htmlUrl: string): FilteredLearningObject { | ||||
|     return { | ||||
|         key: data.hruid, // Hruid learningObject (not path)
 | ||||
|         _id: data._id, | ||||
|         uuid: data.uuid, | ||||
|         uuid: data.uuid || v4(), | ||||
|         version: data.version, | ||||
|         title: data.title, | ||||
|         htmlUrl, // Url to fetch html content
 | ||||
|  |  | |||
|  | @ -32,7 +32,8 @@ function convertLearningObject(learningObject: LearningObject | null): FilteredL | |||
|         educationalGoals: learningObject.educationalGoals, | ||||
|         returnValue: { | ||||
|             callback_url: learningObject.returnValue.callbackUrl, | ||||
|             callback_schema: JSON.parse(learningObject.returnValue.callbackSchema), | ||||
|             callback_schema: learningObject.returnValue.callbackSchema === "" ? "" | ||||
|                                 : JSON.parse(learningObject.returnValue.callbackSchema), | ||||
|         }, | ||||
|         skosConcepts: learningObject.skosConcepts, | ||||
|         targetAges: learningObject.targetAges || [], | ||||
|  |  | |||
|  | @ -11,6 +11,7 @@ import { | |||
|     LearningPathIdentifier, | ||||
|     LearningPathResponse, | ||||
| } from '@dwengo-1/common/interfaces/learning-content'; | ||||
| import {v4} from "uuid"; | ||||
| 
 | ||||
| const logger: Logger = getLogger(); | ||||
| 
 | ||||
|  | @ -23,7 +24,7 @@ function filterData(data: LearningObjectMetadata): FilteredLearningObject { | |||
|     return { | ||||
|         key: data.hruid, // Hruid learningObject (not path)
 | ||||
|         _id: data._id, | ||||
|         uuid: data.uuid, | ||||
|         uuid: data.uuid ?? v4(), | ||||
|         version: data.version, | ||||
|         title: data.title, | ||||
|         htmlUrl: `/learningObject/${data.hruid}/html?language=${data.language}&version=${data.version}`, // Url to fetch html content
 | ||||
|  |  | |||
|  | @ -15,6 +15,7 @@ import { | |||
| import { Language } from '@dwengo-1/common/util/language'; | ||||
| import {Group} from "../../entities/assignments/group.entity"; | ||||
| import {Collection} from "@mikro-orm/core"; | ||||
| import {v4} from "uuid"; | ||||
| 
 | ||||
| /** | ||||
|  * Fetches the corresponding learning object for each of the nodes and creates a map that maps each node to its | ||||
|  | @ -163,7 +164,7 @@ function convertTransition( | |||
|             _id: String(index), // Retained for backwards compatibility. The index uniquely identifies the transition within the learning path.
 | ||||
|             default: false, // We don't work with default transitions but retain this for backwards compatibility.
 | ||||
|             next: { | ||||
|                 _id: nextNode._id + index, // Construct a unique ID for the transition for backwards compatibility.
 | ||||
|                 _id: nextNode._id ? (nextNode._id + index) : v4(), // Construct a unique ID for the transition for backwards compatibility.
 | ||||
|                 hruid: transition.next.learningObjectHruid, | ||||
|                 language: nextNode.language, | ||||
|                 version: nextNode.version, | ||||
|  |  | |||
|  | @ -29,14 +29,13 @@ export function mapToLearningPath( | |||
|         admins, | ||||
|         image: dto.image ? Buffer.from(base64ToArrayBuffer(dto.image)) : null | ||||
|     }); | ||||
|     const nodes = dto.nodes.map((nodeDto: LearningObjectNode, i: number) => | ||||
|     const nodes = dto.nodes.map((nodeDto: LearningObjectNode) => | ||||
|         repo.createNode({ | ||||
|             learningPath: path, | ||||
|             learningObjectHruid: nodeDto.learningobject_hruid, | ||||
|             language: nodeDto.language, | ||||
|             version: nodeDto.version, | ||||
|             startNode: nodeDto.start_node ?? false, | ||||
|             nodeNumber: i, | ||||
|             createdAt: new Date(), | ||||
|             updatedAt: new Date() | ||||
|         }) | ||||
|  | @ -66,10 +65,10 @@ export function mapToLearningPath( | |||
|             } | ||||
|         }).filter(it => it).map(it => it!); | ||||
| 
 | ||||
|         fromNode.transitions = new Collection<LearningPathTransition>(transitions); | ||||
|         fromNode.transitions = new Collection<LearningPathTransition>(fromNode, transitions); | ||||
|     }); | ||||
| 
 | ||||
|     path.nodes = new Collection<LearningPathNode>(nodes); | ||||
|     path.nodes = new Collection<LearningPathNode>(path, nodes); | ||||
| 
 | ||||
|     return path; | ||||
| } | ||||
|  |  | |||
|  | @ -1,43 +1,44 @@ | |||
| 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 { Language } from '@dwengo-1/common/util/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'; | ||||
| import { FilteredLearningObject } from '@dwengo-1/common/interfaces/learning-content'; | ||||
| 
 | ||||
| async function initExampleData(): Promise<{ learningObject: LearningObject; learningPath: LearningPath }> { | ||||
|     const learningObjectRepo = getLearningObjectRepository(); | ||||
|     const learningPathRepo = getLearningPathRepository(); | ||||
|     const learningObject = learningObjectExample.createLearningObject(); | ||||
|     const learningPath = learningPathExample.createLearningPath(); | ||||
|     await learningObjectRepo.save(learningObject); | ||||
|     await learningPathRepo.save(learningPath); | ||||
|     return { learningObject, learningPath }; | ||||
| } | ||||
| import { | ||||
|     FilteredLearningObject, | ||||
|     LearningObjectNode, | ||||
|     LearningPathIdentifier | ||||
| } from '@dwengo-1/common/interfaces/learning-content'; | ||||
| import { | ||||
|     testPartiallyDatabaseAndPartiallyDwengoApiLearningPath | ||||
| } from "../../test_assets/content/learning-paths.testdata"; | ||||
| import {testLearningObjectPnNotebooks} from "../../test_assets/content/learning-objects.testdata"; | ||||
| import { LearningPath } from '@dwengo-1/common/dist/interfaces/learning-content'; | ||||
| import {RequiredEntityData} from "@mikro-orm/core"; | ||||
| import {getHtmlRenderingForTestLearningObject} from "../../test-utils/get-html-rendering"; | ||||
| 
 | ||||
| const EXPECTED_TITLE_FROM_DWENGO_LEARNING_OBJECT = 'Notebook opslaan'; | ||||
| 
 | ||||
| describe('DatabaseLearningObjectProvider', () => { | ||||
|     let exampleLearningObject: LearningObject; | ||||
|     let exampleLearningObject: RequiredEntityData<LearningObject>; | ||||
|     let exampleLearningPath: LearningPath; | ||||
|     let exampleLearningPathId: LearningPathIdentifier; | ||||
| 
 | ||||
|     beforeAll(async () => { | ||||
|         await setupTestApp(); | ||||
|         const exampleData = await initExampleData(); | ||||
|         exampleLearningObject = exampleData.learningObject; | ||||
|         exampleLearningPath = exampleData.learningPath; | ||||
|         exampleLearningObject = testLearningObjectPnNotebooks; | ||||
|         exampleLearningPath = testPartiallyDatabaseAndPartiallyDwengoApiLearningPath; | ||||
| 
 | ||||
|         exampleLearningPathId = { | ||||
|             hruid: exampleLearningPath.hruid, | ||||
|             language: exampleLearningPath.language as Language | ||||
|         }; | ||||
|     }); | ||||
|     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); | ||||
|             expectToBeCorrectFilteredLearningObject(result!, exampleLearningObject); | ||||
|         }); | ||||
| 
 | ||||
|         it('should return the learning object when it is queried by only hruid and language (but not version)', async () => { | ||||
|  | @ -46,7 +47,7 @@ describe('DatabaseLearningObjectProvider', () => { | |||
|                 language: exampleLearningObject.language, | ||||
|             }); | ||||
|             expect(result).toBeTruthy(); | ||||
|             expectToBeCorrectFilteredLearningObject(result, exampleLearningObject); | ||||
|             expectToBeCorrectFilteredLearningObject(result!, exampleLearningObject); | ||||
|         }); | ||||
| 
 | ||||
|         it('should return null when queried with an id that does not exist', async () => { | ||||
|  | @ -61,7 +62,7 @@ describe('DatabaseLearningObjectProvider', () => { | |||
|         it('should return the correct rendering of the learning object', async () => { | ||||
|             const result = await databaseLearningObjectProvider.getLearningObjectHTML(exampleLearningObject); | ||||
|             // Set newlines so your tests are platform-independent.
 | ||||
|             expect(result).toEqual(example.getHTMLRendering().replace(/\r\n/g, '\n')); | ||||
|             expect(result).toEqual(getHtmlRenderingForTestLearningObject(exampleLearningObject).replace(/\r\n/g, '\n')); | ||||
|         }); | ||||
|         it('should return null for a non-existing learning object', async () => { | ||||
|             const result = await databaseLearningObjectProvider.getLearningObjectHTML({ | ||||
|  | @ -73,8 +74,10 @@ describe('DatabaseLearningObjectProvider', () => { | |||
|     }); | ||||
|     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))); | ||||
|             const result = await databaseLearningObjectProvider.getLearningObjectIdsFromPath(exampleLearningPathId); | ||||
|             expect(new Set(result)).toEqual( | ||||
|                 new Set(exampleLearningPath.nodes.map((it: LearningObjectNode) => it.learningobject_hruid)) | ||||
|             ); | ||||
|         }); | ||||
|         it('should throw an error if queried with a path identifier for which there is no learning path', async () => { | ||||
|             await expect( | ||||
|  | @ -89,9 +92,11 @@ describe('DatabaseLearningObjectProvider', () => { | |||
|     }); | ||||
|     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); | ||||
|             const result = await databaseLearningObjectProvider.getLearningObjectsFromPath(exampleLearningPathId); | ||||
|             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(new Set(result.map((it) => it.key))).toEqual( | ||||
|                 new Set(exampleLearningPath.nodes.map((it: LearningObjectNode) => it.learningobject_hruid)) | ||||
|             ); | ||||
| 
 | ||||
|             expect(result.map((it) => it.title)).toContainEqual(EXPECTED_TITLE_FROM_DWENGO_LEARNING_OBJECT); | ||||
|         }); | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ import { LearningObject } from '../../src/entities/content/learning-object.entit | |||
| import { LearningPath as LearningPathEntity } from '../../src/entities/content/learning-path.entity'; | ||||
| import { expect } from 'vitest'; | ||||
| import { FilteredLearningObject, LearningPath } from '@dwengo-1/common/interfaces/learning-content'; | ||||
| import {RequiredEntityData} from "@mikro-orm/core"; | ||||
| 
 | ||||
| // Ignored properties because they belang for example to the class, not to the entity itself.
 | ||||
| const IGNORE_PROPERTIES = ['parent']; | ||||
|  | @ -60,9 +61,9 @@ export function expectToBeCorrectEntity<T extends object>( | |||
| /** | ||||
|  * Checks that filtered is the correct representation of original as FilteredLearningObject. | ||||
|  * @param filtered the representation as FilteredLearningObject | ||||
|  * @param original the original entity added to the database | ||||
|  * @param original the data of the entity in the database that was filtered. | ||||
|  */ | ||||
| export function expectToBeCorrectFilteredLearningObject(filtered: FilteredLearningObject, original: LearningObject): void { | ||||
| export function expectToBeCorrectFilteredLearningObject(filtered: FilteredLearningObject, original: RequiredEntityData<LearningObject>): void { | ||||
|     expect(filtered.uuid).toEqual(original.uuid); | ||||
|     expect(filtered.version).toEqual(original.version); | ||||
|     expect(filtered.language).toEqual(original.language); | ||||
|  |  | |||
							
								
								
									
										12
									
								
								backend/tests/test-utils/get-html-rendering.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								backend/tests/test-utils/get-html-rendering.ts
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| import {RequiredEntityData} from "@mikro-orm/core"; | ||||
| import {loadTestAsset} from "./load-test-asset"; | ||||
| import {LearningObject} from "../../src/entities/content/learning-object.entity"; | ||||
| import {envVars, getEnvVar} from "../../src/util/envVars"; | ||||
| 
 | ||||
| export function getHtmlRenderingForTestLearningObject(learningObject: RequiredEntityData<LearningObject>): string { | ||||
|     const userPrefix = getEnvVar(envVars.UserContentPrefix); | ||||
|     const cleanedHruid = learningObject.hruid.startsWith(userPrefix) | ||||
|                                     ? learningObject.hruid.substring(userPrefix.length) | ||||
|                                     : learningObject.hruid; | ||||
|     return loadTestAsset(`/content/learning-object-resources/${cleanedHruid}/rendering.txt`).toString(); | ||||
| } | ||||
|  | @ -1,32 +0,0 @@ | |||
| import { LearningObjectExample } from '../learning-object-example'; | ||||
| import { LearningObject } from '../../../../../src/entities/content/learning-object.entity'; | ||||
| import { Language } from '@dwengo-1/common/dist/util/language'; | ||||
| import { loadTestAsset } from '../../../../test-utils/load-test-asset'; | ||||
| import { DwengoContentType } from '../../../../../src/services/learning-objects/processing/content-type'; | ||||
| import { envVars, getEnvVar } from '../../../../../src/util/envVars'; | ||||
| 
 | ||||
| /** | ||||
|  * Create a dummy learning object to be used in tests where multiple learning objects are needed (for example for use | ||||
|  * on a path), but where the precise contents of the learning object are not important. | ||||
|  */ | ||||
| export function dummyLearningObject(hruid: string, language: Language, title: string): LearningObjectExample { | ||||
|     return { | ||||
|         createLearningObject: (): LearningObject => { | ||||
|             const learningObject = new LearningObject(); | ||||
|             learningObject.hruid = getEnvVar(envVars.UserContentPrefix) + hruid; | ||||
|             learningObject.language = language; | ||||
|             learningObject.version = 1; | ||||
|             learningObject.title = title; | ||||
|             learningObject.description = 'Just a dummy learning object for testing purposes'; | ||||
|             learningObject.contentType = DwengoContentType.TEXT_PLAIN; | ||||
|             learningObject.content = Buffer.from('Dummy content'); | ||||
|             learningObject.returnValue = { | ||||
|                 callbackUrl: `/learningObject/${hruid}/submissions`, | ||||
|                 callbackSchema: '[]', | ||||
|             }; | ||||
|             return learningObject; | ||||
|         }, | ||||
|         createAttachment: {}, | ||||
|         getHTMLRendering: () => loadTestAsset('learning-objects/dummy/rendering.txt').toString(), | ||||
|     }; | ||||
| } | ||||
|  | @ -1,74 +0,0 @@ | |||
| import { LearningObjectExample } from '../learning-object-example'; | ||||
| import { Language } from '@dwengo-1/common/dist/util/language'; | ||||
| import { DwengoContentType } from '../../../../../src/services/learning-objects/processing/content-type'; | ||||
| import { loadTestAsset } from '../../../../test-utils/load-test-asset'; | ||||
| import { LearningObject } from '../../../../../src/entities/content/learning-object.entity'; | ||||
| import { Attachment } from '../../../../../src/entities/content/attachment.entity'; | ||||
| import { envVars, getEnvVar } from '../../../../../src/util/envVars'; | ||||
| import { EducationalGoal } from '../../../../../src/entities/content/educational-goal.entity'; | ||||
| import { ReturnValue } from '../../../../../src/entities/content/return-value.entity'; | ||||
| 
 | ||||
| const ASSETS_PREFIX = 'learning-objects/pn-werkingnotebooks/'; | ||||
| 
 | ||||
| const example: LearningObjectExample = { | ||||
|     createLearningObject: () => { | ||||
|         const learningObject = new LearningObject(); | ||||
|         learningObject.hruid = `${getEnvVar(envVars.UserContentPrefix)}pn_werkingnotebooks`; | ||||
|         learningObject.version = 3; | ||||
|         learningObject.language = Language.Dutch; | ||||
|         learningObject.title = 'Werken met notebooks'; | ||||
|         learningObject.description = 'Leren werken met notebooks'; | ||||
|         learningObject.keywords = ['Python', 'KIKS', 'Wiskunde', 'STEM', 'AI']; | ||||
| 
 | ||||
|         const educationalGoal1 = new EducationalGoal(); | ||||
|         educationalGoal1.source = 'Source'; | ||||
|         educationalGoal1.id = 'id'; | ||||
| 
 | ||||
|         const educationalGoal2 = new EducationalGoal(); | ||||
|         educationalGoal2.source = 'Source2'; | ||||
|         educationalGoal2.id = 'id2'; | ||||
| 
 | ||||
|         learningObject.educationalGoals = [educationalGoal1, educationalGoal2]; | ||||
|         learningObject.admins = []; | ||||
|         learningObject.contentType = DwengoContentType.TEXT_MARKDOWN; | ||||
|         learningObject.teacherExclusive = false; | ||||
|         learningObject.skosConcepts = [ | ||||
|             'http://ilearn.ilabt.imec.be/vocab/curr1/s-vaktaal', | ||||
|             'http://ilearn.ilabt.imec.be/vocab/curr1/s-digitale-media-en-toepassingen', | ||||
|             'http://ilearn.ilabt.imec.be/vocab/curr1/s-computers-en-systemen', | ||||
|         ]; | ||||
|         learningObject.copyright = 'dwengo'; | ||||
|         learningObject.license = 'dwengo'; | ||||
|         learningObject.estimatedTime = 10; | ||||
| 
 | ||||
|         const returnValue = new ReturnValue(); | ||||
|         returnValue.callbackUrl = 'callback_url_example'; | ||||
|         returnValue.callbackSchema = '{"att": "test", "att2": "test2"}'; | ||||
| 
 | ||||
|         learningObject.returnValue = returnValue; | ||||
|         learningObject.available = true; | ||||
|         learningObject.content = loadTestAsset(`${ASSETS_PREFIX}/content.md`); | ||||
| 
 | ||||
|         return learningObject; | ||||
|     }, | ||||
|     createAttachment: { | ||||
|         dwengoLogo: (learningObject) => { | ||||
|             const att = new Attachment(); | ||||
|             att.learningObject = learningObject; | ||||
|             att.name = 'dwengo.png'; | ||||
|             att.mimeType = 'image/png'; | ||||
|             att.content = loadTestAsset(`${ASSETS_PREFIX}/dwengo.png`); | ||||
|             return att; | ||||
|         }, | ||||
|         knop: (learningObject) => { | ||||
|             const att = new Attachment(); | ||||
|             att.learningObject = learningObject; | ||||
|             att.name = 'Knop.png'; | ||||
|             att.mimeType = 'image/png'; | ||||
|             att.content = loadTestAsset(`${ASSETS_PREFIX}/Knop.png`); | ||||
|             return att; | ||||
|         }, | ||||
|     }, | ||||
|     getHTMLRendering: () => loadTestAsset(`${ASSETS_PREFIX}/rendering.txt`).toString(), | ||||
| }; | ||||
| export default example; | ||||
| Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB | 
| Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB | 
|  | @ -1,28 +0,0 @@ | |||
| import { LearningObjectExample } from '../learning-object-example'; | ||||
| import { LearningObject } from '../../../../../src/entities/content/learning-object.entity'; | ||||
| import { loadTestAsset } from '../../../../test-utils/load-test-asset'; | ||||
| import { envVars, getEnvVar } from '../../../../../src/util/envVars'; | ||||
| import { Language } from '@dwengo-1/common/dist/util/language'; | ||||
| import { DwengoContentType } from '../../../../../src/services/learning-objects/processing/content-type'; | ||||
| 
 | ||||
| const example: LearningObjectExample = { | ||||
|     createLearningObject: () => { | ||||
|         const learningObject = new LearningObject(); | ||||
|         learningObject.hruid = `${getEnvVar(envVars.UserContentPrefix)}test_essay`; | ||||
|         learningObject.language = Language.English; | ||||
|         learningObject.version = 1; | ||||
|         learningObject.title = 'Essay question for testing'; | ||||
|         learningObject.description = 'This essay question was only created for testing purposes.'; | ||||
|         learningObject.contentType = DwengoContentType.GIFT; | ||||
|         learningObject.returnValue = { | ||||
|             callbackUrl: `/learningObject/${learningObject.hruid}/submissions`, | ||||
|             callbackSchema: '["antwoord vraag 1"]', | ||||
|         }; | ||||
|         learningObject.content = loadTestAsset('learning-objects/test-essay/content.txt'); | ||||
|         return learningObject; | ||||
|     }, | ||||
|     createAttachment: {}, | ||||
|     getHTMLRendering: () => loadTestAsset('learning-objects/test-essay/rendering.txt').toString(), | ||||
| }; | ||||
| 
 | ||||
| export default example; | ||||
|  | @ -1,28 +0,0 @@ | |||
| import { LearningObjectExample } from '../learning-object-example'; | ||||
| import { LearningObject } from '../../../../../src/entities/content/learning-object.entity'; | ||||
| import { loadTestAsset } from '../../../../test-utils/load-test-asset'; | ||||
| import { envVars, getEnvVar } from '../../../../../src/util/envVars'; | ||||
| import { DwengoContentType } from '../../../../../src/services/learning-objects/processing/content-type'; | ||||
| import { Language } from '@dwengo-1/common/dist/util/language'; | ||||
| 
 | ||||
| const example: LearningObjectExample = { | ||||
|     createLearningObject: () => { | ||||
|         const learningObject = new LearningObject(); | ||||
|         learningObject.hruid = `${getEnvVar(envVars.UserContentPrefix)}test_multiple_choice`; | ||||
|         learningObject.language = Language.English; | ||||
|         learningObject.version = 1; | ||||
|         learningObject.title = 'Multiple choice question for testing'; | ||||
|         learningObject.description = 'This multiple choice question was only created for testing purposes.'; | ||||
|         learningObject.contentType = DwengoContentType.GIFT; | ||||
|         learningObject.returnValue = { | ||||
|             callbackUrl: `/learningObject/${learningObject.hruid}/submissions`, | ||||
|             callbackSchema: '["antwoord vraag 1"]', | ||||
|         }; | ||||
|         learningObject.content = loadTestAsset('learning-objects/test-multiple-choice/content.txt'); | ||||
|         return learningObject; | ||||
|     }, | ||||
|     createAttachment: {}, | ||||
|     getHTMLRendering: () => loadTestAsset('learning-objects/test-multiple-choice/rendering.txt').toString(), | ||||
| }; | ||||
| 
 | ||||
| export default example; | ||||
|  | @ -5,6 +5,7 @@ import {DwengoContentType} from '../../../src/services/learning-objects/processi | |||
| import {ReturnValue} from '../../../src/entities/content/return-value.entity'; | ||||
| import {envVars, getEnvVar} from "../../../src/util/envVars"; | ||||
| import {loadTestAsset} from "../../test-utils/load-test-asset"; | ||||
| import {v4} from "uuid"; | ||||
| 
 | ||||
| export function makeTestLearningObjects(em: EntityManager): LearningObject[] { | ||||
|     const returnValue: ReturnValue = new ReturnValue(); | ||||
|  | @ -30,8 +31,8 @@ export function makeTestLearningObjects(em: EntityManager): LearningObject[] { | |||
| 
 | ||||
| export function createReturnValue(): ReturnValue { | ||||
|     const returnValue: ReturnValue = new ReturnValue(); | ||||
|     returnValue.callbackSchema = ''; | ||||
|     returnValue.callbackUrl = ''; | ||||
|     returnValue.callbackSchema = '[]'; | ||||
|     returnValue.callbackUrl = '%SUBMISSION%'; | ||||
|     return returnValue; | ||||
| } | ||||
| 
 | ||||
|  | @ -44,6 +45,8 @@ export const testLearningObject01: RequiredEntityData<LearningObject> = { | |||
|     description: 'debute', | ||||
|     contentType: DwengoContentType.TEXT_MARKDOWN, | ||||
|     keywords: [], | ||||
|     uuid: v4(), | ||||
|     targetAges: [16, 17, 18], | ||||
|     teacherExclusive: false, | ||||
|     skosConcepts: [], | ||||
|     educationalGoals: [], | ||||
|  | @ -235,16 +238,16 @@ export const testLearningObjectPnNotebooks: RequiredEntityData<LearningObject> = | |||
|         { | ||||
|             name: "dwengo.png", | ||||
|             mimeType: "image/png", | ||||
|             content: loadTestAsset("/content/learning-object-resources/pn-werkingnotebooks/dwengo.png") | ||||
|             content: loadTestAsset("/content/learning-object-resources/pn_werkingnotebooks/dwengo.png") | ||||
|         }, | ||||
|         { | ||||
|             name: "Knop.png", | ||||
|             mimeType: "image/png", | ||||
|             content: loadTestAsset("/content/learning-object-resources/pn-werkingnotebooks/Knop.png") | ||||
|             content: loadTestAsset("/content/learning-object-resources/pn_werkingnotebooks/Knop.png") | ||||
|         } | ||||
|     ], | ||||
|     available: false, | ||||
|     content: loadTestAsset("/content/learning-object-resources/pn-werkingnotebooks/content.md"), | ||||
|     content: loadTestAsset("/content/learning-object-resources/pn_werkingnotebooks/content.md"), | ||||
|     returnValue: { | ||||
|         callbackUrl: "%SUBMISSION%", | ||||
|         callbackSchema: "[]" | ||||
|  |  | |||
|  | @ -1,10 +1,10 @@ | |||
| import { Language } from '../util/language'; | ||||
| 
 | ||||
| export interface Transition { | ||||
|     default: boolean; | ||||
|     _id: string; | ||||
|     default?: boolean; | ||||
|     _id?: string; | ||||
|     next: { | ||||
|         _id: string; | ||||
|         _id?: string; | ||||
|         hruid: string; | ||||
|         version: number; | ||||
|         language: string; | ||||
|  |  | |||
		Reference in a new issue
	
	 Gerald Schmittinger
						Gerald Schmittinger