From 80508fd2888ba5d13ede13edb7671a1cd52426ed Mon Sep 17 00:00:00 2001 From: Zain Kassam Date: Wed, 22 Jan 2025 17:15:21 +0000 Subject: [PATCH 1/8] feat(FN-3691): added cron job to delete old correction transient form data --- .env.sample | 2 ++ docker-compose.yml | 1 + .../index.ts | 29 +++++++++++++++++++ .../src/cron-scheduler-jobs/index.ts | 8 ++++- ...ection-request-transient-form-data.repo.ts | 14 ++++++++- 5 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 dtfs-central-api/src/cron-scheduler-jobs/delete-transient-record-correction-requests/index.ts diff --git a/.env.sample b/.env.sample index 05a0d97a39..f2b5781bde 100644 --- a/.env.sample +++ b/.env.sample @@ -67,6 +67,8 @@ UTILISATION_REPORT_CREATION_FAILURE_EMAIL_ADDRESS= DEAL_CANCELLATION_SCHEDULE='* 2 * * *' +RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE='* 2 * * *' + # STORAGE AZURE_PORTAL_STORAGE_ACCOUNT= AZURE_PORTAL_STORAGE_ACCESS_KEY= diff --git a/docker-compose.yml b/docker-compose.yml index a7b02f3730..a1c63d95b8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -89,6 +89,7 @@ services: - FF_TFM_DEAL_CANCELLATION_ENABLED - DEAL_CANCELLATION_SCHEDULE - FF_PORTAL_FACILITY_AMENDMENTS_ENABLED + - RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE trade-finance-manager-ui: build: diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-transient-record-correction-requests/index.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-transient-record-correction-requests/index.ts new file mode 100644 index 0000000000..4292ad9a22 --- /dev/null +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-transient-record-correction-requests/index.ts @@ -0,0 +1,29 @@ +import { asString, CronSchedulerJob } from '@ukef/dtfs2-common'; +import { FeeRecordCorrectionRequestTransientFormDataRepo } from '../../repositories/fee-record-correction-request-transient-form-data-repo'; + +const { RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE } = process.env; + +/** + * Gets and deletes record correction request transient form data if older than 1 day + * gets all from the database which are older than 1 day + * returns if none found + * gets an array of feeIds + * deletes transient form data based on provided ids + */ +const deleteOldRecordCorrectionRequestTransientFormData = async (): Promise => { + try { + console.info('Getting and deleting old transient record correction requests - deleteOldRecordCorrectionRequestTransientFormData CRON job'); + + await FeeRecordCorrectionRequestTransientFormDataRepo.deleteAllOlderThanOneDay(); + } catch (error) { + console.error('Error deleting old transient record correction requests - deleteOldRecordCorrectionRequestTransientFormData CRON job: %o', error); + + throw error; + } +}; + +export const deleteTransientRecordCorrectionRequestsJob: CronSchedulerJob = { + cronExpression: asString(RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE, 'RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE'), + description: 'Delete record correction transient form data', + task: deleteOldRecordCorrectionRequestTransientFormData, +}; diff --git a/dtfs-central-api/src/cron-scheduler-jobs/index.ts b/dtfs-central-api/src/cron-scheduler-jobs/index.ts index 1cae86ec69..b2d18d5989 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/index.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/index.ts @@ -2,5 +2,11 @@ import { CronSchedulerJob } from '@ukef/dtfs2-common'; import { createUtilisationReportForBanksJob } from './create-utilisation-reports'; import { deleteCompleteAcbsDurableFunctionLogsJob } from './delete-acbs-durable-function-logs'; import { cancelDealJob } from './deal-cancellation/cancel-deal-job'; +import { deleteTransientRecordCorrectionRequestsJob } from './delete-transient-record-correction-requests'; -export const cronSchedulerJobs: CronSchedulerJob[] = [createUtilisationReportForBanksJob, deleteCompleteAcbsDurableFunctionLogsJob, cancelDealJob]; +export const cronSchedulerJobs: CronSchedulerJob[] = [ + createUtilisationReportForBanksJob, + deleteCompleteAcbsDurableFunctionLogsJob, + cancelDealJob, + deleteTransientRecordCorrectionRequestsJob, +]; diff --git a/dtfs-central-api/src/repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo.ts b/dtfs-central-api/src/repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo.ts index 259a1b16dc..b43c5d91a9 100644 --- a/dtfs-central-api/src/repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo.ts +++ b/dtfs-central-api/src/repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo.ts @@ -1,6 +1,6 @@ import { SqlDbDataSource } from '@ukef/dtfs2-common/sql-db-connection'; import { FeeRecordCorrectionRequestTransientFormDataEntity } from '@ukef/dtfs2-common'; -import { EntityManager } from 'typeorm'; +import { EntityManager, LessThan } from 'typeorm'; /** * Repository for managing fee record correction request transient form data. @@ -34,6 +34,18 @@ export const FeeRecordCorrectionRequestTransientFormDataRepo = SqlDbDataSource.g }); }, + /** + * deletes the transient form data which is older than a day old + */ + async deleteAllOlderThanOneDay(): Promise { + const today = new Date(); + const oneDayAgo = today.setDate(today.getDate() - 1); + + await this.delete({ + lastUpdatedAt: LessThan(new Date(oneDayAgo)), + }); + }, + withTransaction(transactionEntityManager: EntityManager) { const transactionRepository = transactionEntityManager.getRepository(FeeRecordCorrectionRequestTransientFormDataEntity); From 0db0922596e02088764aa6345a8cbbc1a7292ff4 Mon Sep 17 00:00:00 2001 From: Zain Kassam Date: Thu, 23 Jan 2025 10:42:14 +0000 Subject: [PATCH 2/8] feat(FN-3691): added tests --- .env.sample | 2 +- .../index.test.ts | 51 +++++++++++++++++++ .../index.ts | 8 +-- .../src/cron-scheduler-jobs/index.ts | 4 +- 4 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts rename dtfs-central-api/src/cron-scheduler-jobs/{delete-transient-record-correction-requests => delete-record-correction-request-transient-form-data}/index.ts (78%) diff --git a/.env.sample b/.env.sample index f2b5781bde..d20ff81e16 100644 --- a/.env.sample +++ b/.env.sample @@ -67,7 +67,7 @@ UTILISATION_REPORT_CREATION_FAILURE_EMAIL_ADDRESS= DEAL_CANCELLATION_SCHEDULE='* 2 * * *' -RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE='* 2 * * *' +RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE='0 2 * * *' # STORAGE AZURE_PORTAL_STORAGE_ACCOUNT= diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts new file mode 100644 index 0000000000..fbd7a81fc4 --- /dev/null +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts @@ -0,0 +1,51 @@ +import { deleteRecordCorrectionRequestTransientFormData, deleteRecordCorrectionRequestTransientFormDataJob } from '.'; +import { FeeRecordCorrectionRequestTransientFormDataRepo } from '../../repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo'; + +describe('delete-transient-record-correction-requests', () => { + const mockDelete = jest.fn(); + + beforeEach(() => { + jest.resetAllMocks(); + FeeRecordCorrectionRequestTransientFormDataRepo.deleteAllOlderThanOneDay = mockDelete; + }); + + describe('deleteOldRecordCorrectionRequestTransientFormData', () => { + it('should delete records older than one day', async () => { + await deleteRecordCorrectionRequestTransientFormData(); + + expect(mockDelete).toHaveBeenCalledTimes(1); + }); + + it('should log an error if deletion fails', async () => { + const errorMessage = 'This is an error'; + const error = new Error(errorMessage); + jest.mocked(mockDelete).mockRejectedValue(error); + + // Act + await expect(deleteRecordCorrectionRequestTransientFormData()).rejects.toThrow(Error); + }); + }); + + describe('deleteRecordCorrectionRequestTransientFormDataJob', () => { + beforeEach(() => { + jest.resetAllMocks(); + FeeRecordCorrectionRequestTransientFormDataRepo.deleteAllOlderThanOneDay = mockDelete; + }); + + it('should be scheduled to run', () => { + expect(deleteRecordCorrectionRequestTransientFormDataJob.cronExpression).toEqual(process.env.RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE); + }); + + it('should have the correct description', () => { + expect(deleteRecordCorrectionRequestTransientFormDataJob.description).toEqual('Delete record correction transient form data older than 1 day'); + }); + + it('should call findPendingDealCancellations', async () => { + // Act + await deleteRecordCorrectionRequestTransientFormDataJob.task('manual'); + + // Assert + expect(mockDelete).toHaveBeenCalledTimes(1); + }); + }); +}); diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-transient-record-correction-requests/index.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts similarity index 78% rename from dtfs-central-api/src/cron-scheduler-jobs/delete-transient-record-correction-requests/index.ts rename to dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts index 4292ad9a22..a491518537 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/delete-transient-record-correction-requests/index.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts @@ -10,7 +10,7 @@ const { RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE } = process.env; * gets an array of feeIds * deletes transient form data based on provided ids */ -const deleteOldRecordCorrectionRequestTransientFormData = async (): Promise => { +export const deleteRecordCorrectionRequestTransientFormData = async (): Promise => { try { console.info('Getting and deleting old transient record correction requests - deleteOldRecordCorrectionRequestTransientFormData CRON job'); @@ -22,8 +22,8 @@ const deleteOldRecordCorrectionRequestTransientFormData = async (): Promise Date: Thu, 23 Jan 2025 10:46:33 +0000 Subject: [PATCH 3/8] feat(FN-3691): fix typo --- .../index.test.ts | 4 ++-- .../index.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts index fbd7a81fc4..7a0ddee275 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts @@ -1,7 +1,7 @@ import { deleteRecordCorrectionRequestTransientFormData, deleteRecordCorrectionRequestTransientFormDataJob } from '.'; import { FeeRecordCorrectionRequestTransientFormDataRepo } from '../../repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo'; -describe('delete-transient-record-correction-requests', () => { +describe('delete-record-correction-request-transient-form-data', () => { const mockDelete = jest.fn(); beforeEach(() => { @@ -9,7 +9,7 @@ describe('delete-transient-record-correction-requests', () => { FeeRecordCorrectionRequestTransientFormDataRepo.deleteAllOlderThanOneDay = mockDelete; }); - describe('deleteOldRecordCorrectionRequestTransientFormData', () => { + describe('deleteRecordCorrectionRequestTransientFormData', () => { it('should delete records older than one day', async () => { await deleteRecordCorrectionRequestTransientFormData(); diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts index a491518537..b7d6491b15 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts @@ -12,11 +12,11 @@ const { RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE } = process.env; */ export const deleteRecordCorrectionRequestTransientFormData = async (): Promise => { try { - console.info('Getting and deleting old transient record correction requests - deleteOldRecordCorrectionRequestTransientFormData CRON job'); + console.info('Getting and deleting old transient record correction requests - deleteRecordCorrectionRequestTransientFormDataJob CRON job'); await FeeRecordCorrectionRequestTransientFormDataRepo.deleteAllOlderThanOneDay(); } catch (error) { - console.error('Error deleting old transient record correction requests - deleteOldRecordCorrectionRequestTransientFormData CRON job: %o', error); + console.error('Error deleting old transient record correction requests - deleteRecordCorrectionRequestTransientFormDataJob CRON job: %o', error); throw error; } From fc62ae8dd0c0a51546ff2a120531c1d2fa970811 Mon Sep 17 00:00:00 2001 From: Zain Kassam Date: Thu, 23 Jan 2025 13:08:01 +0000 Subject: [PATCH 4/8] feat(FN-3691): review markups --- .../index.test.ts | 27 ++++++++++++++++--- .../index.ts | 2 +- ...ection-request-transient-form-data.repo.ts | 2 +- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts index 7a0ddee275..bffa2a57ce 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts @@ -1,22 +1,34 @@ +import { LessThan } from 'typeorm'; import { deleteRecordCorrectionRequestTransientFormData, deleteRecordCorrectionRequestTransientFormDataJob } from '.'; import { FeeRecordCorrectionRequestTransientFormDataRepo } from '../../repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo'; describe('delete-record-correction-request-transient-form-data', () => { + jest.mock('typeorm', () => ({ + LessThan: jest.fn(), + })); + const mockDelete = jest.fn(); beforeEach(() => { jest.resetAllMocks(); - FeeRecordCorrectionRequestTransientFormDataRepo.deleteAllOlderThanOneDay = mockDelete; + FeeRecordCorrectionRequestTransientFormDataRepo.delete = mockDelete; }); describe('deleteRecordCorrectionRequestTransientFormData', () => { it('should delete records older than one day', async () => { await deleteRecordCorrectionRequestTransientFormData(); + const today = new Date(); + const oneDayAgo = today.setDate(today.getDate() - 1); + expect(mockDelete).toHaveBeenCalledTimes(1); + + expect(mockDelete).toHaveBeenCalledWith({ + lastUpdatedAt: LessThan(new Date(oneDayAgo)), + }); }); - it('should log an error if deletion fails', async () => { + it('should throw an error if deletion fails', async () => { const errorMessage = 'This is an error'; const error = new Error(errorMessage); jest.mocked(mockDelete).mockRejectedValue(error); @@ -29,7 +41,7 @@ describe('delete-record-correction-request-transient-form-data', () => { describe('deleteRecordCorrectionRequestTransientFormDataJob', () => { beforeEach(() => { jest.resetAllMocks(); - FeeRecordCorrectionRequestTransientFormDataRepo.deleteAllOlderThanOneDay = mockDelete; + FeeRecordCorrectionRequestTransientFormDataRepo.delete = mockDelete; }); it('should be scheduled to run', () => { @@ -40,12 +52,19 @@ describe('delete-record-correction-request-transient-form-data', () => { expect(deleteRecordCorrectionRequestTransientFormDataJob.description).toEqual('Delete record correction transient form data older than 1 day'); }); - it('should call findPendingDealCancellations', async () => { + it('should call FeeRecordCorrectionRequestTransientFormDataRepo.deleteAllOlderThanOneDay', async () => { // Act await deleteRecordCorrectionRequestTransientFormDataJob.task('manual'); + const today = new Date(); + const oneDayAgo = today.setDate(today.getDate() - 1); + // Assert expect(mockDelete).toHaveBeenCalledTimes(1); + + expect(mockDelete).toHaveBeenCalledWith({ + lastUpdatedAt: LessThan(new Date(oneDayAgo)), + }); }); }); }); diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts index b7d6491b15..c9010d741d 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts @@ -14,7 +14,7 @@ export const deleteRecordCorrectionRequestTransientFormData = async (): Promise< try { console.info('Getting and deleting old transient record correction requests - deleteRecordCorrectionRequestTransientFormDataJob CRON job'); - await FeeRecordCorrectionRequestTransientFormDataRepo.deleteAllOlderThanOneDay(); + await FeeRecordCorrectionRequestTransientFormDataRepo.deleteByLastUpdatedOlderThanOneDayAgo(); } catch (error) { console.error('Error deleting old transient record correction requests - deleteRecordCorrectionRequestTransientFormDataJob CRON job: %o', error); diff --git a/dtfs-central-api/src/repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo.ts b/dtfs-central-api/src/repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo.ts index b43c5d91a9..94e5adeee0 100644 --- a/dtfs-central-api/src/repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo.ts +++ b/dtfs-central-api/src/repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo.ts @@ -37,7 +37,7 @@ export const FeeRecordCorrectionRequestTransientFormDataRepo = SqlDbDataSource.g /** * deletes the transient form data which is older than a day old */ - async deleteAllOlderThanOneDay(): Promise { + async deleteByLastUpdatedOlderThanOneDayAgo(): Promise { const today = new Date(); const oneDayAgo = today.setDate(today.getDate() - 1); From d1ea5e0d174fe0f123eaaa374f6e52b1344c1147 Mon Sep 17 00:00:00 2001 From: Zain Kassam Date: Thu, 23 Jan 2025 13:14:03 +0000 Subject: [PATCH 5/8] feat(FN-3691): added to test.yml --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bb0034776a..57c740d3f4 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -167,6 +167,7 @@ env: ENTRA_ID_CLIENT_SECRET: ${{ vars.ENTRA_ID_CLIENT_SECRET }} ENTRA_ID_REDIRECT_URL: ${{ vars.ENTRA_ID_REDIRECT_URL }} DEAL_CANCELLATION_SCHEDULE: ${{ vars.DEAL_CANCELLATION_SCHEDULE }} + RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE: ${{ vars.RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE }} jobs: # 1. Setup test infrastructure From c811d68b1c65b1beb5a0795b860e622a98d0acd9 Mon Sep 17 00:00:00 2001 From: Zain Kassam Date: Fri, 24 Jan 2025 16:37:39 +0000 Subject: [PATCH 6/8] feat(FN-3691): used fakeTimers in test --- .../index.test.ts | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts index bffa2a57ce..6f9e229e9c 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts @@ -9,22 +9,33 @@ describe('delete-record-correction-request-transient-form-data', () => { const mockDelete = jest.fn(); + beforeAll(() => { + jest.useFakeTimers(); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + beforeEach(() => { jest.resetAllMocks(); FeeRecordCorrectionRequestTransientFormDataRepo.delete = mockDelete; }); describe('deleteRecordCorrectionRequestTransientFormData', () => { + beforeEach(() => { + jest.resetAllMocks(); + FeeRecordCorrectionRequestTransientFormDataRepo.delete = mockDelete; + jest.useFakeTimers().setSystemTime(new Date('2025-01-02 12:10:00')); + }); + it('should delete records older than one day', async () => { await deleteRecordCorrectionRequestTransientFormData(); - const today = new Date(); - const oneDayAgo = today.setDate(today.getDate() - 1); - expect(mockDelete).toHaveBeenCalledTimes(1); expect(mockDelete).toHaveBeenCalledWith({ - lastUpdatedAt: LessThan(new Date(oneDayAgo)), + lastUpdatedAt: LessThan(new Date('2025-01-01:12:10:00')), }); }); @@ -42,6 +53,7 @@ describe('delete-record-correction-request-transient-form-data', () => { beforeEach(() => { jest.resetAllMocks(); FeeRecordCorrectionRequestTransientFormDataRepo.delete = mockDelete; + jest.useFakeTimers().setSystemTime(new Date('2025-01-02 12:10:00')); }); it('should be scheduled to run', () => { @@ -56,14 +68,11 @@ describe('delete-record-correction-request-transient-form-data', () => { // Act await deleteRecordCorrectionRequestTransientFormDataJob.task('manual'); - const today = new Date(); - const oneDayAgo = today.setDate(today.getDate() - 1); - // Assert expect(mockDelete).toHaveBeenCalledTimes(1); expect(mockDelete).toHaveBeenCalledWith({ - lastUpdatedAt: LessThan(new Date(oneDayAgo)), + lastUpdatedAt: LessThan(new Date('2025-01-01:12:10:00')), }); }); }); From 132a4b6f1d7b03b1f8692fa887fc75a344a1bd85 Mon Sep 17 00:00:00 2001 From: Zain Kassam Date: Mon, 27 Jan 2025 10:48:33 +0000 Subject: [PATCH 7/8] feat(FN-3691): rename and add tests and remove throw error --- .../index.test.ts | 34 ++++++++++++++----- .../index.ts | 12 +++---- .../src/cron-scheduler-jobs/index.ts | 4 +-- 3 files changed, 33 insertions(+), 17 deletions(-) rename dtfs-central-api/src/cron-scheduler-jobs/{delete-record-correction-request-transient-form-data => delete-correction-request-transient-form-data}/index.test.ts (61%) rename dtfs-central-api/src/cron-scheduler-jobs/{delete-record-correction-request-transient-form-data => delete-correction-request-transient-form-data}/index.ts (71%) diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.test.ts similarity index 61% rename from dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts rename to dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.test.ts index 6f9e229e9c..c3f872fdc8 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.test.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.test.ts @@ -1,5 +1,5 @@ import { LessThan } from 'typeorm'; -import { deleteRecordCorrectionRequestTransientFormData, deleteRecordCorrectionRequestTransientFormDataJob } from '.'; +import { deleteCorrectionRequestTransientFormData, deleteCorrectionRequestTransientFormDataJob } from '.'; import { FeeRecordCorrectionRequestTransientFormDataRepo } from '../../repositories/fee-record-correction-request-transient-form-data-repo/fee-record-correction-request-transient-form-data.repo'; describe('delete-record-correction-request-transient-form-data', () => { @@ -8,6 +8,7 @@ describe('delete-record-correction-request-transient-form-data', () => { })); const mockDelete = jest.fn(); + console.error = jest.fn(); beforeAll(() => { jest.useFakeTimers(); @@ -30,7 +31,7 @@ describe('delete-record-correction-request-transient-form-data', () => { }); it('should delete records older than one day', async () => { - await deleteRecordCorrectionRequestTransientFormData(); + await deleteCorrectionRequestTransientFormData(); expect(mockDelete).toHaveBeenCalledTimes(1); @@ -39,13 +40,30 @@ describe('delete-record-correction-request-transient-form-data', () => { }); }); + it('should delete records older than one day if it is the first day of the month', async () => { + jest.useFakeTimers().setSystemTime(new Date('2025-01-01 12:10:00')); + + await deleteCorrectionRequestTransientFormData(); + + expect(mockDelete).toHaveBeenCalledTimes(1); + + expect(mockDelete).toHaveBeenCalledWith({ + lastUpdatedAt: LessThan(new Date('2024-12-31:12:10:00')), + }); + }); + it('should throw an error if deletion fails', async () => { const errorMessage = 'This is an error'; const error = new Error(errorMessage); jest.mocked(mockDelete).mockRejectedValue(error); - // Act - await expect(deleteRecordCorrectionRequestTransientFormData()).rejects.toThrow(Error); + await deleteCorrectionRequestTransientFormData(); + + expect(console.error).toHaveBeenCalledTimes(1); + expect(console.error).toHaveBeenCalledWith( + 'Error deleting old transient record correction requests - deleteCorrectionRequestTransientFormDataJob CRON job: %o', + error, + ); }); }); @@ -57,16 +75,16 @@ describe('delete-record-correction-request-transient-form-data', () => { }); it('should be scheduled to run', () => { - expect(deleteRecordCorrectionRequestTransientFormDataJob.cronExpression).toEqual(process.env.RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE); + expect(deleteCorrectionRequestTransientFormDataJob.cronExpression).toEqual(process.env.RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE); }); it('should have the correct description', () => { - expect(deleteRecordCorrectionRequestTransientFormDataJob.description).toEqual('Delete record correction transient form data older than 1 day'); + expect(deleteCorrectionRequestTransientFormDataJob.description).toEqual('Delete record correction transient form data older than 1 day'); }); - it('should call FeeRecordCorrectionRequestTransientFormDataRepo.deleteAllOlderThanOneDay', async () => { + it('should call FeeRecordCorrectionRequestTransientFormDataRepo.delete', async () => { // Act - await deleteRecordCorrectionRequestTransientFormDataJob.task('manual'); + await deleteCorrectionRequestTransientFormDataJob.task('manual'); // Assert expect(mockDelete).toHaveBeenCalledTimes(1); diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.ts similarity index 71% rename from dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts rename to dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.ts index c9010d741d..9374a403e2 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/delete-record-correction-request-transient-form-data/index.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.ts @@ -10,20 +10,18 @@ const { RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE } = process.env; * gets an array of feeIds * deletes transient form data based on provided ids */ -export const deleteRecordCorrectionRequestTransientFormData = async (): Promise => { +export const deleteCorrectionRequestTransientFormData = async (): Promise => { try { - console.info('Getting and deleting old transient record correction requests - deleteRecordCorrectionRequestTransientFormDataJob CRON job'); + console.info('Getting and deleting old transient record correction requests - deleteCorrectionRequestTransientFormDataJob CRON job'); await FeeRecordCorrectionRequestTransientFormDataRepo.deleteByLastUpdatedOlderThanOneDayAgo(); } catch (error) { - console.error('Error deleting old transient record correction requests - deleteRecordCorrectionRequestTransientFormDataJob CRON job: %o', error); - - throw error; + console.error('Error deleting old transient record correction requests - deleteCorrectionRequestTransientFormDataJob CRON job: %o', error); } }; -export const deleteRecordCorrectionRequestTransientFormDataJob: CronSchedulerJob = { +export const deleteCorrectionRequestTransientFormDataJob: CronSchedulerJob = { cronExpression: asString(RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE, 'RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE'), description: 'Delete record correction transient form data older than 1 day', - task: deleteRecordCorrectionRequestTransientFormData, + task: deleteCorrectionRequestTransientFormData, }; diff --git a/dtfs-central-api/src/cron-scheduler-jobs/index.ts b/dtfs-central-api/src/cron-scheduler-jobs/index.ts index c2c9725f63..c6d9de4e43 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/index.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/index.ts @@ -2,11 +2,11 @@ import { CronSchedulerJob } from '@ukef/dtfs2-common'; import { createUtilisationReportForBanksJob } from './create-utilisation-reports'; import { deleteCompleteAcbsDurableFunctionLogsJob } from './delete-acbs-durable-function-logs'; import { cancelDealJob } from './deal-cancellation/cancel-deal-job'; -import { deleteRecordCorrectionRequestTransientFormDataJob } from './delete-record-correction-request-transient-form-data'; +import { deleteCorrectionRequestTransientFormDataJob } from './delete-correction-request-transient-form-data'; export const cronSchedulerJobs: CronSchedulerJob[] = [ createUtilisationReportForBanksJob, deleteCompleteAcbsDurableFunctionLogsJob, cancelDealJob, - deleteRecordCorrectionRequestTransientFormDataJob, + deleteCorrectionRequestTransientFormDataJob, ]; From 6440994753f002b1ad4b1495aecf90a3f5b2f94b Mon Sep 17 00:00:00 2001 From: Zain Kassam Date: Mon, 27 Jan 2025 12:02:12 +0000 Subject: [PATCH 8/8] feat(FN-3691): review markups --- .../index.test.ts | 5 ----- .../delete-correction-request-transient-form-data/index.ts | 6 +----- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.test.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.test.ts index c3f872fdc8..629cdb99dd 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.test.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.test.ts @@ -18,11 +18,6 @@ describe('delete-record-correction-request-transient-form-data', () => { jest.useRealTimers(); }); - beforeEach(() => { - jest.resetAllMocks(); - FeeRecordCorrectionRequestTransientFormDataRepo.delete = mockDelete; - }); - describe('deleteRecordCorrectionRequestTransientFormData', () => { beforeEach(() => { jest.resetAllMocks(); diff --git a/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.ts b/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.ts index 9374a403e2..6eaf3234b6 100644 --- a/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.ts +++ b/dtfs-central-api/src/cron-scheduler-jobs/delete-correction-request-transient-form-data/index.ts @@ -4,11 +4,7 @@ import { FeeRecordCorrectionRequestTransientFormDataRepo } from '../../repositor const { RECORD_CORRECTION_TRANSIENT_FORM_DATA_DELETE_SCHEDULE } = process.env; /** - * Gets and deletes record correction request transient form data if older than 1 day - * gets all from the database which are older than 1 day - * returns if none found - * gets an array of feeIds - * deletes transient form data based on provided ids + * Deletes record correction request transient form data more than 1 day old */ export const deleteCorrectionRequestTransientFormData = async (): Promise => { try {