From f84bf22629ea11e0d0a78a717ccd9972eb9b3343 Mon Sep 17 00:00:00 2001 From: Brandon Bouchard Date: Fri, 21 Jul 2023 10:16:54 -0700 Subject: [PATCH 1/4] Extended the PIA return API to show COMPLETE PIAs - Only show if COMPLETE status query sent - Only show if user is involved in the PIA (drafter, invitee, or MPO) --- .../modules/pia-intake/pia-intake.service.ts | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/backend/src/modules/pia-intake/pia-intake.service.ts b/src/backend/src/modules/pia-intake/pia-intake.service.ts index 88221d151..4fa9ee8e7 100644 --- a/src/backend/src/modules/pia-intake/pia-intake.service.ts +++ b/src/backend/src/modules/pia-intake/pia-intake.service.ts @@ -247,6 +247,7 @@ export class PiaIntakeService { whereClause.push({ ...commonWhereClause, createdByGuid: user.idir_user_guid, + status: Not(PiaIntakeStatusEnum.COMPLETE), }); // Scenario 2: As an MPO, retrieve all pia-intakes submitted to my ministry for review @@ -263,7 +264,9 @@ export class PiaIntakeService { whereClause.push({ ...commonWhereClause, ministry: In(mpoMinistries), - status: Not(PiaIntakeStatusEnum.INCOMPLETE), + status: Not( + PiaIntakeStatusEnum.INCOMPLETE || PiaIntakeStatusEnum.COMPLETE, + ), }); } } @@ -289,8 +292,30 @@ export class PiaIntakeService { invitee: { createdByGuid: user.idir_user_guid, }, + status: Not(PiaIntakeStatusEnum.COMPLETE), }); + // Scenario 5: Return COMPLETE PIAs if the user is a drafter, invitee, or MPO + if (query.filterByStatus === PiaIntakeStatusEnum.COMPLETE) { + whereClause.push({ + ...commonWhereClause, + createdByGuid: user.idir_user_guid, + status: PiaIntakeStatusEnum.COMPLETE, + }); + whereClause.push({ + ...commonWhereClause, + invitee: { + createdByGuid: user.idir_user_guid, + }, + status: PiaIntakeStatusEnum.COMPLETE, + }); + whereClause.push({ + ...commonWhereClause, + ministry: In(mpoMinistries), + status: PiaIntakeStatusEnum.COMPLETE, + }); + } + // searchText logic - if there is a search text, find the matching titles OR drafter names if (query.searchText) { const searchOperator = ILike(`%${query.searchText}%`); From 6493458032a1d822ff5f6c198af9ba8571f3ebbe Mon Sep 17 00:00:00 2001 From: Brandon Bouchard Date: Fri, 21 Jul 2023 11:14:25 -0700 Subject: [PATCH 2/4] Update COMPLETE PIA query comment. --- .../modules/pia-intake/pia-intake.service.ts | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/src/backend/src/modules/pia-intake/pia-intake.service.ts b/src/backend/src/modules/pia-intake/pia-intake.service.ts index 4fa9ee8e7..ee6040b23 100644 --- a/src/backend/src/modules/pia-intake/pia-intake.service.ts +++ b/src/backend/src/modules/pia-intake/pia-intake.service.ts @@ -264,9 +264,7 @@ export class PiaIntakeService { whereClause.push({ ...commonWhereClause, ministry: In(mpoMinistries), - status: Not( - PiaIntakeStatusEnum.INCOMPLETE || PiaIntakeStatusEnum.COMPLETE, - ), + status: Not(PiaIntakeStatusEnum.INCOMPLETE), }); } } @@ -292,26 +290,12 @@ export class PiaIntakeService { invitee: { createdByGuid: user.idir_user_guid, }, - status: Not(PiaIntakeStatusEnum.COMPLETE), }); - // Scenario 5: Return COMPLETE PIAs if the user is a drafter, invitee, or MPO + // Scenario 5: Return COMPLETE PIAs only if queried and if the user is a drafter, invitee, or MPO on the PIA if (query.filterByStatus === PiaIntakeStatusEnum.COMPLETE) { whereClause.push({ ...commonWhereClause, - createdByGuid: user.idir_user_guid, - status: PiaIntakeStatusEnum.COMPLETE, - }); - whereClause.push({ - ...commonWhereClause, - invitee: { - createdByGuid: user.idir_user_guid, - }, - status: PiaIntakeStatusEnum.COMPLETE, - }); - whereClause.push({ - ...commonWhereClause, - ministry: In(mpoMinistries), status: PiaIntakeStatusEnum.COMPLETE, }); } From b15d554cd13b7e365620cc7311260c3cab597ed3 Mon Sep 17 00:00:00 2001 From: Brandon Bouchard Date: Fri, 21 Jul 2023 15:48:07 -0700 Subject: [PATCH 3/4] Tests. - Fix tests - Fix lint errors --- .../modules/pia-intake/pia-intake.service.ts | 17 +- .../pia-intake/pia-intake.service.spec.ts | 336 ++++++++---------- src/frontend/src/routes/router.tsx | 6 +- 3 files changed, 168 insertions(+), 191 deletions(-) diff --git a/src/backend/src/modules/pia-intake/pia-intake.service.ts b/src/backend/src/modules/pia-intake/pia-intake.service.ts index ee6040b23..b142fa636 100644 --- a/src/backend/src/modules/pia-intake/pia-intake.service.ts +++ b/src/backend/src/modules/pia-intake/pia-intake.service.ts @@ -261,10 +261,16 @@ export class PiaIntakeService { ) { // skip this where clause } else { + const allStatuses = Object.values(PiaIntakeStatusEnum); + const exceptions = [ + PiaIntakeStatusEnum.INCOMPLETE, // can never see PIAs of other users in Incomplete status + PiaIntakeStatusEnum.COMPLETE, // can only see complete if explicitly requested + ]; + const statusIn = allStatuses.filter((s) => !exceptions.includes(s)); whereClause.push({ ...commonWhereClause, ministry: In(mpoMinistries), - status: Not(PiaIntakeStatusEnum.INCOMPLETE), + status: In(statusIn), }); } } @@ -290,16 +296,9 @@ export class PiaIntakeService { invitee: { createdByGuid: user.idir_user_guid, }, + status: Not(PiaIntakeStatusEnum.COMPLETE), }); - // Scenario 5: Return COMPLETE PIAs only if queried and if the user is a drafter, invitee, or MPO on the PIA - if (query.filterByStatus === PiaIntakeStatusEnum.COMPLETE) { - whereClause.push({ - ...commonWhereClause, - status: PiaIntakeStatusEnum.COMPLETE, - }); - } - // searchText logic - if there is a search text, find the matching titles OR drafter names if (query.searchText) { const searchOperator = ILike(`%${query.searchText}%`); diff --git a/src/backend/test/unit/pia-intake/pia-intake.service.spec.ts b/src/backend/test/unit/pia-intake/pia-intake.service.spec.ts index ed5d93df5..8edcb146c 100644 --- a/src/backend/test/unit/pia-intake/pia-intake.service.spec.ts +++ b/src/backend/test/unit/pia-intake/pia-intake.service.spec.ts @@ -2,9 +2,6 @@ import { Test, TestingModule } from '@nestjs/testing'; import { getRepositoryToken } from '@nestjs/typeorm'; import { marked } from 'marked'; -import * as typeormIn from 'typeorm/find-options/operator/In'; -import * as typeormILike from 'typeorm/find-options/operator/ILike'; - import * as pdfHelper from 'src/common/helpers/pdf-helper'; import * as dateHelper from 'src/common/helpers/date-helper'; import * as baseHelper from 'src/common/helpers/base-helper'; @@ -15,7 +12,6 @@ import { KeycloakUser } from 'src/modules/auth/keycloak-user.model'; import { PiaIntakeController } from 'src/modules/pia-intake/pia-intake.controller'; import { PiaIntakeEntity } from 'src/modules/pia-intake/entities/pia-intake.entity'; import { PiaIntakeService } from 'src/modules/pia-intake/pia-intake.service'; -import { Roles } from 'src/common/constants/roles.constants'; import { RolesEnum } from 'src/common/enums/roles.enum'; import { @@ -40,6 +36,8 @@ import { PaginatedRO } from 'src/common/paginated.ro'; import { GetPiaIntakeRO } from 'src/modules/pia-intake/ro/get-pia-intake.ro'; import { PiaFilterDrafterByCurrentUserEnum } from 'src/modules/pia-intake/enums/pia-filter-drafter-by-current-user.enum'; import { Not } from 'typeorm/find-options/operator/Not'; +import { In } from 'typeorm/find-options/operator/In'; +import { ILike } from 'typeorm/find-options/operator/ILike'; import { SortOrderEnum } from 'src/common/enums/sort-order.enum'; import { UpdatePiaIntakeDto } from 'src/modules/pia-intake/dto/update-pia-intake.dto'; import { emptyJsonbValues } from 'test/util/mocks/data/pia-empty-jsonb-values.mock'; @@ -448,19 +446,11 @@ describe('PiaIntakeService', () => { * @method findAll */ describe('`findAll` method', () => { - const typeormInSpy = jest.spyOn(typeormIn, 'In').mockReturnValue(null); - - const typeormILikeSpy = jest - .spyOn(typeormILike, 'ILike') - .mockReturnValue(null); - const omitBaseKeysSpy = jest .spyOn(baseHelper, 'omitBaseKeys') .mockImplementation(() => null); beforeEach(() => { - typeormInSpy.mockClear(); - typeormILikeSpy.mockClear(); omitBaseKeysSpy.mockClear(); }); @@ -483,28 +473,29 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).toHaveBeenCalledWith([ - Roles[RolesEnum.MPO_CITZ].ministry, - ]); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, - ministry: null, - status: Not(PiaIntakeStatusEnum.INCOMPLETE), + ministry: In([GovMinistriesEnum.CITIZENS_SERVICES]), + status: In([ + PiaIntakeStatusEnum.EDIT_IN_PROGRESS, + PiaIntakeStatusEnum.MPO_REVIEW, + PiaIntakeStatusEnum.CPO_REVIEW, + PiaIntakeStatusEnum.FINAL_REVIEW, + ]), }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, ], order: { @@ -544,20 +535,19 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, ], order: { @@ -598,49 +588,57 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).toHaveBeenCalledWith([ - Roles[RolesEnum.MPO_CITZ].ministry, - ]); - - expect(typeormILikeSpy).toHaveBeenCalledTimes(1); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - title: null, + title: ILike('%King Richard%'), + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, - ministry: null, - title: null, - status: Not(PiaIntakeStatusEnum.INCOMPLETE), + ministry: In([GovMinistriesEnum.CITIZENS_SERVICES]), + title: ILike('%King Richard%'), + status: In([ + PiaIntakeStatusEnum.EDIT_IN_PROGRESS, + PiaIntakeStatusEnum.MPO_REVIEW, + PiaIntakeStatusEnum.CPO_REVIEW, + PiaIntakeStatusEnum.FINAL_REVIEW, + ]), }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, - title: null, + title: ILike('%King Richard%'), + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, createdByGuid: user.idir_user_guid, - drafterName: null, + drafterName: ILike('%King Richard%'), + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, - ministry: null, - drafterName: null, - status: Not(PiaIntakeStatusEnum.INCOMPLETE), + ministry: In([GovMinistriesEnum.CITIZENS_SERVICES]), + drafterName: ILike('%King Richard%'), + status: In([ + PiaIntakeStatusEnum.EDIT_IN_PROGRESS, + PiaIntakeStatusEnum.MPO_REVIEW, + PiaIntakeStatusEnum.CPO_REVIEW, + PiaIntakeStatusEnum.FINAL_REVIEW, + ]), }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, - drafterName: null, + drafterName: ILike('%King Richard%'), + status: Not(PiaIntakeStatusEnum.COMPLETE), }, ], order: { @@ -681,34 +679,35 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - expect(typeormILikeSpy).toHaveBeenCalledTimes(1); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - title: null, + title: ILike('%Will Smith%'), + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, - title: null, + title: ILike('%Will Smith%'), + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, createdByGuid: user.idir_user_guid, - drafterName: null, + drafterName: ILike('%Will Smith%'), + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, - drafterName: null, + drafterName: ILike('%Will Smith%'), + status: Not(PiaIntakeStatusEnum.COMPLETE), }, ], order: { @@ -751,23 +750,19 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - status: 'INCOMPLETE', + status: PiaIntakeStatusEnum.INCOMPLETE, }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, - status: 'INCOMPLETE', + status: PiaIntakeStatusEnum.INCOMPLETE, }, ], order: { @@ -810,30 +805,24 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).toHaveBeenCalledWith([ - Roles[RolesEnum.MPO_CITZ].ministry, - ]); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - status: 'MPO_REVIEW', + status: PiaIntakeStatusEnum.MPO_REVIEW, }, { isActive: true, - ministry: null, - status: 'MPO_REVIEW', + ministry: In([GovMinistriesEnum.CITIZENS_SERVICES]), + status: PiaIntakeStatusEnum.MPO_REVIEW, }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, - status: 'MPO_REVIEW', + status: PiaIntakeStatusEnum.MPO_REVIEW, }, ], order: { @@ -874,23 +863,19 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - status: 'INCOMPLETE', + status: PiaIntakeStatusEnum.INCOMPLETE, }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, - status: 'INCOMPLETE', + status: PiaIntakeStatusEnum.INCOMPLETE, }, ], order: { @@ -932,25 +917,21 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - status: 'INCOMPLETE', - ministry: 'CITIZENS_SERVICES', + status: PiaIntakeStatusEnum.INCOMPLETE, + ministry: GovMinistriesEnum.CITIZENS_SERVICES, }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, - status: 'INCOMPLETE', - ministry: 'CITIZENS_SERVICES', + status: PiaIntakeStatusEnum.INCOMPLETE, + ministry: GovMinistriesEnum.CITIZENS_SERVICES, }, ], order: { @@ -991,32 +972,26 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).toHaveBeenCalledWith([ - Roles[RolesEnum.MPO_CITZ].ministry, - ]); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - status: 'MPO_REVIEW', - ministry: 'CITIZENS_SERVICES', + status: PiaIntakeStatusEnum.MPO_REVIEW, + ministry: GovMinistriesEnum.CITIZENS_SERVICES, }, { isActive: true, - ministry: 'CITIZENS_SERVICES', - status: 'MPO_REVIEW', + status: PiaIntakeStatusEnum.MPO_REVIEW, + ministry: GovMinistriesEnum.CITIZENS_SERVICES, }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, - status: 'MPO_REVIEW', - ministry: 'CITIZENS_SERVICES', + status: PiaIntakeStatusEnum.MPO_REVIEW, + ministry: GovMinistriesEnum.CITIZENS_SERVICES, }, ], order: { @@ -1060,17 +1035,13 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - status: 'INCOMPLETE', - ministry: 'CITIZENS_SERVICES', + status: PiaIntakeStatusEnum.INCOMPLETE, + ministry: GovMinistriesEnum.CITIZENS_SERVICES, }, ], order: { @@ -1114,10 +1085,6 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { @@ -1171,12 +1138,6 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).toHaveBeenCalledWith([ - Roles[RolesEnum.MPO_CITZ].ministry, - ]); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { @@ -1234,15 +1195,12 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - expect(typeormILikeSpy).toHaveBeenCalledTimes(1); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - title: null, + title: ILike('%Will Smith%'), status: 'INCOMPLETE', }, { @@ -1250,13 +1208,13 @@ describe('PiaIntakeService', () => { invitee: { createdByGuid: user.idir_user_guid, }, - title: null, + title: ILike('%Will Smith%'), status: 'INCOMPLETE', }, { isActive: true, createdByGuid: user.idir_user_guid, - drafterName: null, + drafterName: ILike('%Will Smith%'), status: 'INCOMPLETE', }, { @@ -1264,7 +1222,7 @@ describe('PiaIntakeService', () => { invitee: { createdByGuid: user.idir_user_guid, }, - drafterName: null, + drafterName: ILike('%Will Smith%'), status: 'INCOMPLETE', }, ], @@ -1307,16 +1265,12 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).toHaveBeenCalledTimes(1); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - title: null, + title: ILike('%King Richard%'), status: 'INCOMPLETE', }, { @@ -1324,13 +1278,13 @@ describe('PiaIntakeService', () => { invitee: { createdByGuid: user.idir_user_guid, }, - title: null, + title: ILike('%King Richard%'), status: 'INCOMPLETE', }, { isActive: true, createdByGuid: user.idir_user_guid, - drafterName: null, + drafterName: ILike('%King Richard%'), status: 'INCOMPLETE', }, { @@ -1338,7 +1292,7 @@ describe('PiaIntakeService', () => { invitee: { createdByGuid: user.idir_user_guid, }, - drafterName: null, + drafterName: ILike('%King Richard%'), status: 'INCOMPLETE', }, ], @@ -1381,24 +1335,18 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).toHaveBeenCalledWith([ - Roles[RolesEnum.MPO_CITZ].ministry, - ]); - - expect(typeormILikeSpy).toHaveBeenCalledTimes(1); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - title: null, + title: ILike('%King Richard%'), status: 'MPO_REVIEW', }, { isActive: true, - ministry: null, - title: null, + ministry: In([GovMinistriesEnum.CITIZENS_SERVICES]), + title: ILike('%King Richard%'), status: 'MPO_REVIEW', }, { @@ -1406,19 +1354,19 @@ describe('PiaIntakeService', () => { invitee: { createdByGuid: user.idir_user_guid, }, - title: null, + title: ILike('%King Richard%'), status: 'MPO_REVIEW', }, { isActive: true, createdByGuid: user.idir_user_guid, - drafterName: null, + drafterName: ILike('%King Richard%'), status: 'MPO_REVIEW', }, { isActive: true, - ministry: null, - drafterName: null, + ministry: In([GovMinistriesEnum.CITIZENS_SERVICES]), + drafterName: ILike('%King Richard%'), status: 'MPO_REVIEW', }, { @@ -1426,7 +1374,7 @@ describe('PiaIntakeService', () => { invitee: { createdByGuid: user.idir_user_guid, }, - drafterName: null, + drafterName: ILike('%King Richard%'), status: 'MPO_REVIEW', }, ], @@ -1468,25 +1416,21 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, - status: 'INCOMPLETE', - ministry: 'FORESTS', + status: PiaIntakeStatusEnum.INCOMPLETE, + ministry: GovMinistriesEnum.FORESTS, }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, - status: 'INCOMPLETE', - ministry: 'FORESTS', + status: PiaIntakeStatusEnum.INCOMPLETE, + ministry: GovMinistriesEnum.FORESTS, }, ], order: { @@ -1526,16 +1470,12 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, - ministry: 'FORESTS', - status: 'MPO_REVIEW', + ministry: GovMinistriesEnum.FORESTS, + status: PiaIntakeStatusEnum.MPO_REVIEW, createdByGuid: user.idir_user_guid, }, { @@ -1543,8 +1483,8 @@ describe('PiaIntakeService', () => { invitee: { createdByGuid: user.idir_user_guid, }, - ministry: 'FORESTS', - status: 'MPO_REVIEW', + ministry: GovMinistriesEnum.FORESTS, + status: PiaIntakeStatusEnum.MPO_REVIEW, }, ], order: { @@ -1584,14 +1524,12 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, @@ -1602,6 +1540,7 @@ describe('PiaIntakeService', () => { invitee: { createdByGuid: user.idir_user_guid, }, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, ], order: { @@ -1641,21 +1580,22 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).toHaveBeenCalledWith([ - GovMinistriesEnum.ATTORNEY_GENERAL, - ]); - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, - ministry: null, // from spy - status: Not(PiaIntakeStatusEnum.INCOMPLETE), + ministry: In([GovMinistriesEnum.ATTORNEY_GENERAL]), + status: In([ + PiaIntakeStatusEnum.EDIT_IN_PROGRESS, + PiaIntakeStatusEnum.MPO_REVIEW, + PiaIntakeStatusEnum.CPO_REVIEW, + PiaIntakeStatusEnum.FINAL_REVIEW, + ]), }, { isActive: true, @@ -1666,6 +1606,7 @@ describe('PiaIntakeService', () => { invitee: { createdByGuid: user.idir_user_guid, }, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, ], order: { @@ -1706,10 +1647,6 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { @@ -1763,10 +1700,6 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { @@ -1824,16 +1757,13 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, ministry: GovMinistriesEnum.ATTORNEY_GENERAL, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, @@ -1846,6 +1776,7 @@ describe('PiaIntakeService', () => { createdByGuid: user.idir_user_guid, }, ministry: GovMinistriesEnum.ATTORNEY_GENERAL, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, ], order: { @@ -1886,21 +1817,19 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { isActive: true, createdByGuid: user.idir_user_guid, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, { isActive: true, invitee: { createdByGuid: user.idir_user_guid, }, + status: Not(PiaIntakeStatusEnum.COMPLETE), }, ], order: { @@ -1942,10 +1871,6 @@ describe('PiaIntakeService', () => { const result = await service.findAll(user, userRoles, query); - expect(typeormInSpy).not.toHaveBeenCalled(); - - expect(typeormILikeSpy).not.toHaveBeenCalled(); - expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ where: [ { @@ -1980,6 +1905,59 @@ describe('PiaIntakeService', () => { }; expect(result).toEqual(expectedResult); }); + + // Scenario 20: User is a drafter, has no roles, and is filtering for COMPLETE PIAs + it('succeeds when the user is only a drafter and is filtering for COMPLETE PIAs', async () => { + const user: KeycloakUser = { ...keycloakUserMock }; + const userRoles = []; + const piaIntakeEntity = { ...piaIntakeEntityMock }; + const query: PiaIntakeFindQuery = { + page: 1, + pageSize: 12, + filterByStatus: PiaIntakeStatusEnum.COMPLETE, + }; + + piaIntakeRepository.findAndCount = jest.fn(async () => { + delay(10); + return [[piaIntakeEntity], 100]; + }); + + omitBaseKeysSpy.mockReturnValue({ ...getPiaIntakeROMock }); + + const result = await service.findAll(user, userRoles, query); + + expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ + where: [ + { + isActive: true, + createdByGuid: user.idir_user_guid, + status: PiaIntakeStatusEnum.COMPLETE, + }, + { + isActive: true, + invitee: { + createdByGuid: user.idir_user_guid, + }, + status: PiaIntakeStatusEnum.COMPLETE, + }, + ], + order: { + createdAt: -1, + }, + skip: 0, + take: 12, + }); + + expect(omitBaseKeysSpy).toHaveBeenCalledTimes(1); + + const expectedResult: PaginatedRO = { + data: [getPiaIntakeROMock], + page: 1, + pageSize: 12, + total: 100, + }; + expect(result).toEqual(expectedResult); + }); }); /** diff --git a/src/frontend/src/routes/router.tsx b/src/frontend/src/routes/router.tsx index 7838ada1b..1f0085308 100644 --- a/src/frontend/src/routes/router.tsx +++ b/src/frontend/src/routes/router.tsx @@ -6,7 +6,7 @@ import { PIANextSteps } from '../components/public/PIAFormTabs/Next_Steps'; import { AppStorage } from '../utils/storage'; import LandingPage from '../pages/LandingPage/LandingPage'; -import PIAIntakeFormPage from '../pages/PIAForm'; +import PIAFormPage from '../pages/PIAForm'; import PIAIntakeResultsPage from '../pages/PIAIntakeResultsPage'; import PIAActiveList from '../pages/PIAActiveListPage'; import PIACompletedList from '../pages/PIACompletedList'; @@ -71,14 +71,14 @@ const Router = () => { } /> } /> - }> + }> } /> } /> } /> - }> + }> } /> From 134f8957eaf067b93193d24e0320b919fe7110db Mon Sep 17 00:00:00 2001 From: Brandon Bouchard Date: Wed, 26 Jul 2023 11:32:36 -0700 Subject: [PATCH 4/4] Adds MPO & CPO tests. --- .../pia-intake/pia-intake.service.spec.ts | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/src/backend/test/unit/pia-intake/pia-intake.service.spec.ts b/src/backend/test/unit/pia-intake/pia-intake.service.spec.ts index 8edcb146c..87e3f3ed7 100644 --- a/src/backend/test/unit/pia-intake/pia-intake.service.spec.ts +++ b/src/backend/test/unit/pia-intake/pia-intake.service.spec.ts @@ -1958,6 +1958,117 @@ describe('PiaIntakeService', () => { }; expect(result).toEqual(expectedResult); }); + + // Scenario 21: User is an MPO and is filtering for COMPLETE PIAs + it('succeeds when the user is an MPO and is filtering for COMPLETE PIAs', async () => { + const user: KeycloakUser = { ...keycloakUserMock }; + const userRoles = [RolesEnum.MPO_CITZ]; + const piaIntakeEntity = { ...piaIntakeEntityMock }; + const query: PiaIntakeFindQuery = { + page: 1, + pageSize: 12, + filterByStatus: PiaIntakeStatusEnum.COMPLETE, + }; + + piaIntakeRepository.findAndCount = jest.fn(async () => { + delay(10); + return [[piaIntakeEntity], 100]; + }); + + omitBaseKeysSpy.mockReturnValue({ ...getPiaIntakeROMock }); + + const result = await service.findAll(user, userRoles, query); + + expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ + where: [ + { + isActive: true, + createdByGuid: user.idir_user_guid, + status: PiaIntakeStatusEnum.COMPLETE, + }, + { + isActive: true, + status: PiaIntakeStatusEnum.COMPLETE, + ministry: In([GovMinistriesEnum.CITIZENS_SERVICES]), + }, + { + isActive: true, + invitee: { + createdByGuid: user.idir_user_guid, + }, + status: PiaIntakeStatusEnum.COMPLETE, + }, + ], + order: { + createdAt: -1, + }, + skip: 0, + take: 12, + }); + + expect(omitBaseKeysSpy).toHaveBeenCalledTimes(1); + + const expectedResult: PaginatedRO = { + data: [getPiaIntakeROMock], + page: 1, + pageSize: 12, + total: 100, + }; + expect(result).toEqual(expectedResult); + }); + + // Scenario 22: User is a CPO and is filtering for COMPLETE PIAs + it('succeeds when the user is a CPO and is filtering for COMPLETE PIAs', async () => { + const user: KeycloakUser = { ...keycloakUserMock }; + const userRoles = [RolesEnum.CPO]; + const piaIntakeEntity = { ...piaIntakeEntityMock }; + const query: PiaIntakeFindQuery = { + page: 1, + pageSize: 12, + filterByStatus: PiaIntakeStatusEnum.COMPLETE, + }; + + piaIntakeRepository.findAndCount = jest.fn(async () => { + delay(10); + return [[piaIntakeEntity], 100]; + }); + + omitBaseKeysSpy.mockReturnValue({ ...getPiaIntakeROMock }); + + const result = await service.findAll(user, userRoles, query); + + expect(piaIntakeRepository.findAndCount).toHaveBeenCalledWith({ + where: [ + { + isActive: true, + createdByGuid: user.idir_user_guid, + status: PiaIntakeStatusEnum.COMPLETE, + }, + { + isActive: true, + invitee: { + createdByGuid: user.idir_user_guid, + }, + status: PiaIntakeStatusEnum.COMPLETE, + }, + ], + order: { + createdAt: -1, + }, + skip: 0, + take: 12, + }); + + expect(omitBaseKeysSpy).toHaveBeenCalledTimes(1); + + const expectedResult: PaginatedRO = { + data: [getPiaIntakeROMock], + page: 1, + pageSize: 12, + total: 100, + }; + expect(result).toEqual(expectedResult); + }); }); /**