From be973630091f2f6aa8d0953ccd8a9f376365150b Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Tue, 11 Jun 2024 12:31:08 +0100 Subject: [PATCH 01/12] feat(EMS-3342): no pdf - application submission - xlsx - policy date format --- src/api/.keystone/config.js | 4 ++-- .../map-policy/map-intro/index.test.ts | 2 +- .../map-application-to-XLSX/map-policy/map-intro/index.ts | 2 +- .../map-policy/map-single-contract-policy/index.test.ts | 2 +- .../map-policy/map-single-contract-policy/index.ts | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/api/.keystone/config.js b/src/api/.keystone/config.js index 70fb57bb64..8fce825983 100644 --- a/src/api/.keystone/config.js +++ b/src/api/.keystone/config.js @@ -6217,7 +6217,7 @@ var mapIntro = (policy) => { const mapped = [ xlsx_row_default(SECTION_TITLES.POLICY, ""), xlsx_row_default(String(FIELDS5[POLICY_TYPE7]), policy[POLICY_TYPE7]), - xlsx_row_default(String(FIELDS5[REQUESTED_START_DATE3]), format_date_default(policy[REQUESTED_START_DATE3], "dd-MMM-yy")) + xlsx_row_default(String(FIELDS5[REQUESTED_START_DATE3]), format_date_default(policy[REQUESTED_START_DATE3], "dd MM yyyy")) ]; return mapped; }; @@ -6251,7 +6251,7 @@ var { } = insurance_default; var mapSingleContractPolicy = (policy) => { const mapped = [ - xlsx_row_default(String(FIELDS6[CONTRACT_COMPLETION_DATE3]), format_date_default(policy[CONTRACT_COMPLETION_DATE3], "dd-MMM-yy")), + xlsx_row_default(String(FIELDS6[CONTRACT_COMPLETION_DATE3]), format_date_default(policy[CONTRACT_COMPLETION_DATE3], "dd MM yyyy")), xlsx_row_default(String(CONTENT_STRINGS2[CURRENCY_CODE3].SUMMARY?.TITLE), policy[POLICY_CURRENCY_CODE]), xlsx_row_default(String(CONTENT_STRINGS2[TOTAL_CONTRACT_VALUE2].SUMMARY?.TITLE), format_currency_default2(policy[TOTAL_CONTRACT_VALUE2], GBP_CURRENCY_CODE)) ]; diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts index fa04cf5c1e..7e3ca41f3c 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts @@ -38,7 +38,7 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy/map-intro', () => const expected = [ xlsxRow(SECTION_TITLES.POLICY, ''), xlsxRow(String(FIELDS[POLICY_TYPE]), policy[POLICY_TYPE]), - xlsxRow(String(FIELDS[REQUESTED_START_DATE]), formatDate(policy[REQUESTED_START_DATE], 'dd-MMM-yy')), + xlsxRow(String(FIELDS[REQUESTED_START_DATE]), formatDate(policy[REQUESTED_START_DATE], 'dd MM yyyy')), ]; expect(result).toEqual(expected); diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.ts index 03da1480c9..3c50b70371 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.ts @@ -21,7 +21,7 @@ const mapIntro = (policy: ApplicationPolicy) => { const mapped = [ xlsxRow(SECTION_TITLES.POLICY, ''), xlsxRow(String(FIELDS[POLICY_TYPE]), policy[POLICY_TYPE]), - xlsxRow(String(FIELDS[REQUESTED_START_DATE]), formatDate(policy[REQUESTED_START_DATE], 'dd-MMM-yy')), + xlsxRow(String(FIELDS[REQUESTED_START_DATE]), formatDate(policy[REQUESTED_START_DATE], 'dd MM yyyy')), ]; return mapped; diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts index 8a37a58afb..de9931fd3f 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts @@ -51,7 +51,7 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy/map-single-contra const result = mapSingleContractPolicy(policy); const expected = [ - xlsxRow(String(FIELDS[CONTRACT_COMPLETION_DATE]), formatDate(policy[CONTRACT_COMPLETION_DATE], 'dd-MMM-yy')), + xlsxRow(String(FIELDS[CONTRACT_COMPLETION_DATE]), formatDate(policy[CONTRACT_COMPLETION_DATE], 'dd MM yyyy')), xlsxRow(String(CONTENT_STRINGS[CURRENCY_CODE].SUMMARY?.TITLE), policy[POLICY_CURRENCY_CODE]), xlsxRow(String(CONTENT_STRINGS[TOTAL_CONTRACT_VALUE].SUMMARY?.TITLE), formatCurrency(policy[TOTAL_CONTRACT_VALUE], GBP_CURRENCY_CODE)), ]; diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.ts index 544a819cc4..b6b272d499 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.ts @@ -34,7 +34,7 @@ const { */ const mapSingleContractPolicy = (policy: ApplicationPolicy) => { const mapped = [ - xlsxRow(String(FIELDS[CONTRACT_COMPLETION_DATE]), formatDate(policy[CONTRACT_COMPLETION_DATE], 'dd-MMM-yy')), + xlsxRow(String(FIELDS[CONTRACT_COMPLETION_DATE]), formatDate(policy[CONTRACT_COMPLETION_DATE], 'dd MM yyyy')), xlsxRow(String(CONTENT_STRINGS[CURRENCY_CODE].SUMMARY?.TITLE), policy[POLICY_CURRENCY_CODE]), xlsxRow(String(CONTENT_STRINGS[TOTAL_CONTRACT_VALUE].SUMMARY?.TITLE), formatCurrency(policy[TOTAL_CONTRACT_VALUE], GBP_CURRENCY_CODE)), ]; From db655969c89255eb19c8ab83932de8773e0ee589 Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Tue, 11 Jun 2024 13:11:24 +0100 Subject: [PATCH 02/12] feat(EMS-3342): no pdf - application submission - xlsx - policy type string --- e2e-tests/constants/application.js | 4 ++++ src/api/.keystone/config.js | 22 +++++++++++++++-- src/api/constants/application/index.ts | 4 ++++ .../map-policy/map-intro/index.test.ts | 3 ++- .../map-policy/map-intro/index.ts | 3 ++- .../map-intro/map-policy-type/index.test.ts | 24 +++++++++++++++++++ .../map-intro/map-policy-type/index.ts | 24 +++++++++++++++++++ src/ui/server/constants/application/index.ts | 4 ++++ 8 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/map-policy-type/index.test.ts create mode 100644 src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/map-policy-type/index.ts diff --git a/e2e-tests/constants/application.js b/e2e-tests/constants/application.js index 323ad059ed..37a9a7b529 100644 --- a/e2e-tests/constants/application.js +++ b/e2e-tests/constants/application.js @@ -6,6 +6,10 @@ export const APPLICATION = { POLICY_TYPE: { SINGLE: 'Single contract policy', MULTIPLE: 'Multiple contract policy', + ABBREVIATED: { + SINGLE: 'Single contract policy', + MULTIPLE: 'Multiple contract policy', + }, }, POLICY: { TOTAL_VALUE_OF_CONTRACT: { diff --git a/src/api/.keystone/config.js b/src/api/.keystone/config.js index 8fce825983..e275832207 100644 --- a/src/api/.keystone/config.js +++ b/src/api/.keystone/config.js @@ -666,7 +666,11 @@ var APPLICATION = { }, POLICY_TYPE: { SINGLE: "Single contract policy", - MULTIPLE: "Multiple contract policy" + MULTIPLE: "Multiple contract policy", + ABBREVIATED: { + SINGLE: "Single", + MULTIPLE: "Multiple" + } }, POLICY: { TOTAL_VALUE_OF_CONTRACT: { @@ -6207,6 +6211,20 @@ var mapKeyInformation = (application2) => { }; var map_key_information_default = mapKeyInformation; +// generate-xlsx/map-application-to-XLSX/map-policy/map-intro/map-policy-type/index.ts +var { + POLICY_TYPE: { ABBREVIATED } +} = APPLICATION; +var mapPolicyType = (policyType) => { + if (isSinglePolicyType(policyType)) { + return ABBREVIATED.SINGLE; + } + if (isMultiplePolicyType(policyType)) { + return ABBREVIATED.MULTIPLE; + } +}; +var map_policy_type_default = mapPolicyType; + // generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.ts var { FIELDS: FIELDS5, SECTION_TITLES } = XLSX; var { @@ -6216,7 +6234,7 @@ var { var mapIntro = (policy) => { const mapped = [ xlsx_row_default(SECTION_TITLES.POLICY, ""), - xlsx_row_default(String(FIELDS5[POLICY_TYPE7]), policy[POLICY_TYPE7]), + xlsx_row_default(String(FIELDS5[POLICY_TYPE7]), map_policy_type_default(policy[POLICY_TYPE7])), xlsx_row_default(String(FIELDS5[REQUESTED_START_DATE3]), format_date_default(policy[REQUESTED_START_DATE3], "dd MM yyyy")) ]; return mapped; diff --git a/src/api/constants/application/index.ts b/src/api/constants/application/index.ts index a46c530cb6..3b951352a4 100644 --- a/src/api/constants/application/index.ts +++ b/src/api/constants/application/index.ts @@ -26,6 +26,10 @@ export const APPLICATION = { POLICY_TYPE: { SINGLE: 'Single contract policy', MULTIPLE: 'Multiple contract policy', + ABBREVIATED: { + SINGLE: 'Single', + MULTIPLE: 'Multiple', + }, }, POLICY: { TOTAL_VALUE_OF_CONTRACT: { diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts index 7e3ca41f3c..648cdf26b8 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts @@ -2,6 +2,7 @@ import mapIntro from '.'; import FIELD_IDS from '../../../../constants/field-ids/insurance/policy'; import { XLSX } from '../../../../content-strings'; import xlsxRow from '../../helpers/xlsx-row'; +import mapPolicyType from './map-policy-type'; import formatDate from '../../../../helpers/format-date'; import getPopulatedApplication from '../../../../helpers/get-populated-application'; import { createFullApplication, getKeystoneContext, mapApplicationIds } from '../../../../test-helpers'; @@ -37,7 +38,7 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy/map-intro', () => const expected = [ xlsxRow(SECTION_TITLES.POLICY, ''), - xlsxRow(String(FIELDS[POLICY_TYPE]), policy[POLICY_TYPE]), + xlsxRow(String(FIELDS[POLICY_TYPE]), mapPolicyType(policy[POLICY_TYPE])), xlsxRow(String(FIELDS[REQUESTED_START_DATE]), formatDate(policy[REQUESTED_START_DATE], 'dd MM yyyy')), ]; diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.ts index 3c50b70371..d612efc40c 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.ts @@ -1,6 +1,7 @@ import FIELD_IDS from '../../../../constants/field-ids/insurance/policy'; import { XLSX } from '../../../../content-strings'; import xlsxRow from '../../helpers/xlsx-row'; +import mapPolicyType from './map-policy-type'; import formatDate from '../../../../helpers/format-date'; import { ApplicationPolicy } from '../../../../types'; @@ -20,7 +21,7 @@ const { const mapIntro = (policy: ApplicationPolicy) => { const mapped = [ xlsxRow(SECTION_TITLES.POLICY, ''), - xlsxRow(String(FIELDS[POLICY_TYPE]), policy[POLICY_TYPE]), + xlsxRow(String(FIELDS[POLICY_TYPE]), mapPolicyType(policy[POLICY_TYPE])), xlsxRow(String(FIELDS[REQUESTED_START_DATE]), formatDate(policy[REQUESTED_START_DATE], 'dd MM yyyy')), ]; diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/map-policy-type/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/map-policy-type/index.test.ts new file mode 100644 index 0000000000..d6cff36618 --- /dev/null +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/map-policy-type/index.test.ts @@ -0,0 +1,24 @@ +import mapPolicyType from '.'; +import { APPLICATION } from '../../../../../constants'; + +const { + POLICY_TYPE: { ABBREVIATED, MULTIPLE, SINGLE }, +} = APPLICATION; + +describe('api/generate-xlsx/map-application-to-xlsx/map-policy/map-intro/map-policy-type', () => { + describe(`when the policy type is ${SINGLE}`, () => { + it(`should return ${ABBREVIATED.SINGLE}`, () => { + const result = mapPolicyType(SINGLE); + + expect(result).toEqual(ABBREVIATED.SINGLE); + }); + }); + + describe(`when the policy type is ${MULTIPLE}`, () => { + it(`should return ${ABBREVIATED.MULTIPLE}`, () => { + const result = mapPolicyType(MULTIPLE); + + expect(result).toEqual(ABBREVIATED.MULTIPLE); + }); + }); +}); diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/map-policy-type/index.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/map-policy-type/index.ts new file mode 100644 index 0000000000..ea750a23ad --- /dev/null +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/map-policy-type/index.ts @@ -0,0 +1,24 @@ +import { APPLICATION } from '../../../../../constants'; +import { isSinglePolicyType, isMultiplePolicyType } from '../../../../../helpers/policy-type'; + +const { + POLICY_TYPE: { ABBREVIATED }, +} = APPLICATION; + +/** + * mapPolicyType + * Map a policy type into an abbreviated string, for XLSX generation + * @param {String} policyType: Application "Policy type" + * @returns {String} Abbreviated policy type + */ +const mapPolicyType = (policyType: string) => { + if (isSinglePolicyType(policyType)) { + return ABBREVIATED.SINGLE; + } + + if (isMultiplePolicyType(policyType)) { + return ABBREVIATED.MULTIPLE; + } +}; + +export default mapPolicyType; diff --git a/src/ui/server/constants/application/index.ts b/src/ui/server/constants/application/index.ts index 64a0803822..1469fb2d7f 100644 --- a/src/ui/server/constants/application/index.ts +++ b/src/ui/server/constants/application/index.ts @@ -18,6 +18,10 @@ export const APPLICATION = { POLICY_TYPE: { SINGLE: 'Single contract policy', MULTIPLE: 'Multiple contract policy', + ABBREVIATED: { + SINGLE: 'Single contract policy', + MULTIPLE: 'Multiple contract policy', + }, }, POLICY: { TOTAL_VALUE_OF_CONTRACT: { From 705dbfca7d3bb262f29d91ea26d2fc4e1e43ca08 Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Tue, 11 Jun 2024 14:27:15 +0100 Subject: [PATCH 03/12] feat(EMS-3342): no pdf - populated application - extract loss payee function --- src/api/.keystone/config.js | 33 +-- .../submit-application/index.test.ts | 2 +- .../mutations/submit-application/index.ts | 2 +- .../index.ts | 2 +- .../map-policy/index.test.ts | 12 +- .../map-policy/map-intro/index.test.ts | 10 +- .../index.test.ts | 2 +- .../map-single-contract-policy/index.test.ts | 10 +- .../index.api-error.test.ts | 194 ++++++++++-------- .../get-populated-application/index.test.ts | 68 +++--- .../get-populated-application/index.ts | 21 +- .../nominated-loss-payee/index.test.ts | 21 ++ .../nominated-loss-payee/index.ts | 28 +++ .../generate-submitted-application.ts | 7 +- .../test-helpers/loss-payee-financial-uk.ts | 4 +- src/api/test-helpers/nominated-loss-payee.ts | 25 +++ 16 files changed, 274 insertions(+), 167 deletions(-) create mode 100644 src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts create mode 100644 src/api/helpers/get-populated-application/nominated-loss-payee/index.ts create mode 100644 src/api/test-helpers/nominated-loss-payee.ts diff --git a/src/api/.keystone/config.js b/src/api/.keystone/config.js index e275832207..321cc2129b 100644 --- a/src/api/.keystone/config.js +++ b/src/api/.keystone/config.js @@ -4855,10 +4855,26 @@ var mapPolicy = (policy) => { }; var map_policy_default = mapPolicy; +// helpers/get-populated-application/nominated-loss-payee/index.ts +var getNominatedLossPayee = async (context, lossPayeeId) => { + try { + console.info(`Getting nominated loss payee ${lossPayeeId}`); + const nominatedLossPayee = await context.query.NominatedLossPayee.findOne({ + where: { id: lossPayeeId }, + query: "id isAppointed isLocatedInUk isLocatedInternationally name financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } }" + }); + return nominatedLossPayee; + } catch (err) { + console.error("Error getting nominated loss payee (getNominatedLossPayee helper) %O", err); + throw new Error(`Error getting nominated loss payee (getNominatedLossPayee helper) ${err}`); + } +}; +var nominated_loss_payee_default = getNominatedLossPayee; + // helpers/get-populated-application/index.ts var generateErrorMessage = (section, applicationId) => `Getting populated application - no ${section} found for application ${applicationId}`; -var getPopulatedApplication = async (context, application2) => { - console.info("Getting populated application"); +var getPopulatedApplication = async ({ context, application: application2 }) => { + console.info(`Getting populated application ${application2.referenceNumber}`); const { eligibilityId, ownerId, @@ -4908,14 +4924,7 @@ var getPopulatedApplication = async (context, application2) => { if (!policyContact) { throw new Error(generateErrorMessage("policyContact", application2.id)); } - const nominatedLossPayee = await context.query.NominatedLossPayee.findOne({ - where: { id: nominatedLossPayeeId }, - query: "id isAppointed isLocatedInUk isLocatedInternationally name financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } }" - }); - if (!nominatedLossPayee) { - console.error("%s", generateErrorMessage("nominated loss payee", application2.id)); - throw new Error(generateErrorMessage("nominated loss payee", application2.id)); - } + const nominatedLossPayee = await nominated_loss_payee_default(context, nominatedLossPayeeId); const populatedPolicy = map_policy_default(policy); const exportContract = await context.db.ExportContract.findOne({ where: { id: exportContractId } @@ -6876,7 +6885,7 @@ var submitApplication = async (root, variables, context) => { where: { id: application2.id }, data: update2 }); - const populatedApplication = await get_populated_application_default(context, updatedApplication); + const populatedApplication = await get_populated_application_default({ context, application: updatedApplication }); const xlsxPath = await generate_xlsx_default.XLSX(populatedApplication); await send_application_submitted_emails_default.send(populatedApplication, xlsxPath); return { @@ -7822,7 +7831,7 @@ var getApplicationByReferenceNumberQuery = async (root, variables, context) => { const { referenceNumber, decryptFinancialUk: decryptFinancialUk2, decryptFinancialInternational: decryptFinancialInternational2 } = variables; const application2 = await get_application_by_reference_number_default(referenceNumber, context); if (application2) { - const populatedApplication = await get_populated_application_default(context, application2); + const populatedApplication = await get_populated_application_default({ context, application: application2 }); if (decryptFinancialUk2 || decryptFinancialInternational2) { const { nominatedLossPayee } = populatedApplication; const decryptedNominatedLossPayee = decrypt_nominated_loss_payee_default(nominatedLossPayee, decryptFinancialUk2, decryptFinancialInternational2); diff --git a/src/api/custom-resolvers/mutations/submit-application/index.test.ts b/src/api/custom-resolvers/mutations/submit-application/index.test.ts index c940923388..326a57756b 100644 --- a/src/api/custom-resolvers/mutations/submit-application/index.test.ts +++ b/src/api/custom-resolvers/mutations/submit-application/index.test.ts @@ -96,7 +96,7 @@ describe('custom-resolvers/submit-application', () => { where: { id: submittedApplication.id }, }); - populatedApplication = await getPopulatedApplication(context, fullSubmittedApplication); + populatedApplication = await getPopulatedApplication({ context, application: fullSubmittedApplication }); }); test('it should call generate.XLSX', async () => { diff --git a/src/api/custom-resolvers/mutations/submit-application/index.ts b/src/api/custom-resolvers/mutations/submit-application/index.ts index 59185c4be1..22d7af6f02 100644 --- a/src/api/custom-resolvers/mutations/submit-application/index.ts +++ b/src/api/custom-resolvers/mutations/submit-application/index.ts @@ -55,7 +55,7 @@ const submitApplication = async (root: any, variables: SubmitApplicationVariable }); // get a fully populated application for XLSX generation - const populatedApplication = await getPopulatedApplication(context, updatedApplication); + const populatedApplication = await getPopulatedApplication({ context, application: updatedApplication }); // generate a XLSX for UKEF underwriting team email const xlsxPath = await generate.XLSX(populatedApplication); diff --git a/src/api/custom-resolvers/queries/get-application-by-reference-number/index.ts b/src/api/custom-resolvers/queries/get-application-by-reference-number/index.ts index 2711479d34..a3f8b7c032 100644 --- a/src/api/custom-resolvers/queries/get-application-by-reference-number/index.ts +++ b/src/api/custom-resolvers/queries/get-application-by-reference-number/index.ts @@ -35,7 +35,7 @@ const getApplicationByReferenceNumberQuery = async ( * Populate the application, * with all relationships. */ - const populatedApplication = await getPopulatedApplication(context, application); + const populatedApplication = await getPopulatedApplication({ context, application }); /** * if decrypt variables are set to true diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts index 9f3f1c1f44..67e3cb6098 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts @@ -36,22 +36,22 @@ const { describe('api/generate-xlsx/map-application-to-xlsx/map-policy', () => { let populatedApplication: Application; let populatedApplicationMultiplePolicy: Application; - let application: Application; - let applicationIds: object; + let fullApplication: Application; + let application: object; let context: Context; beforeAll(async () => { context = getKeystoneContext(); - application = await createFullApplication(context); + fullApplication = await createFullApplication(context); - applicationIds = mapApplicationIds(application); + application = mapApplicationIds(fullApplication); - populatedApplication = await getPopulatedApplication(context, applicationIds); + populatedApplication = await getPopulatedApplication({ context, application }); const multiplePolicyApplication = await createFullApplication(context, FIELD_VALUES.POLICY_TYPE.MULTIPLE); - populatedApplicationMultiplePolicy = await getPopulatedApplication(context, mapApplicationIds(multiplePolicyApplication)); + populatedApplicationMultiplePolicy = await getPopulatedApplication({ context, application: mapApplicationIds(multiplePolicyApplication) }); }); describe(`when the policy type is ${FIELD_VALUES.POLICY_TYPE.SINGLE}`, () => { diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts index 648cdf26b8..bd37f4de17 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts @@ -17,18 +17,18 @@ const { describe('api/generate-xlsx/map-application-to-xlsx/map-policy/map-intro', () => { let populatedApplication: Application; - let application: Application; - let applicationIds: object; + let fullApplication: Application; + let application: object; let context: Context; beforeAll(async () => { context = getKeystoneContext(); - application = await createFullApplication(context); + fullApplication = await createFullApplication(context); - applicationIds = mapApplicationIds(application); + application = mapApplicationIds(fullApplication); - populatedApplication = await getPopulatedApplication(context, applicationIds); + populatedApplication = await getPopulatedApplication({ context, application }); }); it('should return an array of mapped fields', () => { diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-multiple-contract-policy/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-multiple-contract-policy/index.test.ts index d5be2a3195..85f52a8780 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-multiple-contract-policy/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-multiple-contract-policy/index.test.ts @@ -38,7 +38,7 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy/map-multiple-cont const multiplePolicyApplication = await createFullApplication(context, FIELD_VALUES.POLICY_TYPE.MULTIPLE); - populatedApplicationMultiplePolicy = await getPopulatedApplication(context, mapApplicationIds(multiplePolicyApplication)); + populatedApplicationMultiplePolicy = await getPopulatedApplication({ context, application: mapApplicationIds(multiplePolicyApplication) }); }); it('should return an array of mapped fields', () => { diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts index de9931fd3f..59b0da9e0c 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts @@ -31,18 +31,18 @@ const { describe('api/generate-xlsx/map-application-to-xlsx/map-policy/map-single-contract-policy', () => { let populatedApplication: Application; - let application: Application; - let applicationIds: object; + let fullApplication: Application; + let application: object; let context: Context; beforeAll(async () => { context = getKeystoneContext(); - application = await createFullApplication(context); + fullApplication = await createFullApplication(context); - applicationIds = mapApplicationIds(application); + application = mapApplicationIds(fullApplication); - populatedApplication = await getPopulatedApplication(context, applicationIds); + populatedApplication = await getPopulatedApplication({ context, application }); }); it('should return an array of mapped fields', () => { diff --git a/src/api/helpers/get-populated-application/index.api-error.test.ts b/src/api/helpers/get-populated-application/index.api-error.test.ts index 49fc1b8ead..3cc85619a2 100644 --- a/src/api/helpers/get-populated-application/index.api-error.test.ts +++ b/src/api/helpers/get-populated-application/index.api-error.test.ts @@ -5,211 +5,237 @@ import { Application, Context } from '../../types'; describe('api/helpers/get-populated-application - error handling', () => { let context: Context; - let applicationIds: KeystoneApplication; - let application: Application; + let application: KeystoneApplication; + let fullApplication: Application; beforeAll(async () => { context = getKeystoneContext(); }); beforeEach(async () => { - application = await createFullApplication(context); - - applicationIds = { - companyId: application.company.id, - businessId: application.business.id, - brokerId: application.broker.id, - buyerId: application.buyer.id, - declarationId: application.declaration.id, - eligibilityId: application.eligibility.id, - exportContractId: application.exportContract.id, - id: application.id, - ownerId: application.owner.id, - policyId: application.policy.id, - policyContactId: application.policyContact.id, - nominatedLossPayeeId: application.nominatedLossPayee.id, - sectionReviewId: application.sectionReview.id, + fullApplication = await createFullApplication(context); + + application = { + companyId: fullApplication.company.id, + businessId: fullApplication.business.id, + brokerId: fullApplication.broker.id, + buyerId: fullApplication.buyer.id, + declarationId: fullApplication.declaration.id, + eligibilityId: fullApplication.eligibility.id, + exportContractId: fullApplication.exportContract.id, + id: fullApplication.id, + ownerId: fullApplication.owner.id, + policyId: fullApplication.policy.id, + policyContactId: fullApplication.policyContact.id, + nominatedLossPayeeId: fullApplication.nominatedLossPayee.id, + sectionReviewId: fullApplication.sectionReview.id, }; }); it('should throw an error when eligibility does not exist', async () => { - const invalidId = applicationIds.policyId; + const invalidId = application.policyId; try { - await getPopulatedApplication(context, { ...applicationIds, eligibilityId: invalidId }); + const mockApplication = { ...application, eligibilityId: invalidId }; + + await getPopulatedApplication({ context, application: mockApplication }); } catch (err) { - const expected = new Error(generateErrorMessage('eligibility', applicationIds.id)); + const expected = new Error(generateErrorMessage('eligibility', application.id)); expect(err).toEqual(expected); } }); it('should throw an error when exporter does not exist', async () => { - const invalidId = applicationIds.policyId; + const invalidId = application.policyId; try { - await getPopulatedApplication(context, { ...applicationIds, accountId: invalidId }); + const mockApplication = { ...application, accountId: invalidId }; + + await getPopulatedApplication({ context, application: mockApplication }); } catch (err) { - const expected = new Error(generateErrorMessage('exporter', applicationIds.id)); + const expected = new Error(generateErrorMessage('exporter', application.id)); expect(err).toEqual(expected); } }); it('should throw an error when buyerCountry does not exist', async () => { - const invalidId = applicationIds.policyId; + const invalidId = application.policyId; try { - await getPopulatedApplication(context, { ...applicationIds, buyerCountryId: invalidId }); - } catch (err) { - const expected = new Error(generateErrorMessage('buyerCountry', applicationIds.id)); - expect(err).toEqual(expected); - } - }); + const mockApplication = { ...application, buyerCountryId: invalidId }; - it('should throw an error when nominatedLossPayee does not exist', async () => { - const invalidId = applicationIds.nominatedLossPayeeId; - - try { - await getPopulatedApplication(context, { ...applicationIds, nominatedLossPayeeId: invalidId }); + await getPopulatedApplication({ context, application: mockApplication }); } catch (err) { - const expected = new Error(generateErrorMessage('nominatedLossPayee', applicationIds.id)); + const expected = new Error(generateErrorMessage('buyerCountry', application.id)); expect(err).toEqual(expected); } }); it('should throw an error when policy does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; + + const expected = new Error(generateErrorMessage('policy', application.id)); - const expected = new Error(generateErrorMessage('policy', applicationIds.id)); + const mockApplication = { ...application, policyId: invalidId }; - await expect(getPopulatedApplication(context, { ...applicationIds, policyId: invalidId })).rejects.toThrow(expected); + await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when policyContact does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; - const expected = new Error(generateErrorMessage('policyContact', applicationIds.id)); + const expected = new Error(generateErrorMessage('policyContact', application.id)); - await expect(getPopulatedApplication(context, { ...applicationIds, policyContactId: invalidId })).rejects.toThrow(expected); + const mockApplication = { ...application, policyContactId: invalidId }; + + await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when companyAddress does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; try { - await getPopulatedApplication(context, { ...applicationIds, companyAddressId: invalidId }); + const mockApplication = { ...application, companyAddressId: invalidId }; + + await getPopulatedApplication({ context, application: mockApplication }); } catch (err) { - const expected = new Error(generateErrorMessage('companyAddress', applicationIds.id)); + const expected = new Error(generateErrorMessage('companyAddress', application.id)); expect(err).toEqual(expected); } }); it('should throw an error when differentTradingAddress does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; + + const mockApplication = { + ...application, + company: { + ...application.company, + differentTradingAddressId: invalidId, + }, + }; try { - await getPopulatedApplication(context, { - ...applicationIds, - company: { - ...applicationIds.company, - differentTradingAddressId: invalidId, - }, - }); + await getPopulatedApplication({ context, application: mockApplication }); } catch (err) { - const expected = new Error(generateErrorMessage('differentTradingAddress', applicationIds.id)); + const expected = new Error(generateErrorMessage('differentTradingAddress', application.id)); expect(err).toEqual(expected); } }); it('should throw an error when company does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; + + const mockApplication = { ...application, companyId: invalidId }; - const expected = new Error(generateErrorMessage('company', applicationIds.id)); + const expected = new Error(generateErrorMessage('company', application.id)); - await expect(getPopulatedApplication(context, { ...applicationIds, companyId: invalidId })).rejects.toThrow(expected); + await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when companySicCode does not exist', async () => { try { - await getPopulatedApplication(context, { ...applicationIds, companyId: application.company.id }); + const mockApplication = { ...application, companyId: application.companyId }; + + await getPopulatedApplication({ context, application: mockApplication }); } catch (err) { - const expected = new Error(generateErrorMessage('companySicCode', applicationIds.id)); + const expected = new Error(generateErrorMessage('companySicCode', application.id)); expect(err).toEqual(expected); } }); it('should throw an error when business does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; - const expected = new Error(generateErrorMessage('business', applicationIds.id)); + const mockApplication = { ...application, businessId: invalidId }; - await expect(getPopulatedApplication(context, { ...applicationIds, businessId: invalidId })).rejects.toThrow(expected); + const expected = new Error(generateErrorMessage('business', application.id)); + + await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when broker does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; + + const mockApplication = { ...application, brokerId: invalidId }; - const expected = new Error(generateErrorMessage('broker', applicationIds.id)); + const expected = new Error(generateErrorMessage('broker', application.id)); - await expect(getPopulatedApplication(context, { ...applicationIds, brokerId: invalidId })).rejects.toThrow(expected); + await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when buyer does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; try { - await getPopulatedApplication(context, { ...applicationIds, buyerId: invalidId }); + const mockApplication = { ...application, buyerId: invalidId }; + + await getPopulatedApplication({ context, application: mockApplication }); } catch (err) { - const expected = new Error(generateErrorMessage('buyer', applicationIds.id)); + const expected = new Error(generateErrorMessage('buyer', application.id)); expect(err).toEqual(expected); } }); it('should throw an error when buyerRelationship does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; try { - await getPopulatedApplication(context, { ...applicationIds, buyerRelationship: invalidId }); + const mockApplication = { ...application, buyerRelationship: invalidId }; + + await getPopulatedApplication({ context, application: mockApplication }); } catch (err) { - const expected = new Error(generateErrorMessage('buyerRelationship', applicationIds.id)); + const expected = new Error(generateErrorMessage('buyerRelationship', application.id)); expect(err).toEqual(expected); } }); it('should throw an error when buyerTradingHistory does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; try { - await getPopulatedApplication(context, { ...applicationIds, buyerTradingHistory: invalidId }); + const mockApplication = { ...application, buyerTradingHistory: invalidId }; + + await getPopulatedApplication({ context, application: mockApplication }); } catch (err) { - const expected = new Error(generateErrorMessage('buyerTradingHistory', applicationIds.id)); + const expected = new Error(generateErrorMessage('buyerTradingHistory', application.id)); expect(err).toEqual(expected); } }); it('should throw an error when buyer country does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; try { - await getPopulatedApplication(context, { ...applicationIds, buyer: { countryId: invalidId } }); + const mockApplication = { + ...application, + buyer: { countryId: invalidId }, + }; + + await getPopulatedApplication({ context, application: mockApplication }); } catch (err) { - const expected = new Error(generateErrorMessage('buyer', applicationIds.id)); + const expected = new Error(generateErrorMessage('buyer', application.id)); expect(err).toEqual(expected); } }); it('should throw an error when declaration does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; - const expected = new Error(generateErrorMessage('declaration', applicationIds.id)); + const mockApplication = { ...application, declarationId: invalidId }; - await expect(getPopulatedApplication(context, { ...applicationIds, declarationId: invalidId })).rejects.toThrow(expected); + const expected = new Error(generateErrorMessage('declaration', application.id)); + + await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when sectionReview does not exist', async () => { - const invalidId = applicationIds.id; + const invalidId = application.id; + + const mockApplication = { ...application, sectionReviewId: invalidId }; - await expect(getPopulatedApplication(context, { ...applicationIds, sectionReviewId: invalidId })).rejects.toThrow( - new Error(generateErrorMessage('sectionReview', applicationIds.id)), + await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow( + new Error(generateErrorMessage('sectionReview', application.id)), ); }); }); diff --git a/src/api/helpers/get-populated-application/index.test.ts b/src/api/helpers/get-populated-application/index.test.ts index ba90feb661..55954341c7 100644 --- a/src/api/helpers/get-populated-application/index.test.ts +++ b/src/api/helpers/get-populated-application/index.test.ts @@ -3,8 +3,8 @@ import getPopulatedApplication from '.'; import { createFullApplication, getKeystoneContext } from '../../test-helpers'; import getCountryByField from '../get-country-by-field'; import mapPolicy from './map-policy'; +import getNominatedLossPayee from './nominated-loss-payee'; import mockCountries from '../../test-mocks/mock-countries'; -import mockNominatedLossPayee from '../../test-mocks/mock-nominated-loss-payee'; import { Application, Context } from '../../types'; import mockApplication, { mockLossPayeeFinancialDetailsUk, @@ -15,35 +15,36 @@ import mockApplication, { describe('api/helpers/get-populated-application', () => { let context: Context; - let applicationIds: KeystoneApplication; - let application: Application; + let application: KeystoneApplication; + let fullApplication: Application; beforeAll(async () => { context = getKeystoneContext(); }); beforeEach(async () => { - application = await createFullApplication(context); - - applicationIds = { - companyId: application.company.id, - businessId: application.business.id, - brokerId: application.broker.id, - buyerId: application.buyer.id, - declarationId: application.declaration.id, - eligibilityId: application.eligibility.id, - exportContractId: application.exportContract.id, - id: application.id, - ownerId: application.owner.id, - policyId: application.policy.id, - policyContactId: application.policyContact.id, - nominatedLossPayeeId: application.nominatedLossPayee.id, - sectionReviewId: application.sectionReview.id, + fullApplication = await createFullApplication(context); + + application = { + ...fullApplication, + companyId: fullApplication.company.id, + businessId: fullApplication.business.id, + brokerId: fullApplication.broker.id, + buyerId: fullApplication.buyer.id, + declarationId: fullApplication.declaration.id, + eligibilityId: fullApplication.eligibility.id, + exportContractId: fullApplication.exportContract.id, + id: fullApplication.id, + ownerId: fullApplication.owner.id, + policyId: fullApplication.policy.id, + policyContactId: fullApplication.policyContact.id, + nominatedLossPayeeId: fullApplication.nominatedLossPayee.id, + sectionReviewId: fullApplication.sectionReview.id, }; }); it('should return an application with associated data', async () => { - const result = await getPopulatedApplication(context, applicationIds); + const result = await getPopulatedApplication({ context, application }); expect(result.business.id).toEqual(application.business.id); expect(result.broker.id).toEqual(application.broker.id); @@ -59,7 +60,7 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with populated buyer', async () => { - const result = await getPopulatedApplication(context, applicationIds); + const result = await getPopulatedApplication({ context, application }); const [expectedCountry] = mockCountries; @@ -75,7 +76,7 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with populated company', async () => { - const result = await getPopulatedApplication(context, applicationIds); + const result = await getPopulatedApplication({ context, application }); expect(result.company.id).toEqual(application.company.id); expect(result.companySicCodes[0].companyId).toEqual(application.company.id); @@ -88,27 +89,26 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with populated nominatedLossPayee', async () => { - const result = await getPopulatedApplication(context, applicationIds); + const result = await getPopulatedApplication({ context, application }); - expect(result.nominatedLossPayee.isAppointed).toEqual(mockNominatedLossPayee.isAppointed); - expect(result.nominatedLossPayee.isLocatedInUk).toEqual(mockNominatedLossPayee.isLocatedInUk); - expect(result.nominatedLossPayee.isLocatedInternationally).toEqual(mockNominatedLossPayee.isLocatedInternationally); - expect(result.nominatedLossPayee.name).toEqual(mockNominatedLossPayee.name); + const expected = await getNominatedLossPayee(context, application.nominatedLossPayeeId); + + expect(result.nominatedLossPayee).toEqual(expected); }); it('should return an application with mapped policy data', async () => { - const result = await getPopulatedApplication(context, applicationIds); + const result = await getPopulatedApplication({ context, application }); const expected = mapPolicy({ ...application.policy, - id: applicationIds.policyId, + id: application.policyId, }); expect(result.policy).toEqual(expected); }); it('should return an application with populated financialUk', async () => { - const result = await getPopulatedApplication(context, applicationIds); + const result = await getPopulatedApplication({ context, application }); const { financialUk } = result.nominatedLossPayee; @@ -122,7 +122,7 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with populated financialInternational', async () => { - const result = await getPopulatedApplication(context, applicationIds); + const result = await getPopulatedApplication({ context, application }); const { financialInternational } = result.nominatedLossPayee; @@ -136,7 +136,7 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with populated answers and finalDestinationCountry object in exportContract', async () => { - const result = await getPopulatedApplication(context, applicationIds); + const result = await getPopulatedApplication({ context, application }); const { exportContract } = mockApplication; @@ -150,8 +150,8 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with populated sectionReview', async () => { - const result = await getPopulatedApplication(context, applicationIds); + const result = await getPopulatedApplication({ context, application }); - expect(result.sectionReview.id).toEqual(applicationIds.sectionReviewId); + expect(result.sectionReview.id).toEqual(application.sectionReviewId); }); }); diff --git a/src/api/helpers/get-populated-application/index.ts b/src/api/helpers/get-populated-application/index.ts index 78be5426d6..42fc8bb2f7 100644 --- a/src/api/helpers/get-populated-application/index.ts +++ b/src/api/helpers/get-populated-application/index.ts @@ -2,11 +2,17 @@ import { Context, Application as KeystoneApplication } from '.keystone/types'; / import getAccountById from '../get-account-by-id'; import getCountryByField from '../get-country-by-field'; import mapPolicy from './map-policy'; +import getNominatedLossPayee from './nominated-loss-payee'; import { Application, ApplicationPolicy } from '../../types'; export const generateErrorMessage = (section: string, applicationId: number) => `Getting populated application - no ${section} found for application ${applicationId}`; +interface GetPopulatedApplicationParams { + context: Context; + application: KeystoneApplication; +} + /** * getPopulatedApplication * Get data associated with an application @@ -14,8 +20,8 @@ export const generateErrorMessage = (section: string, applicationId: number) => * @param {Application} * @returns {Promise} Populated application */ -const getPopulatedApplication = async (context: Context, application: KeystoneApplication): Promise => { - console.info('Getting populated application'); +const getPopulatedApplication = async ({ context, application }: GetPopulatedApplicationParams): Promise => { + console.info(`Getting populated application ${application.referenceNumber}`); const { eligibilityId, @@ -80,16 +86,7 @@ const getPopulatedApplication = async (context: Context, application: KeystoneAp throw new Error(generateErrorMessage('policyContact', application.id)); } - const nominatedLossPayee = await context.query.NominatedLossPayee.findOne({ - where: { id: nominatedLossPayeeId }, - query: - 'id isAppointed isLocatedInUk isLocatedInternationally name financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } }', - }); - - if (!nominatedLossPayee) { - console.error('%s', generateErrorMessage('nominated loss payee', application.id)); - throw new Error(generateErrorMessage('nominated loss payee', application.id)); - } + const nominatedLossPayee = await getNominatedLossPayee(context, nominatedLossPayeeId); const populatedPolicy = mapPolicy(policy); diff --git a/src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts b/src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts new file mode 100644 index 0000000000..9b703e6df9 --- /dev/null +++ b/src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts @@ -0,0 +1,21 @@ +import getNominatedLossPayee from '.'; +import { getKeystoneContext } from '../../../test-helpers'; +import createNominatedLossPayee from '../../../test-helpers/nominated-loss-payee'; +import { ApplicationNominatedLossPayee, Context } from '../../../types'; + +describe('api/helpers/get-populated-application/nominated-loss-payee', () => { + let context: Context; + let lossPayee: ApplicationNominatedLossPayee; + + beforeAll(async () => { + context = getKeystoneContext(); + + lossPayee = (await createNominatedLossPayee({ context })) as ApplicationNominatedLossPayee; + }); + + it('should return a nominated loss payee', async () => { + const result = await getNominatedLossPayee(context, lossPayee.id); + + expect(result).toEqual(lossPayee); + }); +}); diff --git a/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts b/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts new file mode 100644 index 0000000000..a28f9a44da --- /dev/null +++ b/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts @@ -0,0 +1,28 @@ +import { Context } from '.keystone/types'; // eslint-disable-line + +/** + * getNominatedLossPayee + * Get an application's nominated loss payee by ID + * @param {Context} KeystoneJS context API + * @param {String} lossPayeeId: Loss payee ID + * @returns {ApplicationPolicy} mapped policy + */ +const getNominatedLossPayee = async (context: Context, lossPayeeId: string) => { + try { + console.info(`Getting nominated loss payee ${lossPayeeId}`); + + const nominatedLossPayee = await context.query.NominatedLossPayee.findOne({ + where: { id: lossPayeeId }, + query: + 'id isAppointed isLocatedInUk isLocatedInternationally name financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } }', + }); + + return nominatedLossPayee; + } catch (err) { + console.error('Error getting nominated loss payee (getNominatedLossPayee helper) %O', err); + + throw new Error(`Error getting nominated loss payee (getNominatedLossPayee helper) ${err}`); + } +}; + +export default getNominatedLossPayee; diff --git a/src/api/test-helpers/generate-submitted-application.ts b/src/api/test-helpers/generate-submitted-application.ts index 02da8819b1..99c9681621 100644 --- a/src/api/test-helpers/generate-submitted-application.ts +++ b/src/api/test-helpers/generate-submitted-application.ts @@ -12,10 +12,11 @@ import mapApplicationIds from './map-application-ids'; */ export const generateSubmittedApplication = async () => { const context = getKeystoneContext(); - const application = await createFullApplication(context); + const fullApplication = await createFullApplication(context); - const applicationIds = mapApplicationIds(application); - const populatedApplication = await getPopulatedApplication(context, applicationIds); + const application = mapApplicationIds(fullApplication); + + const populatedApplication = await getPopulatedApplication({ context, application }); const submittedApplication = { ...populatedApplication, diff --git a/src/api/test-helpers/loss-payee-financial-uk.ts b/src/api/test-helpers/loss-payee-financial-uk.ts index 0da2752df4..90d13f02e1 100644 --- a/src/api/test-helpers/loss-payee-financial-uk.ts +++ b/src/api/test-helpers/loss-payee-financial-uk.ts @@ -8,7 +8,7 @@ import { ApplicationLossPayeeFinancialUk, TestHelperCreate } from '../types'; */ const createLossPayeeFinancialDetailsUk = async ({ context }: TestHelperCreate) => { try { - console.info('Creating a loss payee financial Uk (test helpers)'); + console.info('Creating a loss payee financial uk (test helpers)'); const lossPayeeFinancialDetailsUk = (await context.query.LossPayeeFinancialUk.createOne({ data: {}, query: 'id', @@ -16,7 +16,7 @@ const createLossPayeeFinancialDetailsUk = async ({ context }: TestHelperCreate) return lossPayeeFinancialDetailsUk; } catch (err) { - console.error('Error creating a loss payee financial uk %O', err); + console.error('Error creating a loss payee financial uk (test helpers) %O', err); return err; } }; diff --git a/src/api/test-helpers/nominated-loss-payee.ts b/src/api/test-helpers/nominated-loss-payee.ts new file mode 100644 index 0000000000..dade548095 --- /dev/null +++ b/src/api/test-helpers/nominated-loss-payee.ts @@ -0,0 +1,25 @@ +import { ApplicationNominatedLossPayee, TestHelperCreate } from '../types'; + +/** + * create a nominated loss payee financial uk helper + * Creates a blank ApplicationLossPayeeFinancialUk. + * @param {Context} KeystoneJS context API + * @returns {Object} Created ApplicationNominatedLossPayee + */ +const createNominatedLossPayee = async ({ context }: TestHelperCreate) => { + try { + console.info('Creating a nominated loss payee (test helpers)'); + + const lossPayee = (await context.query.NominatedLossPayee.createOne({ + data: {}, + query: 'id financialInternational { id } financialUk { id } isAppointed isLocatedInUk isLocatedInternationally name', + })) as ApplicationNominatedLossPayee; + + return lossPayee; + } catch (err) { + console.error('Error creating a nominated loss payee (test helpers) %O', err); + return err; + } +}; + +export default createNominatedLossPayee; From b622f69c1ba93f9593c4305b16c06d0a37a99823 Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Tue, 11 Jun 2024 15:35:55 +0100 Subject: [PATCH 04/12] feat(EMS-3342): no pdf - application submission - loss payee - financial data --- src/api/.keystone/config.js | 333 ++++++++++-------- .../submit-application/index.test.ts | 7 +- .../mutations/submit-application/index.ts | 11 +- .../index.ts | 7 +- .../create-a-loss-payee-financial-uk/index.ts | 7 +- .../get-populated-application/index.test.ts | 34 +- .../get-populated-application/index.ts | 18 +- .../nominated-loss-payee/index.test.ts | 24 ++ .../nominated-loss-payee/index.ts | 17 +- .../loss-payee-financial-international.ts | 14 +- .../test-helpers/loss-payee-financial-uk.ts | 14 +- src/api/test-helpers/nominated-loss-payee.ts | 31 +- src/api/types/test-helpers/index.ts | 4 +- 13 files changed, 344 insertions(+), 177 deletions(-) diff --git a/src/api/.keystone/config.js b/src/api/.keystone/config.js index 321cc2129b..2e1ac62409 100644 --- a/src/api/.keystone/config.js +++ b/src/api/.keystone/config.js @@ -4358,14 +4358,17 @@ var createALossPayeeFinancialInternational = async (context, lossPayeeId) => { } } }); - await context.db.LossPayeeFinancialInternationalVector.createOne({ + const vector = await context.db.LossPayeeFinancialInternationalVector.createOne({ data: { financialInternational: { connect: { id: lossPayeeFinancialInternational.id } } } }); - return lossPayeeFinancialInternational; + return { + ...lossPayeeFinancialInternational, + vector + }; } catch (err) { console.error("Error creating a loss payee financial (international) for %O", err); throw new Error(`Creating a loss payee financial (international) for ${err}`); @@ -4384,14 +4387,17 @@ var createALossPayeeFinancialUk = async (context, lossPayeeId) => { } } }); - await context.db.LossPayeeFinancialUkVector.createOne({ + const vector = await context.db.LossPayeeFinancialUkVector.createOne({ data: { financialUk: { connect: { id: lossPayeeFinancialUk.id } } } }); - return lossPayeeFinancialUk; + return { + ...lossPayeeFinancialUk, + vector + }; } catch (err) { console.error("Error creating a loss payee financial (UK) for %O", err); throw new Error(`Creating a loss payee financial (UK) for ${err}`); @@ -4855,14 +4861,155 @@ var mapPolicy = (policy) => { }; var map_policy_default = mapPolicy; +// helpers/encrypt/generate-key/index.ts +var import_crypto9 = __toESM(require("crypto")); +var { ALGORITHM: ALGORITHM2, SIGNATURE: SIGNATURE2, SUBSTRING_INDEX_START, SUBSTRING_INDEX_END } = FINANCIAL_DETAILS.ENCRYPTION.KEY; +var generateKey = () => import_crypto9.default.createHash(ALGORITHM2).update(SIGNATURE2).digest("hex").substring(SUBSTRING_INDEX_START, SUBSTRING_INDEX_END); +var generate_key_default = generateKey; + +// helpers/decrypt/generate-decipher/index.ts +var import_crypto10 = __toESM(require("crypto")); +var { ENCRYPTION_METHOD } = FINANCIAL_DETAILS.ENCRYPTION.CIPHER; +var generateDecipher = (key2, iv) => { + try { + return import_crypto10.default.createDecipheriv(ENCRYPTION_METHOD, key2, iv); + } catch (err) { + console.error("Error generating decipher %O", err); + throw new Error(`Error generating decipher ${err}`); + } +}; +var generate_decipher_default = generateDecipher; + +// helpers/decrypt/generate-buffer/index.ts +var { STRING_ENCODING: STRING_ENCODING2, OUTPUT_ENCODING } = FINANCIAL_DETAILS.ENCRYPTION.CIPHER; +var generateBufferInStringFormat = (value) => { + try { + return Buffer.from(value, STRING_ENCODING2).toString(OUTPUT_ENCODING); + } catch (err) { + console.error("Error generating buffer %O", err); + throw new Error(`Error generating buffer ${err}`); + } +}; +var generate_buffer_default = generateBufferInStringFormat; + +// helpers/decrypt/index.ts +var { ENCODING: ENCODING2, OUTPUT_ENCODING: OUTPUT_ENCODING2 } = FINANCIAL_DETAILS.ENCRYPTION.CIPHER; +var key = generate_key_default(); +var decryptData = (dataToDecrypt) => { + try { + console.info("Decrypting data"); + const { value, iv } = dataToDecrypt; + const buffer = generate_buffer_default(value); + const decipher = generate_decipher_default(key, iv); + const decipherUpdate = decipher.update(buffer, ENCODING2, OUTPUT_ENCODING2); + const decipherFinal = decipher.final(OUTPUT_ENCODING2); + return decipherUpdate.concat(decipherFinal); + } catch (err) { + console.error("Error decrypting data %O", err); + throw new Error(`Error decrypting data ${err}`); + } +}; +var decrypt = { + decrypt: decryptData +}; +var decrypt_default = decrypt; + +// helpers/decrypt-financial-uk/index.ts +var decryptFinancialUk = (applicationFinancialUk) => { + try { + console.info("Decrypting financial uk"); + const mapped = applicationFinancialUk; + const { + accountNumber, + sortCode, + vector: { accountNumberVector, sortCodeVector } + } = applicationFinancialUk; + let decryptedAccountNumber = ""; + let decryptedSortCode = ""; + if (accountNumber && accountNumberVector) { + decryptedAccountNumber = decrypt_default.decrypt({ value: accountNumber, iv: accountNumberVector }); + } + if (sortCode && sortCodeVector) { + decryptedSortCode = decrypt_default.decrypt({ value: sortCode, iv: sortCodeVector }); + } + mapped.accountNumber = decryptedAccountNumber; + mapped.sortCode = decryptedSortCode; + return mapped; + } catch (err) { + console.error("Error decrypting financial uk %O", err); + throw new Error(`Error decrypting financial uk ${err}`); + } +}; +var decrypt_financial_uk_default = decryptFinancialUk; + +// helpers/decrypt-financial-international/index.ts +var decryptFinancialInternational = (applicationFinancialInternational) => { + try { + console.info("Decrypting financial international"); + const mapped = applicationFinancialInternational; + const { + bicSwiftCode, + iban, + vector: { bicSwiftCodeVector, ibanVector } + } = applicationFinancialInternational; + let decryptedIban = ""; + let decryptedBicSwiftCode = ""; + if (bicSwiftCode && bicSwiftCodeVector) { + decryptedBicSwiftCode = decrypt_default.decrypt({ value: bicSwiftCode, iv: bicSwiftCodeVector }); + } + if (iban && ibanVector) { + decryptedIban = decrypt_default.decrypt({ value: iban, iv: ibanVector }); + } + mapped.bicSwiftCode = decryptedBicSwiftCode; + mapped.iban = decryptedIban; + return mapped; + } catch (err) { + console.error("Error decrypting international uk %O", err); + throw new Error(`Error decrypting international uk ${err}`); + } +}; +var decrypt_financial_international_default = decryptFinancialInternational; + +// helpers/decrypt-nominated-loss-payee/index.ts +var decryptNominatedLossPayee = (nominatedLossPayee, decryptFinancialUk2, decryptFinancialInternational2) => { + try { + console.info("Decrypting nominated loss payee %s", nominatedLossPayee.id); + const mapped = { + ...nominatedLossPayee, + financialUk: {}, + financialInternational: {} + }; + const { financialUk, financialInternational } = nominatedLossPayee; + if (decryptFinancialUk2) { + console.info("Decrypting nominated loss payee - financial - UK data %s", nominatedLossPayee.id); + const mappedFinancialUk = decrypt_financial_uk_default(financialUk); + mapped.financialUk = mappedFinancialUk; + } + if (decryptFinancialInternational2) { + console.info("Decrypting nominated loss payee - financial - international data %s", nominatedLossPayee.id); + const mappedFinancialInternational = decrypt_financial_international_default(financialInternational); + mapped.financialInternational = mappedFinancialInternational; + } + return mapped; + } catch (err) { + console.error("Error decrypting nominated loss payee %O", err); + throw new Error(`Error decrypting nominated loss payee ${err}`); + } +}; +var decrypt_nominated_loss_payee_default = decryptNominatedLossPayee; + // helpers/get-populated-application/nominated-loss-payee/index.ts -var getNominatedLossPayee = async (context, lossPayeeId) => { +var getNominatedLossPayee = async (context, lossPayeeId, decryptFinancialUk2, decryptFinancialInternational2) => { try { console.info(`Getting nominated loss payee ${lossPayeeId}`); const nominatedLossPayee = await context.query.NominatedLossPayee.findOne({ where: { id: lossPayeeId }, query: "id isAppointed isLocatedInUk isLocatedInternationally name financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } }" }); + if (decryptFinancialUk2 && decryptFinancialInternational2) { + const decryptedNominatedLossPayee = decrypt_nominated_loss_payee_default(nominatedLossPayee, decryptFinancialUk2, decryptFinancialInternational2); + return decryptedNominatedLossPayee; + } return nominatedLossPayee; } catch (err) { console.error("Error getting nominated loss payee (getNominatedLossPayee helper) %O", err); @@ -4873,8 +5020,13 @@ var nominated_loss_payee_default = getNominatedLossPayee; // helpers/get-populated-application/index.ts var generateErrorMessage = (section, applicationId) => `Getting populated application - no ${section} found for application ${applicationId}`; -var getPopulatedApplication = async ({ context, application: application2 }) => { - console.info(`Getting populated application ${application2.referenceNumber}`); +var getPopulatedApplication = async ({ + context, + application: application2, + decryptFinancialUk: decryptFinancialUk2 = false, + decryptFinancialInternational: decryptFinancialInternational2 = false +}) => { + console.info(`Getting populated application (helper) ${application2.id}`); const { eligibilityId, ownerId, @@ -4924,7 +5076,12 @@ var getPopulatedApplication = async ({ context, application: application2 }) => if (!policyContact) { throw new Error(generateErrorMessage("policyContact", application2.id)); } - const nominatedLossPayee = await nominated_loss_payee_default(context, nominatedLossPayeeId); + const nominatedLossPayee = await nominated_loss_payee_default( + context, + nominatedLossPayeeId, + decryptFinancialUk2, + decryptFinancialInternational2 + ); const populatedPolicy = map_policy_default(policy); const exportContract = await context.db.ExportContract.findOne({ where: { id: exportContractId } @@ -6875,6 +7032,7 @@ var submitApplication = async (root, variables, context) => { const isFirstSubmission = submissionCount === 0; const canSubmit = isInProgress && validSubmissionDate && isFirstSubmission; if (canSubmit) { + console.info("Submitting application - updating status, submission date and count %s", variables.applicationId); const update2 = { status: APPLICATION.STATUS.SUBMITTED, previousStatus: APPLICATION.STATUS.IN_PROGRESS, @@ -6885,7 +7043,13 @@ var submitApplication = async (root, variables, context) => { where: { id: application2.id }, data: update2 }); - const populatedApplication = await get_populated_application_default({ context, application: updatedApplication }); + console.info("Submitting application - getting populated application %s", variables.applicationId); + const populatedApplication = await get_populated_application_default({ + context, + application: updatedApplication, + decryptFinancialUk: true, + decryptFinancialInternational: true + }); const xlsxPath = await generate_xlsx_default.XLSX(populatedApplication); await send_application_submitted_emails_default.send(populatedApplication, xlsxPath); return { @@ -6983,29 +7147,23 @@ var verifyAccountReactivationToken = async (root, variables, context) => { var verify_account_reactivation_token_default = verifyAccountReactivationToken; // helpers/encrypt/index.ts -var import_crypto11 = __toESM(require("crypto")); - -// helpers/encrypt/generate-key/index.ts -var import_crypto9 = __toESM(require("crypto")); -var { ALGORITHM: ALGORITHM2, SIGNATURE: SIGNATURE2, SUBSTRING_INDEX_START, SUBSTRING_INDEX_END } = FINANCIAL_DETAILS.ENCRYPTION.KEY; -var generateKey = () => import_crypto9.default.createHash(ALGORITHM2).update(SIGNATURE2).digest("hex").substring(SUBSTRING_INDEX_START, SUBSTRING_INDEX_END); -var generate_key_default = generateKey; +var import_crypto12 = __toESM(require("crypto")); // helpers/encrypt/generate-initialisation-vector/index.ts -var import_crypto10 = __toESM(require("crypto")); -var { BYTES_SIZE, ENCODING: ENCODING2, SLICE_INDEX_START, SLICE_INDEX_END } = FINANCIAL_DETAILS.ENCRYPTION.IV; -var generateInitialisationVector = () => import_crypto10.default.randomBytes(BYTES_SIZE).toString(ENCODING2).slice(SLICE_INDEX_START, SLICE_INDEX_END); +var import_crypto11 = __toESM(require("crypto")); +var { BYTES_SIZE, ENCODING: ENCODING3, SLICE_INDEX_START, SLICE_INDEX_END } = FINANCIAL_DETAILS.ENCRYPTION.IV; +var generateInitialisationVector = () => import_crypto11.default.randomBytes(BYTES_SIZE).toString(ENCODING3).slice(SLICE_INDEX_START, SLICE_INDEX_END); var generate_initialisation_vector_default = generateInitialisationVector; // helpers/encrypt/index.ts -var { ENCRYPTION_METHOD, ENCODING: ENCODING3, STRING_ENCODING: STRING_ENCODING2, OUTPUT_ENCODING } = FINANCIAL_DETAILS.ENCRYPTION.CIPHER; +var { ENCRYPTION_METHOD: ENCRYPTION_METHOD2, ENCODING: ENCODING4, STRING_ENCODING: STRING_ENCODING3, OUTPUT_ENCODING: OUTPUT_ENCODING3 } = FINANCIAL_DETAILS.ENCRYPTION.CIPHER; var encrypt = (dataToEncrypt) => { try { console.info("Encrypting data"); const key2 = generate_key_default(); const iv = generate_initialisation_vector_default(); - const cipher = import_crypto11.default.createCipheriv(ENCRYPTION_METHOD, key2, iv); - const value = Buffer.from(cipher.update(dataToEncrypt, OUTPUT_ENCODING, ENCODING3).concat(cipher.final(ENCODING3))).toString(STRING_ENCODING2); + const cipher = import_crypto12.default.createCipheriv(ENCRYPTION_METHOD2, key2, iv); + const value = Buffer.from(cipher.update(dataToEncrypt, OUTPUT_ENCODING3, ENCODING4).concat(cipher.final(ENCODING4))).toString(STRING_ENCODING3); return { value, iv @@ -7693,137 +7851,6 @@ var getCompaniesHouseInformation = async (root, variables) => { }; var get_companies_house_information_default = getCompaniesHouseInformation; -// helpers/decrypt/generate-decipher/index.ts -var import_crypto12 = __toESM(require("crypto")); -var { ENCRYPTION_METHOD: ENCRYPTION_METHOD2 } = FINANCIAL_DETAILS.ENCRYPTION.CIPHER; -var generateDecipher = (key2, iv) => { - try { - return import_crypto12.default.createDecipheriv(ENCRYPTION_METHOD2, key2, iv); - } catch (err) { - console.error("Error generating decipher %O", err); - throw new Error(`Error generating decipher ${err}`); - } -}; -var generate_decipher_default = generateDecipher; - -// helpers/decrypt/generate-buffer/index.ts -var { STRING_ENCODING: STRING_ENCODING3, OUTPUT_ENCODING: OUTPUT_ENCODING2 } = FINANCIAL_DETAILS.ENCRYPTION.CIPHER; -var generateBufferInStringFormat = (value) => { - try { - return Buffer.from(value, STRING_ENCODING3).toString(OUTPUT_ENCODING2); - } catch (err) { - console.error("Error generating buffer %O", err); - throw new Error(`Error generating buffer ${err}`); - } -}; -var generate_buffer_default = generateBufferInStringFormat; - -// helpers/decrypt/index.ts -var { ENCODING: ENCODING4, OUTPUT_ENCODING: OUTPUT_ENCODING3 } = FINANCIAL_DETAILS.ENCRYPTION.CIPHER; -var key = generate_key_default(); -var decryptData = (dataToDecrypt) => { - try { - console.info("Decrypting data"); - const { value, iv } = dataToDecrypt; - const buffer = generate_buffer_default(value); - const decipher = generate_decipher_default(key, iv); - const decipherUpdate = decipher.update(buffer, ENCODING4, OUTPUT_ENCODING3); - const decipherFinal = decipher.final(OUTPUT_ENCODING3); - return decipherUpdate.concat(decipherFinal); - } catch (err) { - console.error("Error decrypting data %O", err); - throw new Error(`Error decrypting data ${err}`); - } -}; -var decrypt = { - decrypt: decryptData -}; -var decrypt_default = decrypt; - -// helpers/decrypt-financial-uk/index.ts -var decryptFinancialUk = (applicationFinancialUk) => { - try { - console.info("Decrypting financial uk"); - const mapped = applicationFinancialUk; - const { - accountNumber, - sortCode, - vector: { accountNumberVector, sortCodeVector } - } = applicationFinancialUk; - let decryptedAccountNumber = ""; - let decryptedSortCode = ""; - if (accountNumber && accountNumberVector) { - decryptedAccountNumber = decrypt_default.decrypt({ value: accountNumber, iv: accountNumberVector }); - } - if (sortCode && sortCodeVector) { - decryptedSortCode = decrypt_default.decrypt({ value: sortCode, iv: sortCodeVector }); - } - mapped.accountNumber = decryptedAccountNumber; - mapped.sortCode = decryptedSortCode; - return mapped; - } catch (err) { - console.error("Error decrypting financial uk %O", err); - throw new Error(`Error decrypting financial uk ${err}`); - } -}; -var decrypt_financial_uk_default = decryptFinancialUk; - -// helpers/decrypt-financial-international/index.ts -var decryptFinancialInternational = (applicationFinancialInternational) => { - try { - console.info("Decrypting financial international"); - const mapped = applicationFinancialInternational; - const { - bicSwiftCode, - iban, - vector: { bicSwiftCodeVector, ibanVector } - } = applicationFinancialInternational; - let decryptedIban = ""; - let decryptedBicSwiftCode = ""; - if (bicSwiftCode && bicSwiftCodeVector) { - decryptedBicSwiftCode = decrypt_default.decrypt({ value: bicSwiftCode, iv: bicSwiftCodeVector }); - } - if (iban && ibanVector) { - decryptedIban = decrypt_default.decrypt({ value: iban, iv: ibanVector }); - } - mapped.bicSwiftCode = decryptedBicSwiftCode; - mapped.iban = decryptedIban; - return mapped; - } catch (err) { - console.error("Error decrypting international uk %O", err); - throw new Error(`Error decrypting international uk ${err}`); - } -}; -var decrypt_financial_international_default = decryptFinancialInternational; - -// helpers/decrypt-nominated-loss-payee/index.ts -var decryptNominatedLossPayee = (nominatedLossPayee, decryptFinancialUk2, decryptFinancialInternational2) => { - try { - console.info("Decrypting nominated loss payee %s", nominatedLossPayee.id); - const mapped = { - ...nominatedLossPayee, - financialUk: {}, - financialInternational: {} - }; - const { financialUk, financialInternational } = nominatedLossPayee; - if (decryptFinancialUk2) { - console.info("Decrypting nominated loss payee - financial - UK data %s", nominatedLossPayee.id); - const mappedFinancialUk = decrypt_financial_uk_default(financialUk); - mapped.financialUk = mappedFinancialUk; - } - if (decryptFinancialInternational2) { - console.info("Decrypting nominated loss payee - financial - international data %s", nominatedLossPayee.id); - const mappedFinancialInternational = decrypt_financial_international_default(financialInternational); - mapped.financialInternational = mappedFinancialInternational; - } - return mapped; - } catch (err) { - console.error("Error decrypting nominated loss payee %O", err); - throw new Error(`Error decrypting nominated loss payee ${err}`); - } -}; -var decrypt_nominated_loss_payee_default = decryptNominatedLossPayee; - // custom-resolvers/queries/get-application-by-reference-number/index.ts var getApplicationByReferenceNumberQuery = async (root, variables, context) => { try { diff --git a/src/api/custom-resolvers/mutations/submit-application/index.test.ts b/src/api/custom-resolvers/mutations/submit-application/index.test.ts index 326a57756b..c46518ee70 100644 --- a/src/api/custom-resolvers/mutations/submit-application/index.test.ts +++ b/src/api/custom-resolvers/mutations/submit-application/index.test.ts @@ -96,7 +96,12 @@ describe('custom-resolvers/submit-application', () => { where: { id: submittedApplication.id }, }); - populatedApplication = await getPopulatedApplication({ context, application: fullSubmittedApplication }); + populatedApplication = await getPopulatedApplication({ + context, + application: fullSubmittedApplication, + decryptFinancialUk: true, + decryptFinancialInternational: true, + }); }); test('it should call generate.XLSX', async () => { diff --git a/src/api/custom-resolvers/mutations/submit-application/index.ts b/src/api/custom-resolvers/mutations/submit-application/index.ts index 22d7af6f02..806ea83bd1 100644 --- a/src/api/custom-resolvers/mutations/submit-application/index.ts +++ b/src/api/custom-resolvers/mutations/submit-application/index.ts @@ -41,6 +41,8 @@ const submitApplication = async (root: any, variables: SubmitApplicationVariable const canSubmit = isInProgress && validSubmissionDate && isFirstSubmission; if (canSubmit) { + console.info('Submitting application - updating status, submission date and count %s', variables.applicationId); + // change the status and add submission date const update = { status: APPLICATION.STATUS.SUBMITTED, @@ -54,8 +56,15 @@ const submitApplication = async (root: any, variables: SubmitApplicationVariable data: update, }); + console.info('Submitting application - getting populated application %s', variables.applicationId); + // get a fully populated application for XLSX generation - const populatedApplication = await getPopulatedApplication({ context, application: updatedApplication }); + const populatedApplication = await getPopulatedApplication({ + context, + application: updatedApplication, + decryptFinancialUk: true, + decryptFinancialInternational: true, + }); // generate a XLSX for UKEF underwriting team email const xlsxPath = await generate.XLSX(populatedApplication); diff --git a/src/api/helpers/create-a-loss-payee-financial-international/index.ts b/src/api/helpers/create-a-loss-payee-financial-international/index.ts index 3fe86c1c7a..dbea78333f 100644 --- a/src/api/helpers/create-a-loss-payee-financial-international/index.ts +++ b/src/api/helpers/create-a-loss-payee-financial-international/index.ts @@ -19,7 +19,7 @@ const createALossPayeeFinancialInternational = async (context: Context, lossPaye }, }); - await context.db.LossPayeeFinancialInternationalVector.createOne({ + const vector = await context.db.LossPayeeFinancialInternationalVector.createOne({ data: { financialInternational: { connect: { id: lossPayeeFinancialInternational.id }, @@ -27,7 +27,10 @@ const createALossPayeeFinancialInternational = async (context: Context, lossPaye }, }); - return lossPayeeFinancialInternational; + return { + ...lossPayeeFinancialInternational, + vector, + }; } catch (err) { console.error('Error creating a loss payee financial (international) for %O', err); diff --git a/src/api/helpers/create-a-loss-payee-financial-uk/index.ts b/src/api/helpers/create-a-loss-payee-financial-uk/index.ts index 8147265656..066663c2d6 100644 --- a/src/api/helpers/create-a-loss-payee-financial-uk/index.ts +++ b/src/api/helpers/create-a-loss-payee-financial-uk/index.ts @@ -19,7 +19,7 @@ const createALossPayeeFinancialUk = async (context: Context, lossPayeeId: string }, }); - await context.db.LossPayeeFinancialUkVector.createOne({ + const vector = await context.db.LossPayeeFinancialUkVector.createOne({ data: { financialUk: { connect: { id: lossPayeeFinancialUk.id }, @@ -27,7 +27,10 @@ const createALossPayeeFinancialUk = async (context: Context, lossPayeeId: string }, }); - return lossPayeeFinancialUk; + return { + ...lossPayeeFinancialUk, + vector, + }; } catch (err) { console.error('Error creating a loss payee financial (UK) for %O', err); diff --git a/src/api/helpers/get-populated-application/index.test.ts b/src/api/helpers/get-populated-application/index.test.ts index 55954341c7..3eba7c7178 100644 --- a/src/api/helpers/get-populated-application/index.test.ts +++ b/src/api/helpers/get-populated-application/index.test.ts @@ -88,12 +88,38 @@ describe('api/helpers/get-populated-application', () => { expect(result.company.differentTradingAddress.fullAddress).toEqual(''); }); - it('should return an application with populated nominatedLossPayee', async () => { - const result = await getPopulatedApplication({ context, application }); + describe('nominatedLossPayee', () => { + it('should return an application with populated nominatedLossPayee without decrypted data by default', async () => { + const result = await getPopulatedApplication({ context, application }); + + const decryptFinancialUk = false; + const decryptFinancialInternational = false; + + const expected = await getNominatedLossPayee( + context, + application.nominatedLossPayeeId, + decryptFinancialUk, + decryptFinancialInternational, + ); + + expect(result.nominatedLossPayee).toEqual(expected); + }); + + it('should return an application with populated nominatedLossPayee with decrypted data when `decrypt` params are passed', async () => { + const result = await getPopulatedApplication({ context, application }); - const expected = await getNominatedLossPayee(context, application.nominatedLossPayeeId); + const decryptFinancialUk = true; + const decryptFinancialInternational = true; - expect(result.nominatedLossPayee).toEqual(expected); + const expected = await getNominatedLossPayee( + context, + application.nominatedLossPayeeId, + decryptFinancialUk, + decryptFinancialInternational, + ); + + expect(result.nominatedLossPayee).toEqual(expected); + }); }); it('should return an application with mapped policy data', async () => { diff --git a/src/api/helpers/get-populated-application/index.ts b/src/api/helpers/get-populated-application/index.ts index 42fc8bb2f7..e3b94ce9a5 100644 --- a/src/api/helpers/get-populated-application/index.ts +++ b/src/api/helpers/get-populated-application/index.ts @@ -11,6 +11,8 @@ export const generateErrorMessage = (section: string, applicationId: number) => interface GetPopulatedApplicationParams { context: Context; application: KeystoneApplication; + decryptFinancialUk?: boolean; + decryptFinancialInternational?: boolean; } /** @@ -20,8 +22,13 @@ interface GetPopulatedApplicationParams { * @param {Application} * @returns {Promise} Populated application */ -const getPopulatedApplication = async ({ context, application }: GetPopulatedApplicationParams): Promise => { - console.info(`Getting populated application ${application.referenceNumber}`); +const getPopulatedApplication = async ({ + context, + application, + decryptFinancialUk = false, + decryptFinancialInternational = false, +}: GetPopulatedApplicationParams): Promise => { + console.info(`Getting populated application (helper) ${application.id}`); const { eligibilityId, @@ -86,7 +93,12 @@ const getPopulatedApplication = async ({ context, application }: GetPopulatedApp throw new Error(generateErrorMessage('policyContact', application.id)); } - const nominatedLossPayee = await getNominatedLossPayee(context, nominatedLossPayeeId); + const nominatedLossPayee = await getNominatedLossPayee( + context, + nominatedLossPayeeId, + decryptFinancialUk, + decryptFinancialInternational, + ); const populatedPolicy = mapPolicy(policy); diff --git a/src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts b/src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts index 9b703e6df9..ee9729f9cd 100644 --- a/src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts +++ b/src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts @@ -1,4 +1,5 @@ import getNominatedLossPayee from '.'; +import decryptNominatedLossPayee from '../../decrypt-nominated-loss-payee'; import { getKeystoneContext } from '../../../test-helpers'; import createNominatedLossPayee from '../../../test-helpers/nominated-loss-payee'; import { ApplicationNominatedLossPayee, Context } from '../../../types'; @@ -18,4 +19,27 @@ describe('api/helpers/get-populated-application/nominated-loss-payee', () => { expect(result).toEqual(lossPayee); }); + + describe('when decryptFinancialUk and decryptFinancialInternational are provided', () => { + it('should return a nominated loss payee with decrypted data', async () => { + const decryptFinancialUk = true; + const decryptFinancialInternational = true; + + const result = await getNominatedLossPayee( + context, + lossPayee.id, + decryptFinancialUk, + decryptFinancialInternational, + ); + + const decrypted = decryptNominatedLossPayee(lossPayee, decryptFinancialUk, decryptFinancialInternational); + + const expected = { + ...lossPayee, + ...decrypted, + }; + + expect(result).toEqual(expected); + }); + }); }); diff --git a/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts b/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts index a28f9a44da..019b6eff43 100644 --- a/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts +++ b/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts @@ -1,4 +1,6 @@ import { Context } from '.keystone/types'; // eslint-disable-line +import decryptNominatedLossPayee from '../../decrypt-nominated-loss-payee'; +import { ApplicationNominatedLossPayee } from '../../../types'; /** * getNominatedLossPayee @@ -7,7 +9,12 @@ import { Context } from '.keystone/types'; // eslint-disable-line * @param {String} lossPayeeId: Loss payee ID * @returns {ApplicationPolicy} mapped policy */ -const getNominatedLossPayee = async (context: Context, lossPayeeId: string) => { +const getNominatedLossPayee = async ( + context: Context, + lossPayeeId: string, + decryptFinancialUk?: boolean, + decryptFinancialInternational?: boolean, +) => { try { console.info(`Getting nominated loss payee ${lossPayeeId}`); @@ -15,7 +22,13 @@ const getNominatedLossPayee = async (context: Context, lossPayeeId: string) => { where: { id: lossPayeeId }, query: 'id isAppointed isLocatedInUk isLocatedInternationally name financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } }', - }); + }) as ApplicationNominatedLossPayee; + + if (decryptFinancialUk && decryptFinancialInternational) { + const decryptedNominatedLossPayee = decryptNominatedLossPayee(nominatedLossPayee, decryptFinancialUk, decryptFinancialInternational); + + return decryptedNominatedLossPayee; + } return nominatedLossPayee; } catch (err) { diff --git a/src/api/test-helpers/loss-payee-financial-international.ts b/src/api/test-helpers/loss-payee-financial-international.ts index 537b84ef34..c853c51046 100644 --- a/src/api/test-helpers/loss-payee-financial-international.ts +++ b/src/api/test-helpers/loss-payee-financial-international.ts @@ -1,3 +1,4 @@ +import createLossPayeeFinancialDetailsInternationalVector from './loss-payee-financial-international-vector'; import { ApplicationLossPayeeFinancialInternational, TestHelperCreate } from '../types'; /** @@ -10,9 +11,18 @@ import { ApplicationLossPayeeFinancialInternational, TestHelperCreate } from '.. const createLossPayeeFinancialDetailsInternational = async ({ context }: TestHelperCreate) => { try { console.info('Creating a loss payee financial international (test helpers)'); + + const financialInternationalVector = await createLossPayeeFinancialDetailsInternationalVector({ context }); + const lossPayeeFinancialDetailsInternational = (await context.query.LossPayeeFinancialInternational.createOne({ - data: {}, - query: 'id', + data: { + vector: { + connect: { + id: financialInternationalVector.id, + }, + }, + }, + query: 'id bicSwiftCode iban bankAddress vector { bicSwiftCodeVector ibanVector }', })) as ApplicationLossPayeeFinancialInternational; return lossPayeeFinancialDetailsInternational; diff --git a/src/api/test-helpers/loss-payee-financial-uk.ts b/src/api/test-helpers/loss-payee-financial-uk.ts index 90d13f02e1..f0ee95cf69 100644 --- a/src/api/test-helpers/loss-payee-financial-uk.ts +++ b/src/api/test-helpers/loss-payee-financial-uk.ts @@ -1,3 +1,4 @@ +import createLossPayeeFinancialDetailsUkVector from './loss-payee-financial-uk-vector'; import { ApplicationLossPayeeFinancialUk, TestHelperCreate } from '../types'; /** @@ -9,9 +10,18 @@ import { ApplicationLossPayeeFinancialUk, TestHelperCreate } from '../types'; const createLossPayeeFinancialDetailsUk = async ({ context }: TestHelperCreate) => { try { console.info('Creating a loss payee financial uk (test helpers)'); + + const financialUkVector = await createLossPayeeFinancialDetailsUkVector({ context }); + const lossPayeeFinancialDetailsUk = (await context.query.LossPayeeFinancialUk.createOne({ - data: {}, - query: 'id', + data: { + vector: { + connect: { + id: financialUkVector.id, + }, + }, + }, + query: 'id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector }', })) as ApplicationLossPayeeFinancialUk; return lossPayeeFinancialDetailsUk; diff --git a/src/api/test-helpers/nominated-loss-payee.ts b/src/api/test-helpers/nominated-loss-payee.ts index dade548095..ed39dde843 100644 --- a/src/api/test-helpers/nominated-loss-payee.ts +++ b/src/api/test-helpers/nominated-loss-payee.ts @@ -1,3 +1,6 @@ +import createLossPayeeFinancialDetailsUk from './loss-payee-financial-uk'; +import createLossPayeeFinancialDetailsInternational from './loss-payee-financial-international'; + import { ApplicationNominatedLossPayee, TestHelperCreate } from '../types'; /** @@ -10,12 +13,34 @@ const createNominatedLossPayee = async ({ context }: TestHelperCreate) => { try { console.info('Creating a nominated loss payee (test helpers)'); + const financialUk = await createLossPayeeFinancialDetailsUk({ context }); + const financialInternational = await createLossPayeeFinancialDetailsInternational({ context }); + const lossPayee = (await context.query.NominatedLossPayee.createOne({ - data: {}, - query: 'id financialInternational { id } financialUk { id } isAppointed isLocatedInUk isLocatedInternationally name', + data: { + financialUk: { + connect: { + // TODO: fix types + id: financialUk.id, + }, + }, + financialInternational: { + connect: { + // TODO: fix types + id: financialInternational.id, + }, + }, + }, + query: 'id financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } } financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } isAppointed isLocatedInUk isLocatedInternationally name', })) as ApplicationNominatedLossPayee; - return lossPayee; + const created = { + ...lossPayee, + financialUk, + financialInternational, + }; + + return created; } catch (err) { console.error('Error creating a nominated loss payee (test helpers) %O', err); return err; diff --git a/src/api/types/test-helpers/index.ts b/src/api/types/test-helpers/index.ts index 300cc19006..ff7e78037e 100644 --- a/src/api/types/test-helpers/index.ts +++ b/src/api/types/test-helpers/index.ts @@ -53,9 +53,9 @@ export interface TestHelperPolicyUpdate extends TestHelperCreate { } export interface TestHelperLossPayeeFinancialInternationalVectorCreate extends TestHelperCreate { - data: LossPayeeFinancialInternationalVectorCreateInput; + data?: LossPayeeFinancialInternationalVectorCreateInput; } export interface TestHelperLossPayeeFinancialUkVectorCreate extends TestHelperCreate { - data: LossPayeeFinancialUkVectorCreateInput; + data?: LossPayeeFinancialUkVectorCreateInput; } From 7a99b14d22baab039d7125fa90bc04615fdc5c1e Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Tue, 11 Jun 2024 16:41:18 +0100 Subject: [PATCH 05/12] feat(EMS-3342): fix/update unit tests --- .../index.test.ts | 17 ++-- .../index.test.ts | 19 +++-- .../map-policy/index.test.ts | 14 +--- src/api/helpers/create-a-broker/index.test.ts | 60 ++++++++++++++ src/api/helpers/create-a-broker/index.ts | 30 +++++++ .../get-populated-application/index.test.ts | 35 ++------ .../test-helpers/create-full-application.ts | 83 ++++--------------- 7 files changed, 135 insertions(+), 123 deletions(-) create mode 100644 src/api/helpers/create-a-broker/index.test.ts create mode 100644 src/api/helpers/create-a-broker/index.ts diff --git a/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-international/index.test.ts b/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-international/index.test.ts index 0e9438ce06..2ace0b3812 100644 --- a/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-international/index.test.ts +++ b/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-international/index.test.ts @@ -7,6 +7,7 @@ import createLossPayeeFinancialDetailsInternationalVector from '../../../test-he describe('custom-resolvers/update-loss-payee-financial-details-international', () => { let context: Context; + let lossPayeeFinancialDetailsInternational: ApplicationLossPayeeFinancialInternational; let lossPayeeFinancialDetailsInternationalResponse: SuccessResponse; let vector: ApplicationLossPayeeFinancialInternationalVector; @@ -26,7 +27,7 @@ describe('custom-resolvers/update-loss-payee-financial-details-international', ( describe('successfully updates loss payee financial international', () => { beforeEach(async () => { jest.resetAllMocks(); - const lossPayeeFinancialDetailsInternational = (await createLossPayeeFinancialDetailsInternational({ + lossPayeeFinancialDetailsInternational = (await createLossPayeeFinancialDetailsInternational({ context, })) as ApplicationLossPayeeFinancialInternational; @@ -76,14 +77,14 @@ describe('custom-resolvers/update-loss-payee-financial-details-international', ( describe('when an error occurs whilst updating loss payee financial international vector', () => { it('should throw an error', async () => { /** - * Create a new LossPayeeFinancialDetailsInternational, - * Without a vector relationship. - * This will then cause the vector call to fail, - * because there is no associated vector ID. + * Delete the LossPayeeFinancialInternationalVector relationship, + * to cause the vector data saving to fail. */ - const lossPayeeFinancialDetailsInternational = (await createLossPayeeFinancialDetailsInternational({ - context, - })) as ApplicationLossPayeeFinancialInternational; + await context.query.LossPayeeFinancialInternationalVector.deleteOne({ + where: { + id: vector.id, + }, + }); variables.id = lossPayeeFinancialDetailsInternational.id; diff --git a/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-uk/index.test.ts b/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-uk/index.test.ts index f79bf29fbd..cbaf5f740a 100644 --- a/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-uk/index.test.ts +++ b/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-uk/index.test.ts @@ -7,6 +7,7 @@ import createLossPayeeFinancialDetailsUkVector from '../../../test-helpers/loss- describe('custom-resolvers/update-loss-payee-financial-details-uk', () => { let context: Context; + let lossPayeeFinancialDetailsUk: ApplicationLossPayeeFinancialUk; let lossPayeeFinancialDetailsUkResponse: SuccessResponse; let vector: ApplicationLossPayeeFinancialUkVector; @@ -26,7 +27,7 @@ describe('custom-resolvers/update-loss-payee-financial-details-uk', () => { describe('successfully updates loss payee financial uk', () => { beforeEach(async () => { jest.resetAllMocks(); - const lossPayeeFinancialDetailsUk = (await createLossPayeeFinancialDetailsUk({ context })) as ApplicationLossPayeeFinancialUk; + lossPayeeFinancialDetailsUk = (await createLossPayeeFinancialDetailsUk({ context })) as ApplicationLossPayeeFinancialUk; vector = (await createLossPayeeFinancialDetailsUkVector({ context, @@ -56,17 +57,17 @@ describe('custom-resolvers/update-loss-payee-financial-details-uk', () => { }); }); - describe('when an error occurs whilst updating loss payee financial uk vector', () => { + describe('when an error occurs whilst updating loss payee financial international vector', () => { it('should throw an error', async () => { /** - * Create a new LossPayeeFinancialDetailsUk, - * Without a vector relationship. - * This will then cause the vector call to fail, - * because there is no associated vector ID. + * Delete the LossPayeeFinancialUkVector relationship, + * to cause the vector data saving to fail. */ - const lossPayeeFinancialDetailsUk = (await createLossPayeeFinancialDetailsUk({ - context, - })) as ApplicationLossPayeeFinancialUk; + await context.query.LossPayeeFinancialUkVector.deleteOne({ + where: { + id: vector.id, + }, + }); variables.id = lossPayeeFinancialDetailsUk.id; diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts index 67e3cb6098..3f8766151d 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts @@ -34,10 +34,8 @@ const { } = FIELD_IDS; describe('api/generate-xlsx/map-application-to-xlsx/map-policy', () => { - let populatedApplication: Application; let populatedApplicationMultiplePolicy: Application; let fullApplication: Application; - let application: object; let context: Context; beforeAll(async () => { @@ -45,10 +43,6 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy', () => { fullApplication = await createFullApplication(context); - application = mapApplicationIds(fullApplication); - - populatedApplication = await getPopulatedApplication({ context, application }); - const multiplePolicyApplication = await createFullApplication(context, FIELD_VALUES.POLICY_TYPE.MULTIPLE); populatedApplicationMultiplePolicy = await getPopulatedApplication({ context, application: mapApplicationIds(multiplePolicyApplication) }); @@ -56,9 +50,9 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy', () => { describe(`when the policy type is ${FIELD_VALUES.POLICY_TYPE.SINGLE}`, () => { it('should return an array of mapped fields via mapSingleContractPolicy', () => { - const result = mapPolicy(populatedApplication); + const result = mapPolicy(fullApplication); - const { nominatedLossPayee, policy, policyContact } = populatedApplication; + const { nominatedLossPayee, policy, policyContact } = fullApplication; const expected = [ ...mapIntro(policy), @@ -70,7 +64,7 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy', () => { xlsxRow(String(FIELDS[NEED_PRE_CREDIT_PERIOD]), mapYesNoField({ answer: policy[NEED_PRE_CREDIT_PERIOD] })), xlsxRow(String(FIELDS[REQUESTED]), mapYesNoField({ answer: policy.jointlyInsuredParty[REQUESTED] })), - ...mapBroker(application), + ...mapBroker(fullApplication), ...mapLossPayee(nominatedLossPayee), ]; @@ -94,7 +88,7 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy', () => { xlsxRow(String(FIELDS[NEED_PRE_CREDIT_PERIOD]), mapYesNoField({ answer: policy[NEED_PRE_CREDIT_PERIOD] })), xlsxRow(String(FIELDS[REQUESTED]), mapYesNoField({ answer: policy.jointlyInsuredParty[REQUESTED] })), - ...mapBroker(application), + ...mapBroker(fullApplication), ...mapLossPayee(nominatedLossPayee), ]; diff --git a/src/api/helpers/create-a-broker/index.test.ts b/src/api/helpers/create-a-broker/index.test.ts new file mode 100644 index 0000000000..bb5a0be17c --- /dev/null +++ b/src/api/helpers/create-a-broker/index.test.ts @@ -0,0 +1,60 @@ +import createABroker from '.'; +import { Application, Context } from '../../types'; +import getKeystoneContext from '../../test-helpers/get-keystone-context'; +import applications from '../../test-helpers/applications'; + +const assertError = (err) => { + const errorString = String(err); + + expect(errorString.includes('Creating a broker')).toEqual(true); +}; + +describe('helpers/create-a-broker', () => { + let context: Context; + let application: Application; + + beforeAll(async () => { + context = getKeystoneContext(); + + application = (await applications.create({ context, data: {} })) as Application; + }); + + test('it should return a broker', async () => { + const result = await createABroker(context, application.id); + + expect(result.id).toBeDefined(); + expect(typeof result.id).toEqual('string'); + + expect(result.applicationId).toEqual(application.id); + expect(result.isUsingBroker).toBeNull(); + expect(result.name).toEqual(''); + expect(result.addressLine1).toEqual(''); + expect(result.addressLine2).toEqual(''); + expect(result.town).toEqual(''); + expect(result.county).toEqual(''); + expect(result.postcode).toEqual(''); + expect(result.fullAddress).toEqual(''); + expect(result.email).toEqual(''); + }); + + describe('when an invalid application ID is passed', () => { + test('it should throw an error', async () => { + try { + await createABroker(context, 'invalid-id'); + } catch (err) { + assertError(err); + } + }); + }); + + describe('when creation is not successful', () => { + test('it should throw an error', async () => { + try { + // pass empty context object to force an error + await createABroker({}, application.id); + } catch (err) { + assertError(err); + } + }); + }); +}); diff --git a/src/api/helpers/create-a-broker/index.ts b/src/api/helpers/create-a-broker/index.ts new file mode 100644 index 0000000000..86d500ed4d --- /dev/null +++ b/src/api/helpers/create-a-broker/index.ts @@ -0,0 +1,30 @@ +import { Context } from '../../types'; + +/** + * createABroker + * Create a broker. + * @param {Context} KeystoneJS context API + * @param {String} Application ID + * @returns {Promise} Created broker + */ +const createABroker = async (context: Context, applicationId: string) => { + console.info('Creating a broker for ', applicationId); + + try { + const broker = await context.db.Broker.createOne({ + data: { + application: { + connect: { id: applicationId }, + }, + }, + }); + + return broker; + } catch (err) { + console.error('Error creating a broker %O', err); + + throw new Error(`Creating a broker ${err}`); + } +}; + +export default createABroker; diff --git a/src/api/helpers/get-populated-application/index.test.ts b/src/api/helpers/get-populated-application/index.test.ts index 3eba7c7178..b69f164087 100644 --- a/src/api/helpers/get-populated-application/index.test.ts +++ b/src/api/helpers/get-populated-application/index.test.ts @@ -88,38 +88,15 @@ describe('api/helpers/get-populated-application', () => { expect(result.company.differentTradingAddress.fullAddress).toEqual(''); }); - describe('nominatedLossPayee', () => { - it('should return an application with populated nominatedLossPayee without decrypted data by default', async () => { - const result = await getPopulatedApplication({ context, application }); - - const decryptFinancialUk = false; - const decryptFinancialInternational = false; - - const expected = await getNominatedLossPayee( - context, - application.nominatedLossPayeeId, - decryptFinancialUk, - decryptFinancialInternational, - ); - - expect(result.nominatedLossPayee).toEqual(expected); - }); - - it('should return an application with populated nominatedLossPayee with decrypted data when `decrypt` params are passed', async () => { - const result = await getPopulatedApplication({ context, application }); + it('should return an application with populated nominatedLossPayee with decrypted data by default', async () => { + const result = await getPopulatedApplication({ context, application }); - const decryptFinancialUk = true; - const decryptFinancialInternational = true; + const decryptFinancialUk = false; + const decryptFinancialInternational = false; - const expected = await getNominatedLossPayee( - context, - application.nominatedLossPayeeId, - decryptFinancialUk, - decryptFinancialInternational, - ); + const expected = await getNominatedLossPayee(context, application.nominatedLossPayeeId, decryptFinancialUk, decryptFinancialInternational); - expect(result.nominatedLossPayee).toEqual(expected); - }); + expect(result.nominatedLossPayee).toEqual(expected); }); it('should return an application with mapped policy data', async () => { diff --git a/src/api/test-helpers/create-full-application.ts b/src/api/test-helpers/create-full-application.ts index 808f62349d..e2fee8fd0d 100644 --- a/src/api/test-helpers/create-full-application.ts +++ b/src/api/test-helpers/create-full-application.ts @@ -1,7 +1,9 @@ +import { Context } from '.keystone/types'; // eslint-disable-line import accounts from './accounts'; import coverPeriodTestHelper from './cover-period'; import totalContractValueTestHelper from './total-contract-value'; import createAnEligibility from '../helpers/create-an-eligibility'; +import createABroker from '../helpers/create-a-broker'; import createABuyer from '../helpers/create-a-buyer'; import createAPolicy from '../helpers/create-a-policy'; import createACompany from '../helpers/create-a-company'; @@ -16,26 +18,11 @@ import { mockExportContract, mockBusiness, mockPolicyContact, - mockLossPayeeFinancialDetailsUk, - mockLossPayeeFinancialDetailsUkVector, - mockLossPayeeFinancialDetailsInternational, - mockLossPayeeFinancialDetailsInternationalVector, } from '../test-mocks/mock-application'; -import { mockApplicationDeclaration, mockNominatedLossPayee } from '../test-mocks'; +import { mockApplicationDeclaration } from '../test-mocks'; import mockCompany from '../test-mocks/mock-company'; import mockCountries from '../test-mocks/mock-countries'; -import { - Application, - ApplicationBusiness, - ApplicationDeclaration, - ApplicationExportContract, - ApplicationPolicy, - ApplicationPolicyContact, - ApplicationLossPayeeFinancialUk, - ApplicationLossPayeeFinancialInternational, - Context, - ApplicationNominatedLossPayee, -} from '../types'; +import { Application, ApplicationBusiness, ApplicationDeclaration, ApplicationExportContract, ApplicationPolicy, ApplicationPolicyContact } from '../types'; const { POLICY_TYPE } = FIELD_VALUES; @@ -91,18 +78,21 @@ export const createFullApplication = async (context: Context, policyType?: strin otherEligibilityAnswers, ); - // create buyer and associate with the application. + // create a broker and associate with the application. + const broker = await createABroker(context, application.id); + + // create a buyer and associate with the application. const { buyer } = await createABuyer(context, country.id, application.id); - // create policy and associate with the application. + // create a policy and associate with the application. const { policy: createdPolicy } = await createAPolicy(context, application.id); let policy = createdPolicy; - // create company and associate with the application. + // create a company and associate with the application. const company = await createACompany(context, application.id, mockCompany); - // create exportContract and associate with the application. + // create an exportContract and associate with the application. const { exportContract } = await createAnExportContract(context, application.id); // create a nominatedLossPayee and associate with the application. @@ -121,6 +111,9 @@ export const createFullApplication = async (context: Context, policyType?: strin await context.db.Application.updateOne({ where: { id: application.id }, data: { + broker: { + connect: { id: broker.id }, + }, buyer: { connect: { id: buyer.id }, }, @@ -203,60 +196,16 @@ export const createFullApplication = async (context: Context, policyType?: strin query: 'id hasAntiBriberyCodeOfConduct', })) as ApplicationDeclaration; - // gets financialUk id from application for updating + // get the latest application. const updatedApplication = (await context.query.Application.findOne({ where: { id: application.id }, query: 'id nominatedLossPayee { id isAppointed financialUk { id vector { id } } financialInternational { id vector { id } } } sectionReview { id }', })) as Application; - // updates nominatedLossPayee - (await context.query.NominatedLossPayee.updateOne({ - where: { - id: updatedApplication.nominatedLossPayee.id, - }, - data: mockNominatedLossPayee, - query: 'id', - })) as ApplicationNominatedLossPayee; - - // updates LossPayeeFinancialUk table - (await context.query.LossPayeeFinancialUk.updateOne({ - where: { - id: updatedApplication.nominatedLossPayee.financialUk.id, - }, - data: mockLossPayeeFinancialDetailsUk, - query: 'id', - })) as ApplicationLossPayeeFinancialUk; - - // updates LossPayeeFinancialUkVector table - (await context.query.LossPayeeFinancialUkVector.updateOne({ - where: { - id: updatedApplication.nominatedLossPayee.financialUk.vector.id, - }, - data: mockLossPayeeFinancialDetailsUkVector, - query: 'id', - })) as ApplicationLossPayeeFinancialUk; - - // updates LossPayeeFinancialInternational table - (await context.query.LossPayeeFinancialInternational.updateOne({ - where: { - id: updatedApplication.nominatedLossPayee.financialInternational.id, - }, - data: mockLossPayeeFinancialDetailsInternational, - query: 'id', - })) as ApplicationLossPayeeFinancialInternational; - - // updates LossPayeeFinancialInternationalVector table - (await context.query.LossPayeeFinancialInternationalVector.updateOne({ - where: { - id: updatedApplication.nominatedLossPayee.financialInternational.vector.id, - }, - data: mockLossPayeeFinancialDetailsInternationalVector, - query: 'id', - })) as ApplicationLossPayeeFinancialUk; - return { ...application, owner: account, + broker, business, buyer, company, From cc7a6baa85941c855b2b9a438a843ff2f9b21c1d Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Tue, 11 Jun 2024 17:12:32 +0100 Subject: [PATCH 06/12] feat(EMS-3342): fix/update unit test --- .../get-populated-application/index.test.ts | 35 +------------------ 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/src/api/helpers/get-populated-application/index.test.ts b/src/api/helpers/get-populated-application/index.test.ts index b69f164087..aa380e1eac 100644 --- a/src/api/helpers/get-populated-application/index.test.ts +++ b/src/api/helpers/get-populated-application/index.test.ts @@ -6,12 +6,7 @@ import mapPolicy from './map-policy'; import getNominatedLossPayee from './nominated-loss-payee'; import mockCountries from '../../test-mocks/mock-countries'; import { Application, Context } from '../../types'; -import mockApplication, { - mockLossPayeeFinancialDetailsUk, - mockLossPayeeFinancialDetailsUkVector, - mockLossPayeeFinancialDetailsInternational, - mockLossPayeeFinancialDetailsInternationalVector, -} from '../../test-mocks/mock-application'; +import mockApplication from '../../test-mocks/mock-application'; describe('api/helpers/get-populated-application', () => { let context: Context; @@ -110,34 +105,6 @@ describe('api/helpers/get-populated-application', () => { expect(result.policy).toEqual(expected); }); - it('should return an application with populated financialUk', async () => { - const result = await getPopulatedApplication({ context, application }); - - const { financialUk } = result.nominatedLossPayee; - - const expected = { - ...mockLossPayeeFinancialDetailsUk, - id: financialUk.id, - vector: mockLossPayeeFinancialDetailsUkVector, - }; - - expect(financialUk).toEqual(expected); - }); - - it('should return an application with populated financialInternational', async () => { - const result = await getPopulatedApplication({ context, application }); - - const { financialInternational } = result.nominatedLossPayee; - - const expected = { - ...mockLossPayeeFinancialDetailsInternational, - id: financialInternational.id, - vector: mockLossPayeeFinancialDetailsInternationalVector, - }; - - expect(financialInternational).toEqual(expected); - }); - it('should return an application with populated answers and finalDestinationCountry object in exportContract', async () => { const result = await getPopulatedApplication({ context, application }); From d2cfcb6cdacebc05e21a628ff432c50e3317544a Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Tue, 11 Jun 2024 17:29:42 +0100 Subject: [PATCH 07/12] feat(EMS-3462): fix typo --- e2e-tests/constants/application.js | 4 ++-- src/ui/server/constants/application/index.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/e2e-tests/constants/application.js b/e2e-tests/constants/application.js index 37a9a7b529..0668b7a7d5 100644 --- a/e2e-tests/constants/application.js +++ b/e2e-tests/constants/application.js @@ -7,8 +7,8 @@ export const APPLICATION = { SINGLE: 'Single contract policy', MULTIPLE: 'Multiple contract policy', ABBREVIATED: { - SINGLE: 'Single contract policy', - MULTIPLE: 'Multiple contract policy', + SINGLE: 'Single', + MULTIPLE: 'Multiple', }, }, POLICY: { diff --git a/src/ui/server/constants/application/index.ts b/src/ui/server/constants/application/index.ts index 1469fb2d7f..6bdc18067d 100644 --- a/src/ui/server/constants/application/index.ts +++ b/src/ui/server/constants/application/index.ts @@ -19,8 +19,8 @@ export const APPLICATION = { SINGLE: 'Single contract policy', MULTIPLE: 'Multiple contract policy', ABBREVIATED: { - SINGLE: 'Single contract policy', - MULTIPLE: 'Multiple contract policy', + SINGLE: 'Single', + MULTIPLE: 'Multiple', }, }, POLICY: { From 1346e85a7007209e836e646ae9ff16d913b3d8fb Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Wed, 12 Jun 2024 11:06:03 +0100 Subject: [PATCH 08/12] feat(EMS-3342): update getPopulatedApplication to have a modular structure --- src/api/.keystone/config.js | 29 +++-- .../submit-application/index.test.ts | 2 +- .../mutations/submit-application/index.ts | 2 +- .../index.test.ts | 118 +++++++++++------- .../index.ts | 31 ++--- .../map-policy/index.test.ts | 2 +- .../map-policy/map-intro/index.test.ts | 2 +- .../index.test.ts | 2 +- .../map-single-contract-policy/index.test.ts | 2 +- .../index.api-error.test.ts | 34 ++--- .../get-populated-application/index.test.ts | 14 +-- .../get-populated-application/index.ts | 13 +- .../generate-submitted-application.ts | 2 +- 13 files changed, 136 insertions(+), 117 deletions(-) diff --git a/src/api/.keystone/config.js b/src/api/.keystone/config.js index 2e1ac62409..2ce38af33a 100644 --- a/src/api/.keystone/config.js +++ b/src/api/.keystone/config.js @@ -5187,7 +5187,7 @@ var getPopulatedApplication = async ({ if (!sectionReview) { throw new Error(generateErrorMessage("sectionReview", application2.id)); } - const populatedApplication = { + const populatedApplication2 = { ...application2, eligibility: populatedEligibility, broker, @@ -5203,9 +5203,12 @@ var getPopulatedApplication = async ({ nominatedLossPayee, sectionReview }; - return populatedApplication; + return populatedApplication2; }; -var get_populated_application_default = getPopulatedApplication; +var populatedApplication = { + get: getPopulatedApplication +}; +var get_populated_application_default = populatedApplication; // helpers/get-application-submitted-email-template-ids/index.ts var { @@ -7044,14 +7047,14 @@ var submitApplication = async (root, variables, context) => { data: update2 }); console.info("Submitting application - getting populated application %s", variables.applicationId); - const populatedApplication = await get_populated_application_default({ + const populatedApplication2 = await get_populated_application_default.get({ context, application: updatedApplication, decryptFinancialUk: true, decryptFinancialInternational: true }); - const xlsxPath = await generate_xlsx_default.XLSX(populatedApplication); - await send_application_submitted_emails_default.send(populatedApplication, xlsxPath); + const xlsxPath = await generate_xlsx_default.XLSX(populatedApplication2); + await send_application_submitted_emails_default.send(populatedApplication2, xlsxPath); return { success: true }; @@ -7858,15 +7861,15 @@ var getApplicationByReferenceNumberQuery = async (root, variables, context) => { const { referenceNumber, decryptFinancialUk: decryptFinancialUk2, decryptFinancialInternational: decryptFinancialInternational2 } = variables; const application2 = await get_application_by_reference_number_default(referenceNumber, context); if (application2) { - const populatedApplication = await get_populated_application_default({ context, application: application2 }); - if (decryptFinancialUk2 || decryptFinancialInternational2) { - const { nominatedLossPayee } = populatedApplication; - const decryptedNominatedLossPayee = decrypt_nominated_loss_payee_default(nominatedLossPayee, decryptFinancialUk2, decryptFinancialInternational2); - populatedApplication.nominatedLossPayee = decryptedNominatedLossPayee; - } + const populatedApplication2 = await get_populated_application_default.get({ + context, + application: application2, + decryptFinancialUk: decryptFinancialUk2, + decryptFinancialInternational: decryptFinancialInternational2 + }); return { success: true, - application: populatedApplication + application: populatedApplication2 }; } return { diff --git a/src/api/custom-resolvers/mutations/submit-application/index.test.ts b/src/api/custom-resolvers/mutations/submit-application/index.test.ts index c46518ee70..497a4ffc6b 100644 --- a/src/api/custom-resolvers/mutations/submit-application/index.test.ts +++ b/src/api/custom-resolvers/mutations/submit-application/index.test.ts @@ -96,7 +96,7 @@ describe('custom-resolvers/submit-application', () => { where: { id: submittedApplication.id }, }); - populatedApplication = await getPopulatedApplication({ + populatedApplication = await getPopulatedApplication.get({ context, application: fullSubmittedApplication, decryptFinancialUk: true, diff --git a/src/api/custom-resolvers/mutations/submit-application/index.ts b/src/api/custom-resolvers/mutations/submit-application/index.ts index 806ea83bd1..9280c6cf7a 100644 --- a/src/api/custom-resolvers/mutations/submit-application/index.ts +++ b/src/api/custom-resolvers/mutations/submit-application/index.ts @@ -59,7 +59,7 @@ const submitApplication = async (root: any, variables: SubmitApplicationVariable console.info('Submitting application - getting populated application %s', variables.applicationId); // get a fully populated application for XLSX generation - const populatedApplication = await getPopulatedApplication({ + const populatedApplication = await getPopulatedApplication.get({ context, application: updatedApplication, decryptFinancialUk: true, diff --git a/src/api/custom-resolvers/queries/get-application-by-reference-number/index.test.ts b/src/api/custom-resolvers/queries/get-application-by-reference-number/index.test.ts index db8a468220..f08017b592 100644 --- a/src/api/custom-resolvers/queries/get-application-by-reference-number/index.test.ts +++ b/src/api/custom-resolvers/queries/get-application-by-reference-number/index.test.ts @@ -1,29 +1,32 @@ -import getApplicationByReferenceNumber from '.'; -import { mockLossPayeeFinancialDetailsUk } from '../../../test-mocks/mock-application'; -import { Context } from '../../../types'; +import { Application as KeystoneApplication, Context } from '.keystone/types'; // eslint-disable-line +import getApplicationByReferenceNumberQuery from '.'; +import getApplicationByReferenceNumber from '../../../helpers/get-application-by-reference-number'; +import getPopulatedApplication from '../../../helpers/get-populated-application'; import getKeystoneContext from '../../../test-helpers/get-keystone-context'; import { createFullApplication } from '../../../test-helpers/create-full-application'; -import decrypt from '../../../helpers/decrypt'; +import { mockApplication } from '../../../test-mocks'; describe('custom-resolvers/get-application-by-reference-number', () => { let context: Context; + let fullApplication; + let refNumber: number; + + const populatedApplicationResponse = mockApplication; - jest.mock('../../../helpers/decrypt'); - const mockDecryptedValue = '123456'; - let decryptSpy = jest.fn(); + jest.mock('../../../helpers/get-populated-application'); + + let getPopulatedApplicationSpy = jest.fn(); beforeAll(() => { context = getKeystoneContext(); }); - let refNumber: number; - beforeAll(async () => { jest.resetAllMocks(); - const application = await createFullApplication(context); + fullApplication = await createFullApplication(context); - const { referenceNumber } = application; + const { referenceNumber } = fullApplication; refNumber = referenceNumber; }); @@ -31,68 +34,93 @@ describe('custom-resolvers/get-application-by-reference-number', () => { beforeEach(async () => { jest.resetAllMocks(); - decryptSpy = jest.fn(() => mockDecryptedValue); + getPopulatedApplicationSpy = jest.fn(() => populatedApplicationResponse); - decrypt.decrypt = decryptSpy; + getPopulatedApplication.get = getPopulatedApplicationSpy; }); - describe('when the decryptFinancialUk variable is not set', () => { - it('should return success=true and application without decryption', async () => { - const result = await getApplicationByReferenceNumber({}, { referenceNumber: refNumber }, context); + describe('when the decryptFinancialUk and decryptFinancialInternational variables are NOT provided', () => { + it('should call getPopulatedApplication.get', async () => { + await getApplicationByReferenceNumberQuery({}, { referenceNumber: refNumber }, context); - const { financialUk } = result.application.nominatedLossPayee; + const expectedApplication = await getApplicationByReferenceNumber(refNumber, context); - expect(result.success).toEqual(true); - expect(financialUk.sortCode).toEqual(mockLossPayeeFinancialDetailsUk.sortCode); - expect(financialUk.accountNumber).toEqual(mockLossPayeeFinancialDetailsUk.accountNumber); + expect(getPopulatedApplicationSpy).toHaveBeenCalledTimes(1); + expect(getPopulatedApplicationSpy).toHaveBeenCalledWith({ + context, + application: expectedApplication, + decryptFinancialUk: undefined, + decryptFinancialInternational: undefined, + }); }); - it('should NOT call decrypt', async () => { - await getApplicationByReferenceNumber({}, { referenceNumber: refNumber }, context); + it('should return success=true and populated application', async () => { + const result = await getApplicationByReferenceNumberQuery({}, { referenceNumber: refNumber }, context); + + const expected = { + success: true, + application: populatedApplicationResponse, + }; - expect(decryptSpy).toHaveBeenCalledTimes(0); + expect(result).toEqual(expected); }); }); - describe('when the decryptFinancialUk variable is set to "true"', () => { - it('should return success=true and application with decryption', async () => { - const result = await getApplicationByReferenceNumber({}, { referenceNumber: refNumber, decryptFinancialUk: true }, context); + describe('when the decryptFinancialUk variable is set to true', () => { + it('should call getPopulatedApplication.get', async () => { + await getApplicationByReferenceNumberQuery({}, { referenceNumber: refNumber, decryptFinancialUk: true }, context); - const { financialUk } = result.application.nominatedLossPayee; + const expectedApplication = await getApplicationByReferenceNumber(refNumber, context); - expect(result.success).toEqual(true); - expect(financialUk.sortCode).toEqual(mockDecryptedValue); - expect(financialUk.accountNumber).toEqual(mockDecryptedValue); + expect(getPopulatedApplicationSpy).toHaveBeenCalledTimes(1); + expect(getPopulatedApplicationSpy).toHaveBeenCalledWith({ + context, + application: expectedApplication, + decryptFinancialUk: true, + }); }); - it('should call decrypt', async () => { - await getApplicationByReferenceNumber({}, { referenceNumber: refNumber, decryptFinancialUk: true }, context); + it('should return success=true and populated application', async () => { + const result = await getApplicationByReferenceNumberQuery({}, { referenceNumber: refNumber, decryptFinancialUk: true }, context); - expect(decryptSpy).toHaveBeenCalledTimes(2); + const expected = { + success: true, + application: populatedApplicationResponse, + }; + + expect(result).toEqual(expected); }); }); - describe('when the decryptFinancialInternational variable is set to "true"', () => { - it('should return success=true and application with decryption', async () => { - const result = await getApplicationByReferenceNumber({}, { referenceNumber: refNumber, decryptFinancialInternational: true }, context); + describe('when the decryptFinancialInternational variable is set to true', () => { + it('should call getPopulatedApplication.get', async () => { + await getApplicationByReferenceNumberQuery({}, { referenceNumber: refNumber, decryptFinancialInternational: true }, context); - const { financialInternational } = result.application.nominatedLossPayee; + const expectedApplication = await getApplicationByReferenceNumber(refNumber, context); - expect(result.success).toEqual(true); - expect(financialInternational.iban).toEqual(mockDecryptedValue); - expect(financialInternational.bicSwiftCode).toEqual(mockDecryptedValue); + expect(getPopulatedApplicationSpy).toHaveBeenCalledTimes(1); + expect(getPopulatedApplicationSpy).toHaveBeenCalledWith({ + context, + application: expectedApplication, + decryptFinancialInternational: true, + }); }); - it('should call decrypt', async () => { - await getApplicationByReferenceNumber({}, { referenceNumber: refNumber, decryptFinancialUk: true }, context); + it('should return success=true and populated application', async () => { + const result = await getApplicationByReferenceNumberQuery({}, { referenceNumber: refNumber, decryptFinancialInternational: true }, context); + + const expected = { + success: true, + application: populatedApplicationResponse, + }; - expect(decryptSpy).toHaveBeenCalledTimes(2); + expect(result).toEqual(expected); }); }); describe('when the application cannot be found', () => { it('should return success=false', async () => { - const result = await getApplicationByReferenceNumber({}, { referenceNumber: 123 }, context); + const result = await getApplicationByReferenceNumberQuery({}, { referenceNumber: 123 }, context); expect(result.success).toEqual(false); }); @@ -101,7 +129,7 @@ describe('custom-resolvers/get-application-by-reference-number', () => { describe('when an error occurs', () => { it('should throw an error', async () => { try { - await getApplicationByReferenceNumber({}, { referenceNumber: 0 }, context); + await getApplicationByReferenceNumberQuery({}, { referenceNumber: 0 }, context); } catch (err) { const errorString = String(err); diff --git a/src/api/custom-resolvers/queries/get-application-by-reference-number/index.ts b/src/api/custom-resolvers/queries/get-application-by-reference-number/index.ts index a3f8b7c032..41f55b3641 100644 --- a/src/api/custom-resolvers/queries/get-application-by-reference-number/index.ts +++ b/src/api/custom-resolvers/queries/get-application-by-reference-number/index.ts @@ -1,14 +1,12 @@ import { Context } from '.keystone/types'; // eslint-disable-line -import { GetApplicationByReferenceNumberResponse, GetApplicationByReferenceNumberVariables } from '../../../types'; import getApplicationByReferenceNumber from '../../../helpers/get-application-by-reference-number'; import getPopulatedApplication from '../../../helpers/get-populated-application'; -import decryptNominatedLossPayee from '../../../helpers/decrypt-nominated-loss-payee'; +import { GetApplicationByReferenceNumberResponse, GetApplicationByReferenceNumberVariables } from '../../../types'; /** * getApplicationByReferenceNumberQuery - * Gets an application by reference number - * Based on decrypt variables, decrypts part of application - * returns full application + * Get an application by reference number, + * call getPopulatedApplication * @param {Object} GraphQL root variables * @param {Object} GraphQL variables for the getApplicationByReferenceNumberVariables query * @param {Context} KeystoneJS context API @@ -34,23 +32,14 @@ const getApplicationByReferenceNumberQuery = async ( /** * Populate the application, * with all relationships. + * This function also handles decrypting financial details. */ - const populatedApplication = await getPopulatedApplication({ context, application }); - - /** - * if decrypt variables are set to true - * decrypts relevant nominatedLossPayee fields - * if decryptFinancialUk then decrypts financial uk - * if decryptFinancialInternational then decrypts financialInternational - * returns decrypted application - */ - if (decryptFinancialUk || decryptFinancialInternational) { - const { nominatedLossPayee } = populatedApplication; - - const decryptedNominatedLossPayee = decryptNominatedLossPayee(nominatedLossPayee, decryptFinancialUk, decryptFinancialInternational); - - populatedApplication.nominatedLossPayee = decryptedNominatedLossPayee; - } + const populatedApplication = await getPopulatedApplication.get({ + context, + application, + decryptFinancialUk, + decryptFinancialInternational, + }); return { success: true, diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts index 3f8766151d..edd2c198f3 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/index.test.ts @@ -45,7 +45,7 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy', () => { const multiplePolicyApplication = await createFullApplication(context, FIELD_VALUES.POLICY_TYPE.MULTIPLE); - populatedApplicationMultiplePolicy = await getPopulatedApplication({ context, application: mapApplicationIds(multiplePolicyApplication) }); + populatedApplicationMultiplePolicy = await getPopulatedApplication.get({ context, application: mapApplicationIds(multiplePolicyApplication) }); }); describe(`when the policy type is ${FIELD_VALUES.POLICY_TYPE.SINGLE}`, () => { diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts index bd37f4de17..6f932ff6c6 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-intro/index.test.ts @@ -28,7 +28,7 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy/map-intro', () => application = mapApplicationIds(fullApplication); - populatedApplication = await getPopulatedApplication({ context, application }); + populatedApplication = await getPopulatedApplication.get({ context, application }); }); it('should return an array of mapped fields', () => { diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-multiple-contract-policy/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-multiple-contract-policy/index.test.ts index 85f52a8780..b1a7b0f54a 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-multiple-contract-policy/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-multiple-contract-policy/index.test.ts @@ -38,7 +38,7 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy/map-multiple-cont const multiplePolicyApplication = await createFullApplication(context, FIELD_VALUES.POLICY_TYPE.MULTIPLE); - populatedApplicationMultiplePolicy = await getPopulatedApplication({ context, application: mapApplicationIds(multiplePolicyApplication) }); + populatedApplicationMultiplePolicy = await getPopulatedApplication.get({ context, application: mapApplicationIds(multiplePolicyApplication) }); }); it('should return an array of mapped fields', () => { diff --git a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts index 59b0da9e0c..0f554eb603 100644 --- a/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts +++ b/src/api/generate-xlsx/map-application-to-XLSX/map-policy/map-single-contract-policy/index.test.ts @@ -42,7 +42,7 @@ describe('api/generate-xlsx/map-application-to-xlsx/map-policy/map-single-contra application = mapApplicationIds(fullApplication); - populatedApplication = await getPopulatedApplication({ context, application }); + populatedApplication = await getPopulatedApplication.get({ context, application }); }); it('should return an array of mapped fields', () => { diff --git a/src/api/helpers/get-populated-application/index.api-error.test.ts b/src/api/helpers/get-populated-application/index.api-error.test.ts index 3cc85619a2..94d38715bc 100644 --- a/src/api/helpers/get-populated-application/index.api-error.test.ts +++ b/src/api/helpers/get-populated-application/index.api-error.test.ts @@ -38,7 +38,7 @@ describe('api/helpers/get-populated-application - error handling', () => { try { const mockApplication = { ...application, eligibilityId: invalidId }; - await getPopulatedApplication({ context, application: mockApplication }); + await getPopulatedApplication.get({ context, application: mockApplication }); } catch (err) { const expected = new Error(generateErrorMessage('eligibility', application.id)); expect(err).toEqual(expected); @@ -51,7 +51,7 @@ describe('api/helpers/get-populated-application - error handling', () => { try { const mockApplication = { ...application, accountId: invalidId }; - await getPopulatedApplication({ context, application: mockApplication }); + await getPopulatedApplication.get({ context, application: mockApplication }); } catch (err) { const expected = new Error(generateErrorMessage('exporter', application.id)); expect(err).toEqual(expected); @@ -64,7 +64,7 @@ describe('api/helpers/get-populated-application - error handling', () => { try { const mockApplication = { ...application, buyerCountryId: invalidId }; - await getPopulatedApplication({ context, application: mockApplication }); + await getPopulatedApplication.get({ context, application: mockApplication }); } catch (err) { const expected = new Error(generateErrorMessage('buyerCountry', application.id)); expect(err).toEqual(expected); @@ -78,7 +78,7 @@ describe('api/helpers/get-populated-application - error handling', () => { const mockApplication = { ...application, policyId: invalidId }; - await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); + await expect(getPopulatedApplication.get({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when policyContact does not exist', async () => { @@ -88,7 +88,7 @@ describe('api/helpers/get-populated-application - error handling', () => { const mockApplication = { ...application, policyContactId: invalidId }; - await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); + await expect(getPopulatedApplication.get({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when companyAddress does not exist', async () => { @@ -97,7 +97,7 @@ describe('api/helpers/get-populated-application - error handling', () => { try { const mockApplication = { ...application, companyAddressId: invalidId }; - await getPopulatedApplication({ context, application: mockApplication }); + await getPopulatedApplication.get({ context, application: mockApplication }); } catch (err) { const expected = new Error(generateErrorMessage('companyAddress', application.id)); expect(err).toEqual(expected); @@ -116,7 +116,7 @@ describe('api/helpers/get-populated-application - error handling', () => { }; try { - await getPopulatedApplication({ context, application: mockApplication }); + await getPopulatedApplication.get({ context, application: mockApplication }); } catch (err) { const expected = new Error(generateErrorMessage('differentTradingAddress', application.id)); expect(err).toEqual(expected); @@ -130,14 +130,14 @@ describe('api/helpers/get-populated-application - error handling', () => { const expected = new Error(generateErrorMessage('company', application.id)); - await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); + await expect(getPopulatedApplication.get({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when companySicCode does not exist', async () => { try { const mockApplication = { ...application, companyId: application.companyId }; - await getPopulatedApplication({ context, application: mockApplication }); + await getPopulatedApplication.get({ context, application: mockApplication }); } catch (err) { const expected = new Error(generateErrorMessage('companySicCode', application.id)); expect(err).toEqual(expected); @@ -151,7 +151,7 @@ describe('api/helpers/get-populated-application - error handling', () => { const expected = new Error(generateErrorMessage('business', application.id)); - await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); + await expect(getPopulatedApplication.get({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when broker does not exist', async () => { @@ -161,7 +161,7 @@ describe('api/helpers/get-populated-application - error handling', () => { const expected = new Error(generateErrorMessage('broker', application.id)); - await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); + await expect(getPopulatedApplication.get({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when buyer does not exist', async () => { @@ -170,7 +170,7 @@ describe('api/helpers/get-populated-application - error handling', () => { try { const mockApplication = { ...application, buyerId: invalidId }; - await getPopulatedApplication({ context, application: mockApplication }); + await getPopulatedApplication.get({ context, application: mockApplication }); } catch (err) { const expected = new Error(generateErrorMessage('buyer', application.id)); expect(err).toEqual(expected); @@ -183,7 +183,7 @@ describe('api/helpers/get-populated-application - error handling', () => { try { const mockApplication = { ...application, buyerRelationship: invalidId }; - await getPopulatedApplication({ context, application: mockApplication }); + await getPopulatedApplication.get({ context, application: mockApplication }); } catch (err) { const expected = new Error(generateErrorMessage('buyerRelationship', application.id)); expect(err).toEqual(expected); @@ -196,7 +196,7 @@ describe('api/helpers/get-populated-application - error handling', () => { try { const mockApplication = { ...application, buyerTradingHistory: invalidId }; - await getPopulatedApplication({ context, application: mockApplication }); + await getPopulatedApplication.get({ context, application: mockApplication }); } catch (err) { const expected = new Error(generateErrorMessage('buyerTradingHistory', application.id)); expect(err).toEqual(expected); @@ -212,7 +212,7 @@ describe('api/helpers/get-populated-application - error handling', () => { buyer: { countryId: invalidId }, }; - await getPopulatedApplication({ context, application: mockApplication }); + await getPopulatedApplication.get({ context, application: mockApplication }); } catch (err) { const expected = new Error(generateErrorMessage('buyer', application.id)); expect(err).toEqual(expected); @@ -226,7 +226,7 @@ describe('api/helpers/get-populated-application - error handling', () => { const expected = new Error(generateErrorMessage('declaration', application.id)); - await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow(expected); + await expect(getPopulatedApplication.get({ context, application: mockApplication })).rejects.toThrow(expected); }); it('should throw an error when sectionReview does not exist', async () => { @@ -234,7 +234,7 @@ describe('api/helpers/get-populated-application - error handling', () => { const mockApplication = { ...application, sectionReviewId: invalidId }; - await expect(getPopulatedApplication({ context, application: mockApplication })).rejects.toThrow( + await expect(getPopulatedApplication.get({ context, application: mockApplication })).rejects.toThrow( new Error(generateErrorMessage('sectionReview', application.id)), ); }); diff --git a/src/api/helpers/get-populated-application/index.test.ts b/src/api/helpers/get-populated-application/index.test.ts index aa380e1eac..a4cf56f6dc 100644 --- a/src/api/helpers/get-populated-application/index.test.ts +++ b/src/api/helpers/get-populated-application/index.test.ts @@ -39,7 +39,7 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with associated data', async () => { - const result = await getPopulatedApplication({ context, application }); + const result = await getPopulatedApplication.get({ context, application }); expect(result.business.id).toEqual(application.business.id); expect(result.broker.id).toEqual(application.broker.id); @@ -55,7 +55,7 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with populated buyer', async () => { - const result = await getPopulatedApplication({ context, application }); + const result = await getPopulatedApplication.get({ context, application }); const [expectedCountry] = mockCountries; @@ -71,7 +71,7 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with populated company', async () => { - const result = await getPopulatedApplication({ context, application }); + const result = await getPopulatedApplication.get({ context, application }); expect(result.company.id).toEqual(application.company.id); expect(result.companySicCodes[0].companyId).toEqual(application.company.id); @@ -84,7 +84,7 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with populated nominatedLossPayee with decrypted data by default', async () => { - const result = await getPopulatedApplication({ context, application }); + const result = await getPopulatedApplication.get({ context, application }); const decryptFinancialUk = false; const decryptFinancialInternational = false; @@ -95,7 +95,7 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with mapped policy data', async () => { - const result = await getPopulatedApplication({ context, application }); + const result = await getPopulatedApplication.get({ context, application }); const expected = mapPolicy({ ...application.policy, @@ -106,7 +106,7 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with populated answers and finalDestinationCountry object in exportContract', async () => { - const result = await getPopulatedApplication({ context, application }); + const result = await getPopulatedApplication.get({ context, application }); const { exportContract } = mockApplication; @@ -120,7 +120,7 @@ describe('api/helpers/get-populated-application', () => { }); it('should return an application with populated sectionReview', async () => { - const result = await getPopulatedApplication({ context, application }); + const result = await getPopulatedApplication.get({ context, application }); expect(result.sectionReview.id).toEqual(application.sectionReviewId); }); diff --git a/src/api/helpers/get-populated-application/index.ts b/src/api/helpers/get-populated-application/index.ts index e3b94ce9a5..21c79343b3 100644 --- a/src/api/helpers/get-populated-application/index.ts +++ b/src/api/helpers/get-populated-application/index.ts @@ -93,12 +93,7 @@ const getPopulatedApplication = async ({ throw new Error(generateErrorMessage('policyContact', application.id)); } - const nominatedLossPayee = await getNominatedLossPayee( - context, - nominatedLossPayeeId, - decryptFinancialUk, - decryptFinancialInternational, - ); + const nominatedLossPayee = await getNominatedLossPayee(context, nominatedLossPayeeId, decryptFinancialUk, decryptFinancialInternational); const populatedPolicy = mapPolicy(policy); @@ -257,4 +252,8 @@ const getPopulatedApplication = async ({ return populatedApplication; }; -export default getPopulatedApplication; +const populatedApplication = { + get: getPopulatedApplication, +}; + +export default populatedApplication; diff --git a/src/api/test-helpers/generate-submitted-application.ts b/src/api/test-helpers/generate-submitted-application.ts index 99c9681621..6f8377229d 100644 --- a/src/api/test-helpers/generate-submitted-application.ts +++ b/src/api/test-helpers/generate-submitted-application.ts @@ -16,7 +16,7 @@ export const generateSubmittedApplication = async () => { const application = mapApplicationIds(fullApplication); - const populatedApplication = await getPopulatedApplication({ context, application }); + const populatedApplication = await getPopulatedApplication.get({ context, application }); const submittedApplication = { ...populatedApplication, From 4cf5d35e91c8cba791910b0adba3853671eb62c1 Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Wed, 12 Jun 2024 11:09:58 +0100 Subject: [PATCH 09/12] feat(EMS-3342): minor code/test improvements --- src/api/helpers/create-a-broker/index.test.ts | 19 ++----------------- .../nominated-loss-payee/index.ts | 13 +++++-------- 2 files changed, 7 insertions(+), 25 deletions(-) diff --git a/src/api/helpers/create-a-broker/index.test.ts b/src/api/helpers/create-a-broker/index.test.ts index bb5a0be17c..12e4494b1b 100644 --- a/src/api/helpers/create-a-broker/index.test.ts +++ b/src/api/helpers/create-a-broker/index.test.ts @@ -3,12 +3,6 @@ import { Application, Context } from '../../types'; import getKeystoneContext from '../../test-helpers/get-keystone-context'; import applications from '../../test-helpers/applications'; -const assertError = (err) => { - const errorString = String(err); - - expect(errorString.includes('Creating a broker')).toEqual(true); -}; - describe('helpers/create-a-broker', () => { let context: Context; let application: Application; @@ -39,22 +33,13 @@ describe('helpers/create-a-broker', () => { describe('when an invalid application ID is passed', () => { test('it should throw an error', async () => { - try { - await createABroker(context, 'invalid-id'); - } catch (err) { - assertError(err); - } + await expect(createABroker(context, 'invalid-id')).rejects.toThrow('Creating a broker'); }); }); describe('when creation is not successful', () => { test('it should throw an error', async () => { - try { - // pass empty context object to force an error - await createABroker({}, application.id); - } catch (err) { - assertError(err); - } + await expect(createABroker({}, application.id)).rejects.toThrow('Creating a broker'); }); }); }); diff --git a/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts b/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts index 019b6eff43..f723efa695 100644 --- a/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts +++ b/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts @@ -7,22 +7,19 @@ import { ApplicationNominatedLossPayee } from '../../../types'; * Get an application's nominated loss payee by ID * @param {Context} KeystoneJS context API * @param {String} lossPayeeId: Loss payee ID + * @param {Boolean} decryptFinancialUk: should financialUk data be decrypted + * @param {Boolean} decryptFinancialInternational: should financialInternational data be decrypted * @returns {ApplicationPolicy} mapped policy */ -const getNominatedLossPayee = async ( - context: Context, - lossPayeeId: string, - decryptFinancialUk?: boolean, - decryptFinancialInternational?: boolean, -) => { +const getNominatedLossPayee = async (context: Context, lossPayeeId: string, decryptFinancialUk?: boolean, decryptFinancialInternational?: boolean) => { try { console.info(`Getting nominated loss payee ${lossPayeeId}`); - const nominatedLossPayee = await context.query.NominatedLossPayee.findOne({ + const nominatedLossPayee = (await context.query.NominatedLossPayee.findOne({ where: { id: lossPayeeId }, query: 'id isAppointed isLocatedInUk isLocatedInternationally name financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } }', - }) as ApplicationNominatedLossPayee; + })) as ApplicationNominatedLossPayee; if (decryptFinancialUk && decryptFinancialInternational) { const decryptedNominatedLossPayee = decryptNominatedLossPayee(nominatedLossPayee, decryptFinancialUk, decryptFinancialInternational); From 0ca9cdbcd5a2a5f4d1a4371d3626865946fff0f3 Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Wed, 12 Jun 2024 11:23:11 +0100 Subject: [PATCH 10/12] feat(EMS-3342): fix test helper types --- src/api/.keystone/config.js | 7 +------ .../index.test.ts | 2 +- src/api/test-helpers/nominated-loss-payee.ts | 12 +++++------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/api/.keystone/config.js b/src/api/.keystone/config.js index 2ce38af33a..a1dd7924ea 100644 --- a/src/api/.keystone/config.js +++ b/src/api/.keystone/config.js @@ -5076,12 +5076,7 @@ var getPopulatedApplication = async ({ if (!policyContact) { throw new Error(generateErrorMessage("policyContact", application2.id)); } - const nominatedLossPayee = await nominated_loss_payee_default( - context, - nominatedLossPayeeId, - decryptFinancialUk2, - decryptFinancialInternational2 - ); + const nominatedLossPayee = await nominated_loss_payee_default(context, nominatedLossPayeeId, decryptFinancialUk2, decryptFinancialInternational2); const populatedPolicy = map_policy_default(policy); const exportContract = await context.db.ExportContract.findOne({ where: { id: exportContractId } diff --git a/src/api/custom-resolvers/queries/get-application-by-reference-number/index.test.ts b/src/api/custom-resolvers/queries/get-application-by-reference-number/index.test.ts index f08017b592..2ae2a970b3 100644 --- a/src/api/custom-resolvers/queries/get-application-by-reference-number/index.test.ts +++ b/src/api/custom-resolvers/queries/get-application-by-reference-number/index.test.ts @@ -1,4 +1,4 @@ -import { Application as KeystoneApplication, Context } from '.keystone/types'; // eslint-disable-line +import { Context } from '.keystone/types'; // eslint-disable-line import getApplicationByReferenceNumberQuery from '.'; import getApplicationByReferenceNumber from '../../../helpers/get-application-by-reference-number'; import getPopulatedApplication from '../../../helpers/get-populated-application'; diff --git a/src/api/test-helpers/nominated-loss-payee.ts b/src/api/test-helpers/nominated-loss-payee.ts index ed39dde843..2b12faa2c9 100644 --- a/src/api/test-helpers/nominated-loss-payee.ts +++ b/src/api/test-helpers/nominated-loss-payee.ts @@ -1,7 +1,6 @@ import createLossPayeeFinancialDetailsUk from './loss-payee-financial-uk'; import createLossPayeeFinancialDetailsInternational from './loss-payee-financial-international'; - -import { ApplicationNominatedLossPayee, TestHelperCreate } from '../types'; +import { ApplicationNominatedLossPayee, ApplicationLossPayeeFinancialUk, ApplicationLossPayeeFinancialInternational, TestHelperCreate } from '../types'; /** * create a nominated loss payee financial uk helper @@ -13,25 +12,24 @@ const createNominatedLossPayee = async ({ context }: TestHelperCreate) => { try { console.info('Creating a nominated loss payee (test helpers)'); - const financialUk = await createLossPayeeFinancialDetailsUk({ context }); - const financialInternational = await createLossPayeeFinancialDetailsInternational({ context }); + const financialUk = (await createLossPayeeFinancialDetailsUk({ context })) as ApplicationLossPayeeFinancialUk; + const financialInternational = (await createLossPayeeFinancialDetailsInternational({ context })) as ApplicationLossPayeeFinancialInternational; const lossPayee = (await context.query.NominatedLossPayee.createOne({ data: { financialUk: { connect: { - // TODO: fix types id: financialUk.id, }, }, financialInternational: { connect: { - // TODO: fix types id: financialInternational.id, }, }, }, - query: 'id financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } } financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } isAppointed isLocatedInUk isLocatedInternationally name', + query: + 'id financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } } financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } isAppointed isLocatedInUk isLocatedInternationally name', })) as ApplicationNominatedLossPayee; const created = { From 87de5289c8007c776f4b679a33dac0208a0d1c16 Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Wed, 12 Jun 2024 11:37:49 +0100 Subject: [PATCH 11/12] feat(EMS-3342): fix/update nominated loss payee decryption condition --- src/api/.keystone/config.js | 2 +- .../nominated-loss-payee/index.test.ts | 27 ++++++++++++++----- .../nominated-loss-payee/index.ts | 2 +- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/api/.keystone/config.js b/src/api/.keystone/config.js index a1dd7924ea..8a59c75143 100644 --- a/src/api/.keystone/config.js +++ b/src/api/.keystone/config.js @@ -5006,7 +5006,7 @@ var getNominatedLossPayee = async (context, lossPayeeId, decryptFinancialUk2, de where: { id: lossPayeeId }, query: "id isAppointed isLocatedInUk isLocatedInternationally name financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } }" }); - if (decryptFinancialUk2 && decryptFinancialInternational2) { + if (decryptFinancialUk2 || decryptFinancialInternational2) { const decryptedNominatedLossPayee = decrypt_nominated_loss_payee_default(nominatedLossPayee, decryptFinancialUk2, decryptFinancialInternational2); return decryptedNominatedLossPayee; } diff --git a/src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts b/src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts index ee9729f9cd..e43f8c0b48 100644 --- a/src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts +++ b/src/api/helpers/get-populated-application/nominated-loss-payee/index.test.ts @@ -20,17 +20,30 @@ describe('api/helpers/get-populated-application/nominated-loss-payee', () => { expect(result).toEqual(lossPayee); }); - describe('when decryptFinancialUk and decryptFinancialInternational are provided', () => { + describe('when decryptFinancialUk is provided', () => { it('should return a nominated loss payee with decrypted data', async () => { const decryptFinancialUk = true; + const decryptFinancialInternational = false; + + const result = await getNominatedLossPayee(context, lossPayee.id, decryptFinancialUk, decryptFinancialInternational); + + const decrypted = decryptNominatedLossPayee(lossPayee, decryptFinancialUk, decryptFinancialInternational); + + const expected = { + ...lossPayee, + ...decrypted, + }; + + expect(result).toEqual(expected); + }); + }); + + describe('when decryptFinancialInternational is provided', () => { + it('should return a nominated loss payee with decrypted data', async () => { + const decryptFinancialUk = false; const decryptFinancialInternational = true; - const result = await getNominatedLossPayee( - context, - lossPayee.id, - decryptFinancialUk, - decryptFinancialInternational, - ); + const result = await getNominatedLossPayee(context, lossPayee.id, decryptFinancialUk, decryptFinancialInternational); const decrypted = decryptNominatedLossPayee(lossPayee, decryptFinancialUk, decryptFinancialInternational); diff --git a/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts b/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts index f723efa695..2823cf1e06 100644 --- a/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts +++ b/src/api/helpers/get-populated-application/nominated-loss-payee/index.ts @@ -21,7 +21,7 @@ const getNominatedLossPayee = async (context: Context, lossPayeeId: string, decr 'id isAppointed isLocatedInUk isLocatedInternationally name financialUk { id accountNumber sortCode bankAddress vector { accountNumberVector sortCodeVector } } financialInternational { id iban bicSwiftCode bankAddress vector { bicSwiftCodeVector ibanVector } }', })) as ApplicationNominatedLossPayee; - if (decryptFinancialUk && decryptFinancialInternational) { + if (decryptFinancialUk || decryptFinancialInternational) { const decryptedNominatedLossPayee = decryptNominatedLossPayee(nominatedLossPayee, decryptFinancialUk, decryptFinancialInternational); return decryptedNominatedLossPayee; From bbeb51792a54522b9f5003ec21a45bccd6d553f5 Mon Sep 17 00:00:00 2001 From: ttbarnes Date: Wed, 12 Jun 2024 12:59:08 +0100 Subject: [PATCH 12/12] feat(EMS-3342): fix typo --- .../update-loss-payee-financial-details-uk/index.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-uk/index.test.ts b/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-uk/index.test.ts index cbaf5f740a..511d0cd754 100644 --- a/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-uk/index.test.ts +++ b/src/api/custom-resolvers/mutations/update-loss-payee-financial-details-uk/index.test.ts @@ -57,7 +57,7 @@ describe('custom-resolvers/update-loss-payee-financial-details-uk', () => { }); }); - describe('when an error occurs whilst updating loss payee financial international vector', () => { + describe('when an error occurs whilst updating loss payee financial uk vector', () => { it('should throw an error', async () => { /** * Delete the LossPayeeFinancialUkVector relationship,