diff --git a/backend/src/data/assignments/submission-repository.ts b/backend/src/data/assignments/submission-repository.ts index 0a14bb0d..00cdac14 100644 --- a/backend/src/data/assignments/submission-repository.ts +++ b/backend/src/data/assignments/submission-repository.ts @@ -51,26 +51,32 @@ export class SubmissionRepository extends DwengoEntityRepository { ); } - public async findAllSubmissionsForAllGroupsOfStudent(studentUsername: string): Promise { - return this.findAll({ - where: { - onBehalfOf: { - members: { - $some: { - username: studentUsername - } - }, + /** + * Looks up all submissions for the given learning object which were submitted as part of the given assignment. + * When forStudentUsername is set, only the submissions of the given user's group are shown. + */ + public async findAllSubmissionsForLearningObjectAndAssignment( + loId: LearningObjectIdentifier, + assignment: Assignment, + forStudentUsername?: string + ): Promise { + let onBehalfOf = forStudentUsername ? { + assignment, + members: { + $some: { + username: forStudentUsername } } - }); - } + } : { + assignment + }; - public async findAllSubmissionsForAssignment(assignment: Assignment): Promise { return this.findAll({ where: { - onBehalfOf: { - assignment - } + learningObjectHruid: loId.hruid, + learningObjectLanguage: loId.language, + learningObjectVersion: loId.version, + onBehalfOf } }); } diff --git a/backend/tests/data/assignments/submissions.test.ts b/backend/tests/data/assignments/submissions.test.ts index 9d72c963..a723e86f 100644 --- a/backend/tests/data/assignments/submissions.test.ts +++ b/backend/tests/data/assignments/submissions.test.ts @@ -15,6 +15,8 @@ import {GroupRepository} from '../../../src/data/assignments/group-repository'; import {AssignmentRepository} from '../../../src/data/assignments/assignment-repository'; import {ClassRepository} from '../../../src/data/classes/class-repository'; import {Submission} from "../../../src/entities/assignments/submission.entity"; +import {Class} from "../../../src/entities/classes/class.entity"; +import {Assignment} from "../../../src/entities/assignments/assignment.entity"; export function checkSubmissionsForStudentNoordkaap(result: Submission[]) { sortSubmissions(result); @@ -79,40 +81,48 @@ describe('SubmissionRepository', () => { expect(submission?.submissionTime.getDate()).toBe(25); }); - it('should find all submissions for all groups of a student', async () => { - const result = await submissionRepository.findAllSubmissionsForAllGroupsOfStudent("Noordkaap"); - expect(result.length).toBe(5); - - checkSubmissionsForStudentNoordkaap(result); - }); - - it('should find all submissions for a certain assignment', async () => { - const clazz = await classRepository.findById('id01'); - const assignment = await assignmentRepository.findByClassAndId(clazz!, 1); - const result = await submissionRepository.findAllSubmissionsForAssignment(assignment!); - + let clazz: Class | null; + let assignment: Assignment | null; + let loId: LearningObjectIdentifier; + it('should find all submissions for a certain learning object and assignment', async () => { + clazz = await classRepository.findById('id01'); + assignment = await assignmentRepository.findByClassAndId(clazz!, 1); + loId = { + hruid: "id02", + language: Language.English, + version: 1 + }; + const result = await submissionRepository.findAllSubmissionsForLearningObjectAndAssignment(loId, assignment!); sortSubmissions(result); - expect(result).toHaveLength(5); + expect(result).toHaveLength(3); - expect(result[0].learningObjectHruid).toBe("id01"); + // submission3 should be found (for learning object 'id02' by group #1 for Assignment #1 in class 'id01') + expect(result[0].learningObjectHruid).toBe(loId.hruid); expect(result[0].submissionNumber).toBe(1); - expect(result[1].learningObjectHruid).toBe("id02"); - expect(result[1].submissionNumber).toBe(1); + // submission4 should be found (for learning object 'id02' by group #1 for Assignment #1 in class 'id01') + expect(result[1].learningObjectHruid).toBe(loId.hruid); + expect(result[1].submissionNumber).toBe(2); - expect(result[2].learningObjectHruid).toBe("id02"); - expect(result[2].submissionNumber).toBe(2); + // submission8 should be found (for learning object 'id02' by group #2 for Assignment #1 in class 'id01') + expect(result[2].learningObjectHruid).toBe(loId.hruid); + expect(result[2].submissionNumber).toBe(3); + }); - expect(result[3].learningObjectHruid).toBe("id03"); - expect(result[3].submissionNumber).toBe(1); + it("should find only the submissions for a certain learning object and assignment made for the user's group", async () => { + const result = + await submissionRepository.findAllSubmissionsForLearningObjectAndAssignment(loId, assignment!, "Tool"); + // (student Tool is in group #2) - expect(result[4].learningObjectHruid).toBe("id03"); - expect(result[4].submissionNumber).toBe(2); + expect(result).toHaveLength(1); - // But not submission7 (id01, submission number: 3), since it was submitted for an assignment + // submission8 should be found (for learning object 'id02' by group #2 for Assignment #1 in class 'id01') + expect(result[0].learningObjectHruid).toBe(loId.hruid); + expect(result[0].submissionNumber).toBe(3); - sortSubmissions(result); + // The other submissions found in the previous test case should not be found anymore as they were made on + // behalf of group #1 which Tool is no member of. }); it('should not find a deleted submission', async () => { diff --git a/backend/tests/test_assets/assignments/groups.testdata.ts b/backend/tests/test_assets/assignments/groups.testdata.ts index 761f0736..c82887bb 100644 --- a/backend/tests/test_assets/assignments/groups.testdata.ts +++ b/backend/tests/test_assets/assignments/groups.testdata.ts @@ -4,30 +4,50 @@ import { Assignment } from '../../../src/entities/assignments/assignment.entity' import { Student } from '../../../src/entities/users/student.entity'; export function makeTestGroups(em: EntityManager, students: Student[], assignments: Assignment[]): Group[] { + /* + * Group #1 for Assignment #1 in class 'id01' + * => Assigned to do learning path 'id02' + */ const group01 = em.create(Group, { assignment: assignments[0], groupNumber: 1, members: students.slice(0, 2), }); + /* + * Group #2 for Assignment #1 in class 'id01' + * => Assigned to do learning path 'id02' + */ const group02 = em.create(Group, { assignment: assignments[0], groupNumber: 2, members: students.slice(2, 4), }); + /* + * Group #3 for Assignment #1 in class 'id01' + * => Assigned to do learning path 'id02' + */ const group03 = em.create(Group, { assignment: assignments[0], groupNumber: 3, members: students.slice(4, 6), }); + /* + * Group #4 for Assignment #2 in class 'id02' + * => Assigned to do learning path 'id01' + */ const group04 = em.create(Group, { assignment: assignments[1], groupNumber: 4, members: students.slice(3, 4), }); + /* + * Group #5 for Assignment #4 in class 'id01' + * => Assigned to do learning path 'id01' + */ const group05 = em.create(Group, { assignment: assignments[3], groupNumber: 1, diff --git a/backend/tests/test_assets/assignments/submission.testdata.ts b/backend/tests/test_assets/assignments/submission.testdata.ts index da77539a..812d1289 100644 --- a/backend/tests/test_assets/assignments/submission.testdata.ts +++ b/backend/tests/test_assets/assignments/submission.testdata.ts @@ -12,7 +12,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou submissionNumber: 1, submitter: students[0], submissionTime: new Date(2025, 2, 20), - onBehalfOf: groups[0], + onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01' content: 'sub1', }); @@ -23,7 +23,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou submissionNumber: 2, submitter: students[0], submissionTime: new Date(2025, 2, 25), - onBehalfOf: groups[0], + onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01' content: '', }); @@ -34,7 +34,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou submissionNumber: 1, submitter: students[0], submissionTime: new Date(2025, 2, 20), - onBehalfOf: groups[0], + onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01' content: '', }); @@ -45,7 +45,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou submissionNumber: 2, submitter: students[0], submissionTime: new Date(2025, 2, 25), - onBehalfOf: groups[0], + onBehalfOf: groups[0], // group #1 for Assignment #1 in class 'id01' content: '', }); @@ -56,7 +56,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou submissionNumber: 1, submitter: students[1], submissionTime: new Date(2025, 2, 20), - onBehalfOf: groups[1], + onBehalfOf: groups[1], // Group #2 for Assignment #1 in class 'id01' content: '', }); @@ -67,7 +67,7 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou submissionNumber: 2, submitter: students[1], submissionTime: new Date(2025, 2, 25), - onBehalfOf: groups[4], + onBehalfOf: groups[4], // Group #5 for Assignment #4 in class 'id01' content: '', }); @@ -78,9 +78,20 @@ export function makeTestSubmissions(em: EntityManager, students: Student[], grou submissionNumber: 3, submitter: students[3], submissionTime: new Date(2025, 3, 25), - onBehalfOf: groups[3], + onBehalfOf: groups[3], // Group #4 for Assignment #2 in class 'id02' content: '', }); - return [submission01, submission02, submission03, submission04, submission05, submission06, submission07]; + const submission08 = em.create(Submission, { + learningObjectHruid: 'id02', + learningObjectLanguage: Language.English, + learningObjectVersion: 1, + submissionNumber: 3, + submitter: students[1], + submissionTime: new Date(2025, 4, 7), + onBehalfOf: groups[1], // Group #2 for Assignment #1 in class 'id01' + content: '', + }); + + return [submission01, submission02, submission03, submission04, submission05, submission06, submission07, submission08]; }