import { Injectable } from '@angular/core'; import { GCMockModule } from '@core/mocks/gc-module.mock'; import { ApplicantFormFromApi } from '@core/typings/application.typing'; import { ProgramApplicantType } from '@core/typings/program.typing'; import { ApplicationStatuses } from '@core/typings/status.typing'; import { ApplicationViewFormFromApi, AvailabilityOptions, CompletionRequirementType, FormAudience, FormManagerRecordForUi, FormResponse, FormStatuses, FormTypes, ResponseVisibilityOptions } from '@features/configure-forms/form.typing'; import { Spec, TestCase } from '@yourcause/test-decorators'; import { DescribeAngularService } from '@yourcause/test-decorators/angular'; import { expect, spy } from 'chai'; import { FormManagerService } from './form-manager.service'; @Injectable({ providedIn: 'root' }) @DescribeAngularService(FormManagerService, { imports: [ GCMockModule ] }) export class FormManagerServiceSpec implements Spec { formManagerRecordForUi = { applicationFormId: 135, applicationId: 654, applicationStatus: ApplicationStatuses.AwaitingReview, isApplicationInClientUserWorkflowLevel: true } as FormManagerRecordForUi; applicationForms: ApplicantFormFromApi[] = [{ updatedBy: '', updatedDate: '', createdBy: '', impersonatedBy: '', createImpersonatedBy: '', formTypeId: FormTypes.REQUEST, applicationFormId: this.formManagerRecordForUi.applicationFormId, formId: 12, formRevisionId: 5, formName: 'Form name', formDescription: '', formStatus: FormStatuses.DraftSaved, statusUpdatedDate: '', statusUpdatedBy: '', formSubmittedOn: '', totalCommentsInCurrentWorkflow: 0, canRequestRevision: false, canApproveApplicaitonForm: false, canDeclineApplicationForm: false, formData: {}, statusUpdatedByClientUser: null, formComments: [], myCommentInCurrentLevel: '', programApplicantType: ProgramApplicantType.ORGS, isDefault: true, portalFormAvailabilityInfo: null, dueDate: '', submittedBy: '', isDraft: false, formDefinition: [], requireSignature: false, signatureDescription: '' }]; reviewForm: ApplicationViewFormFromApi = { audience: FormAudience.MANAGER, formId: this.formManagerRecordForUi.formId, formRevisionId: 25332, grantManagerActionType: ResponseVisibilityOptions.VIEW_AT_ALL_WORKFLOW, responses: [{ applicationFormId: this.formManagerRecordForUi.applicationFormId } as FormResponse], otherLevelResponses: [], nominationResponses: [], name: '', formType: FormTypes.REVIEW, comments: [], actionType: ResponseVisibilityOptions.VIEW_AT_ALL_WORKFLOW, completionRequirementType: CompletionRequirementType.ALL_USERS, specificNumberForCompletion: null, managersCount: 4, portalAvailabilityDetails: { portalFormAvailabilityType: AvailabilityOptions.AUTO, portalFormAvailabilityDateOption: null, portalFormAvailabilityDateOffset: '', portalFormAvailabilityDate: '', portalFormAvailabilityDynamicDateApplicationApproval: '', portalFormAvailabilityDynamicDateAwardCreation: '', portalFormAvailabilityDynamicDateApplicationSubmission: '', portalFormAvailabilityDynamicDateWorkflowLevelEntry: '' }, dueDate: '', sortOrder: 1, requireSignature: false, signatureDescription: '' }; requestForm: ApplicationViewFormFromApi = { audience: FormAudience.APPLICANT, formId: 23531, formRevisionId: 95959, grantManagerActionType: ResponseVisibilityOptions.VIEW_AT_ALL_WORKFLOW, responses: [], otherLevelResponses: [], nominationResponses: [], name: '', formType: FormTypes.REQUEST, comments: [], actionType: ResponseVisibilityOptions.VIEW_AT_ALL_WORKFLOW, completionRequirementType: CompletionRequirementType.ALL_USERS, specificNumberForCompletion: null, managersCount: 4, portalAvailabilityDetails: { portalFormAvailabilityType: AvailabilityOptions.AUTO, portalFormAvailabilityDateOption: null, portalFormAvailabilityDateOffset: '', portalFormAvailabilityDate: '', portalFormAvailabilityDynamicDateApplicationApproval: '', portalFormAvailabilityDynamicDateAwardCreation: '', portalFormAvailabilityDynamicDateApplicationSubmission: '', portalFormAvailabilityDynamicDateWorkflowLevelEntry: '' }, dueDate: '', sortOrder: 1, requireSignature: false, signatureDescription: '' }; appViewFormsFromApi = [ this.reviewForm, this.requestForm ]; @TestCase('should be able to get form from manager record - applicant form') async getFormFromFormManagerRecord (service: FormManagerService) { spy.on(service['applicationFormService'], 'getApplicantFormsForApplication', async () => { return this.applicationForms; }); spy.on(service['applicationFormService'], 'adaptApplicantFormToViewFormResponse'); await service.getFormFromFormManagerRecord( this.formManagerRecordForUi, FormAudience.APPLICANT ); expect(service['applicationFormService']['getApplicantFormsForApplication']).to.have.been.called.once; expect(service['applicationFormService']['adaptApplicantFormToViewFormResponse']).to.have.been.called.once; } @TestCase('should be able to get form from manager record - manager form') async getFormFromFormManagerRecord2 (service: FormManagerService) { spy.on(service['applicationFormService'], 'getAllApplicationForms', async () => { return this.appViewFormsFromApi; }); spy.on(service['applicationFormService'], 'adaptFormResponseToViewFormResponse'); await service.getFormFromFormManagerRecord( { ...this.formManagerRecordForUi }, FormAudience.MANAGER ); expect(service['applicationFormService']['getAllApplicationForms']).to.have.been.called.once; expect(service['applicationFormService']['adaptFormResponseToViewFormResponse']).to.have.been.called.once; } }