diff --git a/src/main/webapp/app/exercises/programming/manage/services/submission-policy.service.ts b/src/main/webapp/app/exercises/programming/manage/services/submission-policy.service.ts index 505615c1144e..9817563677b8 100644 --- a/src/main/webapp/app/exercises/programming/manage/services/submission-policy.service.ts +++ b/src/main/webapp/app/exercises/programming/manage/services/submission-policy.service.ts @@ -1,11 +1,11 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpParams, HttpResponse } from '@angular/common/http'; -import { Observable } from 'rxjs'; +import { Observable, map } from 'rxjs'; import { SubmissionPolicy } from 'app/entities/submission-policy.model'; export interface ISubmissionPolicyService { addSubmissionPolicyToProgrammingExercise: (submissionPolicy: SubmissionPolicy, exerciseId: number) => Observable; - getSubmissionPolicyOfProgrammingExercise: (exerciseId: number) => Observable; + getSubmissionPolicyOfProgrammingExercise: (exerciseId: number) => Observable; removeSubmissionPolicyFromProgrammingExercise: (exerciseId: number) => Observable>; enableSubmissionPolicyOfProgrammingExercise: (exerciseId: number) => Observable>; disableSubmissionPolicyOfProgrammingExercise: (exerciseId: number) => Observable>; @@ -24,8 +24,14 @@ export class SubmissionPolicyService implements ISubmissionPolicyService { * * @param exerciseId of the programming exercise for which the submission policy should be loaded */ - getSubmissionPolicyOfProgrammingExercise(exerciseId: number): Observable { - return this.http.get(this.requestUrl(exerciseId)); + getSubmissionPolicyOfProgrammingExercise(exerciseId: number): Observable { + return this.http.get(this.requestUrl(exerciseId)).pipe( + // using any as it can be null + map((response: any) => { + // Ensure that null is replaced by undefined + return response === null ? undefined : response; + }), + ); } /** diff --git a/src/main/webapp/app/overview/exercise-details/course-exercise-details.component.ts b/src/main/webapp/app/overview/exercise-details/course-exercise-details.component.ts index 9ea6c5058874..5e8ec3703c32 100644 --- a/src/main/webapp/app/overview/exercise-details/course-exercise-details.component.ts +++ b/src/main/webapp/app/overview/exercise-details/course-exercise-details.component.ts @@ -97,7 +97,7 @@ export class CourseExerciseDetailsComponent extends AbstractScienceComponent imp private discussionComponent?: DiscussionSectionComponent; baseResource: string; isExamExercise: boolean; - submissionPolicy: SubmissionPolicy; + submissionPolicy?: SubmissionPolicy; exampleSolutionCollapsed: boolean; plagiarismCaseInfo?: PlagiarismCaseInfo; availableExerciseHints: ExerciseHint[]; diff --git a/src/test/javascript/spec/service/submission-policy.service.spec.ts b/src/test/javascript/spec/service/submission-policy.service.spec.ts index a84f95e45cbe..01ee9af19dba 100644 --- a/src/test/javascript/spec/service/submission-policy.service.spec.ts +++ b/src/test/javascript/spec/service/submission-policy.service.spec.ts @@ -63,21 +63,26 @@ describe('Submission Policy Service', () => { addPolicySubscription.unsubscribe(); })); - it('should get submission policy from exercise', fakeAsync(() => { - const getPolicySubscription = submissionPolicyService - .getSubmissionPolicyOfProgrammingExercise(programmingExercise.id!) - .pipe(take(1)) - .subscribe((submissionPolicy) => { - expect(submissionPolicy).toBe(lockRepositoryPolicy); - }); - tick(); - - const request = httpMock.expectOne({ method: 'GET', url: expectedUrl }); - request.flush(lockRepositoryPolicy); - tick(); - - getPolicySubscription.unsubscribe(); - })); + // Using functions to avoid a serialization error + it.each([() => ({ input: null, expected: undefined }), () => ({ input: lockRepositoryPolicy, expected: lockRepositoryPolicy })])( + 'should get submission policy from exercise', + fakeAsync((fun: any) => { + const { input, expected } = fun(); + const getPolicySubscription = submissionPolicyService + .getSubmissionPolicyOfProgrammingExercise(programmingExercise.id!) + .pipe(take(1)) + .subscribe((submissionPolicy) => { + expect(submissionPolicy).toBe(expected); + }); + tick(); + + const request = httpMock.expectOne({ method: 'GET', url: expectedUrl }); + request.flush(input); + tick(); + + getPolicySubscription.unsubscribe(); + }), + ); it('should issue delete request', fakeAsync(() => { const removePolicySubscription = submissionPolicyService.removeSubmissionPolicyFromProgrammingExercise(programmingExercise.id!).subscribe((response) => {