diff --git a/sources/packages/backend/libs/services/src/constants/index.ts b/sources/packages/backend/libs/services/src/constants/index.ts index 3b94c31562..44d0dcc59e 100644 --- a/sources/packages/backend/libs/services/src/constants/index.ts +++ b/sources/packages/backend/libs/services/src/constants/index.ts @@ -1,3 +1,4 @@ export * from "./system-configurations-constants"; export * from "./error-code.constants"; export * from "./disbursements.constants"; +export * from "./worker-constants"; diff --git a/sources/packages/backend/libs/services/src/constants/worker-constants.ts b/sources/packages/backend/libs/services/src/constants/worker-constants.ts new file mode 100644 index 0000000000..26d77c2592 --- /dev/null +++ b/sources/packages/backend/libs/services/src/constants/worker-constants.ts @@ -0,0 +1,13 @@ +export enum Workers { + AssociateWorkflowInstance = "associate-workflow-instance", + VerifyApplicationExceptions = "verify-application-exceptions", + ProgramInfoRequest = "program-info-request", + CreateIncomeRequest = "create-income-request", + CheckIncomeRequest = "check-income-request", + UpdateApplicationStatus = "update-application-status", + LoadAssessmentConsolidatedData = "load-assessment-consolidated-data", + UpdateNOAStatus = "update-noa-status", + SaveAssessmentData = "save-assessment-data", + SaveDisbursementSchedules = "save-disbursement-schedules", + AssociateMSFAA = "associate-msfaa", +} diff --git a/sources/packages/backend/workflow/BPMN/camunda-8/assessment-gateway.bpmn b/sources/packages/backend/workflow/BPMN/camunda-8/assessment-gateway.bpmn index 3e6a95750b..31011e0768 100644 --- a/sources/packages/backend/workflow/BPMN/camunda-8/assessment-gateway.bpmn +++ b/sources/packages/backend/workflow/BPMN/camunda-8/assessment-gateway.bpmn @@ -1,5 +1,5 @@ - + @@ -63,17 +63,17 @@ save-assessment-data-task Activity_09v8xl0 Activity_0w3u365 - Activity_0c3xjw5 + save-assessment-data-part-time-task Gateway_1hwknxt Gateway_1m2js1c - Activity_1s9o49x + update-application-status-to-assessment-task associate-msfaa-task Event_0mtgfbi Gateway_04wql0w update-noa-status-to-required-task update-noa-status-to-not-required-task save-disbursement-task - Activity_15g0nan + save-disbursement-part-time-task @@ -558,7 +558,7 @@ Flow_1k200x2 Flow_17yc7mz - + @@ -573,9 +573,9 @@ - - - + + + Flow_1izp0bk Flow_1f8ymzi @@ -587,7 +587,7 @@ Flow_1a4wzic Flow_01iq5cw - + @@ -645,10 +645,10 @@ =assessmentTriggerType != "Original assessment" - + =assessmentTriggerType = "Original assessment" - + @@ -663,7 +663,7 @@ Flow_0qmdwld Flow_0wed99j - + @@ -895,7 +895,7 @@ - + @@ -905,7 +905,7 @@ - + @@ -931,7 +931,7 @@ - + diff --git a/sources/packages/backend/workflow/test/2021-2022/assessment-gateway/assessment-gateway.originalAssessment.e2e-spec.ts b/sources/packages/backend/workflow/test/2021-2022/assessment-gateway/assessment-gateway.originalAssessment.e2e-spec.ts new file mode 100644 index 0000000000..6392b4516a --- /dev/null +++ b/sources/packages/backend/workflow/test/2021-2022/assessment-gateway/assessment-gateway.originalAssessment.e2e-spec.ts @@ -0,0 +1,60 @@ +import { ASSESSMENT_ID } from "@sims/services/workflow/variables/assessment-gateway"; +import { + ApplicationExceptionStatus, + AssessmentTriggerType, +} from "@sims/sims-db"; +import { AssessmentConsolidatedData } from "../../models"; +import { ZBClient } from "zeebe-node"; +import { + createFakeConsolidatedFulltimeData, + ZeebeMockedClient, + PROCESS_INSTANCE_CREATE_TIMEOUT, + WorkflowServiceTasks, + createFakeSingleIndependentStudentData, + expectToPassThroughServiceTasks, +} from "../../test-utils"; +import { PROGRAM_YEAR } from "../constants/program-year.constants"; + +describe(`E2E Test Workflow assessment gateway on original assessment for ${PROGRAM_YEAR}`, () => { + let zeebeClientProvider: ZBClient; + beforeAll(async () => { + zeebeClientProvider = ZeebeMockedClient.getMockedZeebeInstance(); + }); + + it("Should follow the expected workflow path when student is single and independent without application exception and PIR.", async () => { + // Arrange + const assessmentConsolidatedData: AssessmentConsolidatedData = { + ...createFakeConsolidatedFulltimeData(PROGRAM_YEAR), + assessmentTriggerType: AssessmentTriggerType.OriginalAssessment, + ...createFakeSingleIndependentStudentData(), + // Application with PIR not required. + studentDataSelectedOffering: 1, + }; + + // Act/Assert + const assessmentGatewayResponse = + await zeebeClientProvider.createProcessInstanceWithResult({ + bpmnProcessId: "assessment-gateway", + variables: { + [ASSESSMENT_ID]: 1, + // Data that will be returned by the worker that subscribe to load assessment data service task. + [`${WorkflowServiceTasks.LoadAssessmentConsolidatedData}-result`]: + assessmentConsolidatedData, + [`${WorkflowServiceTasks.VerifyApplicationExceptions}-result`]: { + // Application with no exception. + applicationExceptionStatus: ApplicationExceptionStatus.Approved, + }, + }, + requestTimeout: PROCESS_INSTANCE_CREATE_TIMEOUT, + }); + expectToPassThroughServiceTasks( + assessmentGatewayResponse.variables, + WorkflowServiceTasks.AssociateWorkflowInstance, + WorkflowServiceTasks.VerifyApplicationExceptions, + WorkflowServiceTasks.ProgramInfoNotRequired, + WorkflowServiceTasks.SaveDisbursementSchedules, + WorkflowServiceTasks.AssociateMSFAA, + WorkflowServiceTasks.UpdateNOAStatusToRequired, + ); + }); +}); diff --git a/sources/packages/backend/workflow/test/2021-2022/assessment-gateway/assessment-gateway.studentAppeal.e2e-spec.ts b/sources/packages/backend/workflow/test/2021-2022/assessment-gateway/assessment-gateway.studentAppeal.e2e-spec.ts new file mode 100644 index 0000000000..3d0c2b2148 --- /dev/null +++ b/sources/packages/backend/workflow/test/2021-2022/assessment-gateway/assessment-gateway.studentAppeal.e2e-spec.ts @@ -0,0 +1,54 @@ +import { ASSESSMENT_ID } from "@sims/services/workflow/variables/assessment-gateway"; +import { AssessmentTriggerType } from "@sims/sims-db"; +import { ZBClient } from "zeebe-node"; +import { AssessmentConsolidatedData } from "../../models"; +import { + createFakeConsolidatedFulltimeData, + ZeebeMockedClient, + PROCESS_INSTANCE_CREATE_TIMEOUT, + WorkflowServiceTasks, + createFakeSingleIndependentStudentData, + expectToPassThroughServiceTasks, + expectNotToPassThroughServiceTasks, +} from "../../test-utils"; +import { PROGRAM_YEAR } from "../constants/program-year.constants"; + +describe(`E2E Test Workflow assessment gateway on student appeal for ${PROGRAM_YEAR}`, () => { + let zeebeClientProvider: ZBClient; + beforeAll(async () => { + zeebeClientProvider = ZeebeMockedClient.getMockedZeebeInstance(); + }); + + it("Should follow the expected workflow path when student single and independent.", async () => { + // Arrange + const assessmentConsolidatedData: AssessmentConsolidatedData = { + ...createFakeConsolidatedFulltimeData(PROGRAM_YEAR), + assessmentTriggerType: AssessmentTriggerType.StudentAppeal, + ...createFakeSingleIndependentStudentData(), + }; + + // Act/Assert + const assessmentGatewayResponse = + await zeebeClientProvider.createProcessInstanceWithResult({ + bpmnProcessId: "assessment-gateway", + variables: { + [ASSESSMENT_ID]: 1, + // Data that will be returned by the worker that subscribe to load assessment data service task. + [`${WorkflowServiceTasks.LoadAssessmentConsolidatedData}-result`]: + assessmentConsolidatedData, + }, + requestTimeout: PROCESS_INSTANCE_CREATE_TIMEOUT, + }); + expectToPassThroughServiceTasks( + assessmentGatewayResponse.variables, + WorkflowServiceTasks.AssociateWorkflowInstance, + WorkflowServiceTasks.SaveDisbursementSchedules, + WorkflowServiceTasks.UpdateNOAStatusToNotRequired, + ); + expectNotToPassThroughServiceTasks( + assessmentGatewayResponse.variables, + WorkflowServiceTasks.UpdateApplicationStatusToInProgress, + WorkflowServiceTasks.UpdateApplicationStatusToAssessment, + ); + }); +}); diff --git a/sources/packages/backend/workflow/test/2021-2022/fulltime-assessment/fulltime-assessment-2021-2022.e2e-spec.ts b/sources/packages/backend/workflow/test/2021-2022/fulltime-assessment/fulltime-assessment-2021-2022.e2e-spec.ts index 52b4897703..fc7e6e1744 100644 --- a/sources/packages/backend/workflow/test/2021-2022/fulltime-assessment/fulltime-assessment-2021-2022.e2e-spec.ts +++ b/sources/packages/backend/workflow/test/2021-2022/fulltime-assessment/fulltime-assessment-2021-2022.e2e-spec.ts @@ -5,13 +5,17 @@ import { CalculatedAssessmentModel, } from "../../models"; import { ZBClient } from "zeebe-node"; -import { createFakeAssessmentConsolidatedData } from "../../test-utils"; +import { + createFakeAssessmentConsolidatedData, + PROCESS_INSTANCE_CREATE_TIMEOUT, + ZeebeMockedClient, +} from "../../test-utils"; import { PROGRAM_YEAR } from "../constants/program-year.constants"; describe(`E2E Test Workflow fulltime-assessment-${PROGRAM_YEAR}`, () => { let zeebeClientProvider: ZBClient; beforeAll(async () => { - zeebeClientProvider = new ZBClient(); + zeebeClientProvider = ZeebeMockedClient.getMockedZeebeInstance(); }); it("Should generate expected fulltime assessment values when the student is single and independent.", async () => { @@ -54,7 +58,13 @@ describe(`E2E Test Workflow fulltime-assessment-${PROGRAM_YEAR}`, () => { await zeebeClientProvider.createProcessInstanceWithResult< AssessmentConsolidatedData, CalculatedAssessmentModel - >(`fulltime-assessment-${PROGRAM_YEAR}`, assessmentConsolidatedData); + >({ + bpmnProcessId: `fulltime-assessment-${PROGRAM_YEAR}`, + variables: { + ...assessmentConsolidatedData, + }, + requestTimeout: PROCESS_INSTANCE_CREATE_TIMEOUT, + }); // TODO: totalFederalContribution and totalProvincialContribution needs to be validated // once it is fixed in bpmn. expect(calculatedAssessment.variables.offeringWeeks).toBe( diff --git a/sources/packages/backend/workflow/test/2022-2023/assessment-gateway/assessment-gateway.originalAssessment.e2e-spec.ts b/sources/packages/backend/workflow/test/2022-2023/assessment-gateway/assessment-gateway.originalAssessment.e2e-spec.ts new file mode 100644 index 0000000000..f7a60d9952 --- /dev/null +++ b/sources/packages/backend/workflow/test/2022-2023/assessment-gateway/assessment-gateway.originalAssessment.e2e-spec.ts @@ -0,0 +1,60 @@ +import { ASSESSMENT_ID } from "@sims/services/workflow/variables/assessment-gateway"; +import { + ApplicationExceptionStatus, + AssessmentTriggerType, +} from "@sims/sims-db"; +import { ZBClient } from "zeebe-node"; +import { AssessmentConsolidatedData } from "../../models"; +import { + createFakeConsolidatedFulltimeData, + ZeebeMockedClient, + PROCESS_INSTANCE_CREATE_TIMEOUT, + WorkflowServiceTasks, + createFakeSingleIndependentStudentData, + expectToPassThroughServiceTasks, +} from "../../test-utils"; +import { PROGRAM_YEAR } from "../constants/program-year.constants"; + +describe(`E2E Test Workflow assessment gateway on original assessment for ${PROGRAM_YEAR}`, () => { + let zeebeClientProvider: ZBClient; + beforeAll(async () => { + zeebeClientProvider = ZeebeMockedClient.getMockedZeebeInstance(); + }); + + it("Should follow the expected workflow path when student is single and independent without application exception and PIR.", async () => { + // Arrange + const assessmentConsolidatedData: AssessmentConsolidatedData = { + ...createFakeConsolidatedFulltimeData(PROGRAM_YEAR), + assessmentTriggerType: AssessmentTriggerType.OriginalAssessment, + ...createFakeSingleIndependentStudentData(), + // Application with PIR not required. + studentDataSelectedOffering: 1, + }; + + // Act/Assert + const assessmentGatewayResponse = + await zeebeClientProvider.createProcessInstanceWithResult({ + bpmnProcessId: "assessment-gateway", + variables: { + [ASSESSMENT_ID]: 1, + // Data that will be returned by the worker that subscribe to load assessment data service task. + [`${WorkflowServiceTasks.LoadAssessmentConsolidatedData}-result`]: + assessmentConsolidatedData, + [`${WorkflowServiceTasks.VerifyApplicationExceptions}-result`]: { + // Application with no exception. + applicationExceptionStatus: ApplicationExceptionStatus.Approved, + }, + }, + requestTimeout: PROCESS_INSTANCE_CREATE_TIMEOUT, + }); + expectToPassThroughServiceTasks( + assessmentGatewayResponse.variables, + WorkflowServiceTasks.AssociateWorkflowInstance, + WorkflowServiceTasks.VerifyApplicationExceptions, + WorkflowServiceTasks.ProgramInfoNotRequired, + WorkflowServiceTasks.SaveDisbursementSchedules, + WorkflowServiceTasks.AssociateMSFAA, + WorkflowServiceTasks.UpdateNOAStatusToRequired, + ); + }); +}); diff --git a/sources/packages/backend/workflow/test/2022-2023/assessment-gateway/assessment-gateway.studentAppeal.e2e-spec.ts b/sources/packages/backend/workflow/test/2022-2023/assessment-gateway/assessment-gateway.studentAppeal.e2e-spec.ts new file mode 100644 index 0000000000..3d0c2b2148 --- /dev/null +++ b/sources/packages/backend/workflow/test/2022-2023/assessment-gateway/assessment-gateway.studentAppeal.e2e-spec.ts @@ -0,0 +1,54 @@ +import { ASSESSMENT_ID } from "@sims/services/workflow/variables/assessment-gateway"; +import { AssessmentTriggerType } from "@sims/sims-db"; +import { ZBClient } from "zeebe-node"; +import { AssessmentConsolidatedData } from "../../models"; +import { + createFakeConsolidatedFulltimeData, + ZeebeMockedClient, + PROCESS_INSTANCE_CREATE_TIMEOUT, + WorkflowServiceTasks, + createFakeSingleIndependentStudentData, + expectToPassThroughServiceTasks, + expectNotToPassThroughServiceTasks, +} from "../../test-utils"; +import { PROGRAM_YEAR } from "../constants/program-year.constants"; + +describe(`E2E Test Workflow assessment gateway on student appeal for ${PROGRAM_YEAR}`, () => { + let zeebeClientProvider: ZBClient; + beforeAll(async () => { + zeebeClientProvider = ZeebeMockedClient.getMockedZeebeInstance(); + }); + + it("Should follow the expected workflow path when student single and independent.", async () => { + // Arrange + const assessmentConsolidatedData: AssessmentConsolidatedData = { + ...createFakeConsolidatedFulltimeData(PROGRAM_YEAR), + assessmentTriggerType: AssessmentTriggerType.StudentAppeal, + ...createFakeSingleIndependentStudentData(), + }; + + // Act/Assert + const assessmentGatewayResponse = + await zeebeClientProvider.createProcessInstanceWithResult({ + bpmnProcessId: "assessment-gateway", + variables: { + [ASSESSMENT_ID]: 1, + // Data that will be returned by the worker that subscribe to load assessment data service task. + [`${WorkflowServiceTasks.LoadAssessmentConsolidatedData}-result`]: + assessmentConsolidatedData, + }, + requestTimeout: PROCESS_INSTANCE_CREATE_TIMEOUT, + }); + expectToPassThroughServiceTasks( + assessmentGatewayResponse.variables, + WorkflowServiceTasks.AssociateWorkflowInstance, + WorkflowServiceTasks.SaveDisbursementSchedules, + WorkflowServiceTasks.UpdateNOAStatusToNotRequired, + ); + expectNotToPassThroughServiceTasks( + assessmentGatewayResponse.variables, + WorkflowServiceTasks.UpdateApplicationStatusToInProgress, + WorkflowServiceTasks.UpdateApplicationStatusToAssessment, + ); + }); +}); diff --git a/sources/packages/backend/workflow/test/2022-2023/fulltime-assessment/fulltime-assessment-2022-2023.e2e-spec.ts b/sources/packages/backend/workflow/test/2022-2023/fulltime-assessment/fulltime-assessment-2022-2023.e2e-spec.ts index 56a1779466..f289758941 100644 --- a/sources/packages/backend/workflow/test/2022-2023/fulltime-assessment/fulltime-assessment-2022-2023.e2e-spec.ts +++ b/sources/packages/backend/workflow/test/2022-2023/fulltime-assessment/fulltime-assessment-2022-2023.e2e-spec.ts @@ -5,13 +5,17 @@ import { CalculatedAssessmentModel, } from "../../models"; import { ZBClient } from "zeebe-node"; -import { createFakeAssessmentConsolidatedData } from "../../test-utils"; +import { + createFakeAssessmentConsolidatedData, + PROCESS_INSTANCE_CREATE_TIMEOUT, + ZeebeMockedClient, +} from "../../test-utils"; import { PROGRAM_YEAR } from "../constants/program-year.constants"; describe(`E2E Test Workflow fulltime-assessment-${PROGRAM_YEAR}`, () => { let zeebeClientProvider: ZBClient; beforeAll(async () => { - zeebeClientProvider = new ZBClient(); + zeebeClientProvider = ZeebeMockedClient.getMockedZeebeInstance(); }); it("Should generate expected fulltime assessment values when the student is single and independent.", async () => { @@ -54,7 +58,13 @@ describe(`E2E Test Workflow fulltime-assessment-${PROGRAM_YEAR}`, () => { await zeebeClientProvider.createProcessInstanceWithResult< AssessmentConsolidatedData, CalculatedAssessmentModel - >(`fulltime-assessment-${PROGRAM_YEAR}`, assessmentConsolidatedData); + >({ + bpmnProcessId: `fulltime-assessment-${PROGRAM_YEAR}`, + variables: { + ...assessmentConsolidatedData, + }, + requestTimeout: PROCESS_INSTANCE_CREATE_TIMEOUT, + }); // TODO: totalFederalContribution and totalProvincialContribution needs to be validated // once it is fixed in bpmn. expect(calculatedAssessment.variables.offeringWeeks).toBe( diff --git a/sources/packages/backend/workflow/test/2023-2024/assessment-gateway/assessment-gateway.originalAssessment.e2e-spec.ts b/sources/packages/backend/workflow/test/2023-2024/assessment-gateway/assessment-gateway.originalAssessment.e2e-spec.ts new file mode 100644 index 0000000000..fc8286a56e --- /dev/null +++ b/sources/packages/backend/workflow/test/2023-2024/assessment-gateway/assessment-gateway.originalAssessment.e2e-spec.ts @@ -0,0 +1,60 @@ +import { ASSESSMENT_ID } from "@sims/services/workflow/variables/assessment-gateway"; +import { + ApplicationExceptionStatus, + AssessmentTriggerType, +} from "@sims/sims-db"; +import { ZBClient } from "zeebe-node"; +import { AssessmentConsolidatedData } from "../../models"; +import { + createFakeConsolidatedFulltimeData, + ZeebeMockedClient, + PROCESS_INSTANCE_CREATE_TIMEOUT, + WorkflowServiceTasks, + createFakeSingleIndependentStudentData, + expectToPassThroughServiceTasks, +} from "../../test-utils"; +import { PROGRAM_YEAR } from "../constants/program-year.constants"; + +describe(`E2E Test Workflow assessment gateway on original assessment for ${PROGRAM_YEAR}`, () => { + let zeebeClientProvider: ZBClient; + beforeAll(async () => { + zeebeClientProvider = ZeebeMockedClient.getMockedZeebeInstance(); + }); + + it("Should follow the expected workflow path when student is single and independent without application exception and PIR.", async () => { + // Arrange + const assessmentConsolidatedData: AssessmentConsolidatedData = { + ...createFakeConsolidatedFulltimeData(PROGRAM_YEAR), + assessmentTriggerType: AssessmentTriggerType.OriginalAssessment, + ...createFakeSingleIndependentStudentData(), + // Application with PIR not required. + studentDataSelectedOffering: 1, + }; + + // Act/Assert + const assessmentGatewayResponse = + await zeebeClientProvider.createProcessInstanceWithResult({ + bpmnProcessId: "assessment-gateway", + variables: { + [ASSESSMENT_ID]: 1, + // Data that will be returned by the worker that subscribe to load assessment consolidated data service task. + [`${WorkflowServiceTasks.LoadAssessmentConsolidatedData}-result`]: + assessmentConsolidatedData, + [`${WorkflowServiceTasks.VerifyApplicationExceptions}-result`]: { + // Application with no exception. + applicationExceptionStatus: ApplicationExceptionStatus.Approved, + }, + }, + requestTimeout: PROCESS_INSTANCE_CREATE_TIMEOUT, + }); + expectToPassThroughServiceTasks( + assessmentGatewayResponse.variables, + WorkflowServiceTasks.AssociateWorkflowInstance, + WorkflowServiceTasks.VerifyApplicationExceptions, + WorkflowServiceTasks.ProgramInfoNotRequired, + WorkflowServiceTasks.SaveDisbursementSchedules, + WorkflowServiceTasks.AssociateMSFAA, + WorkflowServiceTasks.UpdateNOAStatusToRequired, + ); + }); +}); diff --git a/sources/packages/backend/workflow/test/2023-2024/assessment-gateway/assessment-gateway.studentAppeal.e2e-spec.ts b/sources/packages/backend/workflow/test/2023-2024/assessment-gateway/assessment-gateway.studentAppeal.e2e-spec.ts new file mode 100644 index 0000000000..3d0c2b2148 --- /dev/null +++ b/sources/packages/backend/workflow/test/2023-2024/assessment-gateway/assessment-gateway.studentAppeal.e2e-spec.ts @@ -0,0 +1,54 @@ +import { ASSESSMENT_ID } from "@sims/services/workflow/variables/assessment-gateway"; +import { AssessmentTriggerType } from "@sims/sims-db"; +import { ZBClient } from "zeebe-node"; +import { AssessmentConsolidatedData } from "../../models"; +import { + createFakeConsolidatedFulltimeData, + ZeebeMockedClient, + PROCESS_INSTANCE_CREATE_TIMEOUT, + WorkflowServiceTasks, + createFakeSingleIndependentStudentData, + expectToPassThroughServiceTasks, + expectNotToPassThroughServiceTasks, +} from "../../test-utils"; +import { PROGRAM_YEAR } from "../constants/program-year.constants"; + +describe(`E2E Test Workflow assessment gateway on student appeal for ${PROGRAM_YEAR}`, () => { + let zeebeClientProvider: ZBClient; + beforeAll(async () => { + zeebeClientProvider = ZeebeMockedClient.getMockedZeebeInstance(); + }); + + it("Should follow the expected workflow path when student single and independent.", async () => { + // Arrange + const assessmentConsolidatedData: AssessmentConsolidatedData = { + ...createFakeConsolidatedFulltimeData(PROGRAM_YEAR), + assessmentTriggerType: AssessmentTriggerType.StudentAppeal, + ...createFakeSingleIndependentStudentData(), + }; + + // Act/Assert + const assessmentGatewayResponse = + await zeebeClientProvider.createProcessInstanceWithResult({ + bpmnProcessId: "assessment-gateway", + variables: { + [ASSESSMENT_ID]: 1, + // Data that will be returned by the worker that subscribe to load assessment data service task. + [`${WorkflowServiceTasks.LoadAssessmentConsolidatedData}-result`]: + assessmentConsolidatedData, + }, + requestTimeout: PROCESS_INSTANCE_CREATE_TIMEOUT, + }); + expectToPassThroughServiceTasks( + assessmentGatewayResponse.variables, + WorkflowServiceTasks.AssociateWorkflowInstance, + WorkflowServiceTasks.SaveDisbursementSchedules, + WorkflowServiceTasks.UpdateNOAStatusToNotRequired, + ); + expectNotToPassThroughServiceTasks( + assessmentGatewayResponse.variables, + WorkflowServiceTasks.UpdateApplicationStatusToInProgress, + WorkflowServiceTasks.UpdateApplicationStatusToAssessment, + ); + }); +}); diff --git a/sources/packages/backend/workflow/test/2023-2024/fulltime-assessment/fulltime-assessment-2023-2024.e2e-spec.ts b/sources/packages/backend/workflow/test/2023-2024/fulltime-assessment/fulltime-assessment-2023-2024.e2e-spec.ts index 6fb57744aa..1c38f73a5d 100644 --- a/sources/packages/backend/workflow/test/2023-2024/fulltime-assessment/fulltime-assessment-2023-2024.e2e-spec.ts +++ b/sources/packages/backend/workflow/test/2023-2024/fulltime-assessment/fulltime-assessment-2023-2024.e2e-spec.ts @@ -5,13 +5,17 @@ import { CalculatedAssessmentModel, } from "../../models"; import { ZBClient } from "zeebe-node"; -import { createFakeAssessmentConsolidatedData } from "../../test-utils"; +import { + createFakeAssessmentConsolidatedData, + PROCESS_INSTANCE_CREATE_TIMEOUT, + ZeebeMockedClient, +} from "../../test-utils"; import { PROGRAM_YEAR } from "../constants/program-year.constants"; describe(`E2E Test Workflow fulltime-assessment-${PROGRAM_YEAR}`, () => { let zeebeClientProvider: ZBClient; beforeAll(async () => { - zeebeClientProvider = new ZBClient(); + zeebeClientProvider = ZeebeMockedClient.getMockedZeebeInstance(); }); it("Should generate expected fulltime assessment values when the student is single and independent.", async () => { @@ -22,11 +26,6 @@ describe(`E2E Test Workflow fulltime-assessment-${PROGRAM_YEAR}`, () => { assessmentConsolidatedData.offeringStudyStartDate = "2024-02-01"; assessmentConsolidatedData.offeringStudyEndDate = "2024-05-24"; - await zeebeClientProvider.createProcessInstanceWithResult( - `fulltime-assessment-${PROGRAM_YEAR}`, - assessmentConsolidatedData, - ); - const expectedAssessmentData: AssessmentModel = { weeks: assessmentConsolidatedData.offeringWeeks, tuitionCost: @@ -59,7 +58,13 @@ describe(`E2E Test Workflow fulltime-assessment-${PROGRAM_YEAR}`, () => { await zeebeClientProvider.createProcessInstanceWithResult< AssessmentConsolidatedData, CalculatedAssessmentModel - >(`fulltime-assessment-${PROGRAM_YEAR}`, assessmentConsolidatedData); + >({ + bpmnProcessId: `fulltime-assessment-${PROGRAM_YEAR}`, + variables: { + ...assessmentConsolidatedData, + }, + requestTimeout: PROCESS_INSTANCE_CREATE_TIMEOUT, + }); // TODO: totalFederalContribution and totalProvincialContribution needs to be validated // once it is fixed in bpmn. expect(calculatedAssessment.variables.offeringWeeks).toBe( diff --git a/sources/packages/backend/workflow/test/jest-e2e.json b/sources/packages/backend/workflow/test/jest-e2e.json index afde563e8b..4f0a222032 100644 --- a/sources/packages/backend/workflow/test/jest-e2e.json +++ b/sources/packages/backend/workflow/test/jest-e2e.json @@ -10,7 +10,7 @@ "transform": { "^.+\\.(t|j)s$": "ts-jest" }, - "testTimeout": 60000, + "testTimeout": 90000, "setupFiles": [ "/../env-setup.js" ], diff --git a/sources/packages/backend/workflow/test/models/assessment.model.ts b/sources/packages/backend/workflow/test/models/assessment.model.ts index e90d3b975d..0e8150d802 100644 --- a/sources/packages/backend/workflow/test/models/assessment.model.ts +++ b/sources/packages/backend/workflow/test/models/assessment.model.ts @@ -95,6 +95,8 @@ export interface AssessmentConsolidatedData { partner1StudentStudyWeeks?: number; partner1CRAReportedIncome?: number; partner1TotalIncome?: number; + assessmentId?: number; + studentDataSelectedOffering: number; } export interface AssessmentModel { diff --git a/sources/packages/backend/workflow/test/test-utils/constants/system-configurations-constants.ts b/sources/packages/backend/workflow/test/test-utils/constants/system-configurations-constants.ts new file mode 100644 index 0000000000..07a164b907 --- /dev/null +++ b/sources/packages/backend/workflow/test/test-utils/constants/system-configurations-constants.ts @@ -0,0 +1,5 @@ +/** + * Timeout in milliseconds for the zeebe client to create process instance + * and wait for response. + */ +export const PROCESS_INSTANCE_CREATE_TIMEOUT = 90000; diff --git a/sources/packages/backend/workflow/test/test-utils/constants/workflow-variables-constants.ts b/sources/packages/backend/workflow/test/test-utils/constants/workflow-variables-constants.ts new file mode 100644 index 0000000000..35df2f38d8 --- /dev/null +++ b/sources/packages/backend/workflow/test/test-utils/constants/workflow-variables-constants.ts @@ -0,0 +1,18 @@ +export enum WorkflowServiceTasks { + AssociateWorkflowInstance = "associate-workflow-instance-task", + LoadAssessmentConsolidatedData = "load-assessment-data-task", + VerifyApplicationExceptions = "verify-application-exceptions-task", + UpdateApplicationStatusToInProgress = "update-application-status-to-in-progress-task", + ProgramInfoRequired = "program-info-required-task", + ProgramInfoNotRequired = "program-info-not-required-task", + CreateIncomeRequest = "create-income-request", + CheckIncomeRequest = "check-income-request", + UpdateApplicationStatusToAssessment = "update-application-status-to-assessment-task", + UpdateNOAStatusToRequired = "update-noa-status-to-required-task", + UpdateNOAStatusToNotRequired = "update-noa-status-to-not-required-task", + SaveAssessmentData = "save-assessment-data-task", + SaveAssessmentDataPartTime = "save-assessment-data-part-time-task", + SaveDisbursementSchedules = "save-disbursement-task", + SaveDisbursementSchedulesPartTime = "save-disbursement-part-time-task", + AssociateMSFAA = "associate-msfaa-task", +} diff --git a/sources/packages/backend/workflow/test/test-utils/factories/assessment-consolidated-data.ts b/sources/packages/backend/workflow/test/test-utils/factories/assessment-consolidated-data.ts index 8ae91c5842..09a7997072 100644 --- a/sources/packages/backend/workflow/test/test-utils/factories/assessment-consolidated-data.ts +++ b/sources/packages/backend/workflow/test/test-utils/factories/assessment-consolidated-data.ts @@ -4,7 +4,14 @@ import { YesNoOptions, OfferingDeliveryOptions, } from "@sims/test-utils"; +import { OfferingIntensity } from "@sims/sims-db"; +/** + * Create fake consolidated data + * based on program year. + * @param programYear program year. + * @returns assessment consolidated data. + */ export function createFakeAssessmentConsolidatedData( programYear: string, ): AssessmentConsolidatedData { @@ -71,6 +78,7 @@ function setDefaultAssessmentConsolidatedData(): AssessmentConsolidatedData { studentDataDaycareCosts12YearsOrOver: null, studentDataLivingathomeRent: null, studentDataTransportationCost: null, + studentDataSelectedOffering: null, offeringCourseLoad: null, parent1Contributions: null, parent1Ei: null, @@ -97,5 +105,36 @@ function setDefaultAssessmentConsolidatedData(): AssessmentConsolidatedData { partner1StudentStudyWeeks: null, partner1TotalIncome: null, partner1CRAReportedIncome: null, + assessmentId: null, } as AssessmentConsolidatedData; } + +/** + * Create fake full time consolidated data + * based on program year. + * @param programYear program year. + * @returns assessment consolidated data for full time application. + */ +export function createFakeConsolidatedFulltimeData( + programYear: string, +): AssessmentConsolidatedData { + const [, programEndYear] = programYear.split("-"); + const assessmentConsolidatedData = + createFakeAssessmentConsolidatedData(programYear); + assessmentConsolidatedData.offeringIntensity = OfferingIntensity.fullTime; + assessmentConsolidatedData.offeringStudyStartDate = `${programEndYear}-02-01`; + assessmentConsolidatedData.offeringStudyEndDate = `${programEndYear}-05-24`; + return assessmentConsolidatedData; +} + +/** + * Create fake single independent student data. + * @returns consolidated data for single independent student. + */ +export function createFakeSingleIndependentStudentData(): Partial { + return { + // Single independent student. + studentDataDependantstatus: "independant", + studentDataRelationshipStatus: "single", + }; +} diff --git a/sources/packages/backend/workflow/test/test-utils/index.ts b/sources/packages/backend/workflow/test/test-utils/index.ts index 2b37ddbb71..f05d9d4b1d 100644 --- a/sources/packages/backend/workflow/test/test-utils/index.ts +++ b/sources/packages/backend/workflow/test/test-utils/index.ts @@ -1 +1,5 @@ export * from "./factories/assessment-consolidated-data"; +export * from "./mock/zeebe-worker-mock"; +export * from "./constants/workflow-variables-constants"; +export * from "./constants/system-configurations-constants"; +export * from "./validation/workflow-validation.utils"; diff --git a/sources/packages/backend/workflow/test/test-utils/mock/zeebe-worker-mock.ts b/sources/packages/backend/workflow/test/test-utils/mock/zeebe-worker-mock.ts new file mode 100644 index 0000000000..5c165e2e81 --- /dev/null +++ b/sources/packages/backend/workflow/test/test-utils/mock/zeebe-worker-mock.ts @@ -0,0 +1,98 @@ +import { Duration, ZBClient, ZBWorkerConfig, ZeebeJob } from "zeebe-node"; +import { Workers } from "@sims/services/constants"; + +/** + * Zeebe client to be used in mock implementation + * of the workers. + */ +const zeebeWorkerClient = new ZBClient(); + +const fakeWorkers: ZBWorkerConfig[] = [ + { + taskType: Workers.AssociateWorkflowInstance, + taskHandler: mockTaskHandler, + }, + { + taskType: Workers.SaveDisbursementSchedules, + taskHandler: mockTaskHandler, + }, + { + taskType: Workers.SaveAssessmentData, + taskHandler: mockTaskHandler, + }, + { + taskType: Workers.UpdateNOAStatus, + taskHandler: mockTaskHandler, + }, + { + taskType: Workers.LoadAssessmentConsolidatedData, + taskHandler: mockTaskHandler, + }, + { + taskType: Workers.UpdateApplicationStatus, + taskHandler: mockTaskHandler, + }, + { + taskType: Workers.VerifyApplicationExceptions, + taskHandler: mockTaskHandler, + }, + { + taskType: Workers.ProgramInfoRequest, + taskHandler: mockTaskHandler, + }, + { + taskType: Workers.CreateIncomeRequest, + taskHandler: (job) => { + zeebeWorkerClient.publishMessage({ + name: "income-verified", + correlationKey: "1", + variables: {}, + timeToLive: Duration.seconds.of(60), + }); + return job.complete({ + incomeVerificationCompleted: true, + incomeVerificationId: 1, + [job.elementId]: true, + }); + }, + }, + { + taskType: Workers.CheckIncomeRequest, + taskHandler: mockTaskHandler, + }, + { + taskType: Workers.AssociateMSFAA, + taskHandler: mockTaskHandler, + }, +]; + +/** + * Mock task handler which returns job complete + * with the mock data set at create process instance level + * for that particular worker. + * @param job worker job. + * @returns mock task handler response. + */ +export function mockTaskHandler(job: ZeebeJob) { + return job.complete({ + [job.elementId]: true, + ...job.variables[`${job.elementId}-result`], + }); +} + +/** + * Zeebe client with mocked worker implementations. + */ +export class ZeebeMockedClient { + private static mockedZeebeClient: ZBClient; + + static getMockedZeebeInstance() { + if (!ZeebeMockedClient.mockedZeebeClient) { + ZeebeMockedClient.mockedZeebeClient = new ZBClient(); + fakeWorkers.forEach((fakeWorker) => + ZeebeMockedClient.mockedZeebeClient.createWorker(fakeWorker), + ); + } + return ZeebeMockedClient.mockedZeebeClient; + } +} diff --git a/sources/packages/backend/workflow/test/test-utils/validation/workflow-validation.utils.ts b/sources/packages/backend/workflow/test/test-utils/validation/workflow-validation.utils.ts new file mode 100644 index 0000000000..58851b3cb9 --- /dev/null +++ b/sources/packages/backend/workflow/test/test-utils/validation/workflow-validation.utils.ts @@ -0,0 +1,31 @@ +import { WorkflowServiceTasks } from "../constants/workflow-variables-constants"; + +/** + * Expects a workflow based on the workflow result + * to pass through given service tasks. + * @param workflowResultVariables workflow result variables + * @param serviceTasks service tasks to verify. + */ +export function expectToPassThroughServiceTasks( + workflowResultVariables: unknown, + ...serviceTasks: WorkflowServiceTasks[] +) { + serviceTasks.forEach((serviceTask) => { + expect(workflowResultVariables[serviceTask]).toBe(true); + }); +} + +/** + * Expects a workflow based on the workflow result + * to NOT pass through given service tasks. + * @param workflowResultVariables workflow result variables + * @param serviceTasks service tasks to verify. + */ +export function expectNotToPassThroughServiceTasks( + workflowResultVariables: unknown, + ...serviceTasks: WorkflowServiceTasks[] +) { + serviceTasks.forEach((serviceTask) => { + expect(workflowResultVariables[serviceTask]).toBeUndefined; + }); +} diff --git a/sources/tests/workflow-docker-compose.yml b/sources/tests/workflow-docker-compose.yml index c0368c8f10..31e45b0a72 100644 --- a/sources/tests/workflow-docker-compose.yml +++ b/sources/tests/workflow-docker-compose.yml @@ -5,7 +5,7 @@ services: environment: - ZEEBE_BROKER_DATA_DISKUSAGECOMMANDWATERMARK=0.998 - ZEEBE_BROKER_DATA_DISKUSAGEREPLICATIONWATERMARK=0.999 - - "JAVA_TOOL_OPTIONS=-Xms256m -Xmx256m" + - "JAVA_TOOL_OPTIONS=-Xms512m -Xmx512m" restart: always workflow: image: workflow-${PROJECT_NAME}:${BUILD_REF}-${BUILD_ID}