diff --git a/README.md b/README.md index 64663d1..0f04135 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,8 @@ Start the server |`JOB_DEFINITIONS_JOB_NEW` |Job name. |Ingestion_New | |`JOB_DEFINITIONS_JOB_UPDATE` |Job name. |Ingestion_Update | |`JOB_DEFINITIONS_JOB_SWAP_UPDATE` |Job name. |Ingestion_Swap_Update | +|`JOB_DEFINITIONS_JOB_UPDATE_DELETE_CACHE`|Job name. |Update_Delete_Cache | +|`JOB_DEFINITIONS_JOB_SWAP_DELETE_CACHE`|Job name. |Swap_Delete_Cache | |`JOB_DEFINITIONS_TASK_INIT` |Task name. |init | |`JOB_DEFINITIONS_TASK_MERGE` |Task name. |merge | |`JOB_DEFINITIONS_TASK_TILES_DELETION`|Task name. |tiles-deletion | diff --git a/config/custom-environment-variables.json b/config/custom-environment-variables.json index e527ae7..085ef77 100644 --- a/config/custom-environment-variables.json +++ b/config/custom-environment-variables.json @@ -68,7 +68,8 @@ "update": "JOB_DEFINITIONS_JOB_UPDATE", "swapUpdate": "JOB_DEFINITIONS_JOB_SWAP_UPDATE", "export": "JOB_DEFINITIONS_JOB_EXPORT", - "seed": "JOB_DEFINITIONS_JOB_SEED", + "updateCacheDeletion": "JOB_DEFINITIONS_JOB_UPDATE_DELETE_CACHE", + "swapCacheDeletion": "JOB_DEFINITIONS_JOB_SWAP_DELETE_CACHE", "deleteLayer": "JOB_DEFINITIONS_JOB_DELETE_LAYER" }, "tasks": { @@ -80,7 +81,6 @@ "polygonParts": "JOB_DEFINITIONS_TASK_POLYGON_PARTS", "export": "JOB_DEFINITIONS_TASK_EXPORT", "finalize": "JOB_DEFINITIONS_TASK_FINALIZE", - "seed": "JOB_DEFINITIONS_TASK_SEED", "delete": "JOB_DEFINITIONS_TASK_DELETE" }, "suspendingTaskTypes": { @@ -97,8 +97,8 @@ "__name": "EXPORT_TASKS_FLOW", "__format": "json" }, - "seedTasksFlow": { - "__name": "SEED_TASKS_FLOW", + "deleteCacheTasksFlow": { + "__name": "DELETE_CACHE_TASKS_FLOW", "__format": "json" }, "deleteLayerTasksFlow": { diff --git a/config/default.json b/config/default.json index 8e57929..4604e62 100644 --- a/config/default.json +++ b/config/default.json @@ -53,7 +53,8 @@ "update": "Ingestion_Update", "swapUpdate": "Ingestion_Swap_Update", "export": "Export", - "seed": "TilesSeeding", + "updateCacheDeletion": "Update_Delete_Cache", + "swapCacheDeletion": "Swap_Delete_Cache", "deleteLayer": "Delete_Layer" }, "tasks": { @@ -64,7 +65,6 @@ "createTasks": "create-tasks", "export": "tilesExporting", "finalize": "finalize", - "seed": "TilesSeeding", "tilesDeletion": "tiles-deletion", "delete": "delete" }, @@ -73,7 +73,7 @@ "taskFlowManager": { "ingestionTasksFlow": ["validation", "create-merge-tasks", "tilesMerging", "finalize"], "exportTasksFlow": ["init", "tilesExporting", "polygon-parts", "finalize"], - "seedTasksFlow": ["TilesSeeding"], + "deleteCacheTasksFlow": ["tiles-deletion"], "deleteLayerTasksFlow": ["delete", "tiles-deletion"] } } diff --git a/helm/templates/configmap.yaml b/helm/templates/configmap.yaml index cb9dfea..fe8d2ae 100644 --- a/helm/templates/configmap.yaml +++ b/helm/templates/configmap.yaml @@ -32,7 +32,8 @@ data: JOB_DEFINITIONS_JOB_UPDATE: {{ $jobDefinitions.jobs.update.type | quote }} JOB_DEFINITIONS_JOB_SWAP_UPDATE: {{ $jobDefinitions.jobs.swapUpdate.type | quote }} JOB_DEFINITIONS_JOB_EXPORT: {{ $jobDefinitions.jobs.export.type | quote }} - JOB_DEFINITIONS_JOB_SEED: {{ $jobDefinitions.jobs.seed.type | quote }} + JOB_DEFINITIONS_JOB_UPDATE_DELETE_CACHE: {{ $jobDefinitions.jobs.updateCacheDeletion.type | quote }} + JOB_DEFINITIONS_JOB_SWAP_DELETE_CACHE: {{ $jobDefinitions.jobs.swapCacheDeletion.type | quote }} JOB_DEFINITIONS_JOB_DELETE_LAYER: {{ $jobDefinitions.jobs.deleteLayer.type | quote }} JOB_DEFINITIONS_TASK_INIT: {{ $jobDefinitions.tasks.init.type | quote }} JOB_DEFINITIONS_TASK_VALIDATION: {{ $jobDefinitions.tasks.validation.type | quote }} @@ -42,12 +43,11 @@ data: JOB_DEFINITIONS_TASK_CREATE_TASKS: {{ $jobDefinitions.tasks.createTasks.type | quote }} JOB_DEFINITIONS_TASK_EXPORT: {{ $jobDefinitions.tasks.export.type | quote }} JOB_DEFINITIONS_TASK_FINALIZE: {{ $jobDefinitions.tasks.finalize.type | quote }} - JOB_DEFINITIONS_TASK_SEED: {{ $jobDefinitions.tasks.seed.type | quote }} JOB_DEFINITIONS_TASK_DELETE: {{ $jobDefinitions.tasks.delete.type | quote }} JOB_DEFINITIONS_SUSPENDING_TASKS: {{ $suspendingTaskTypes | quote }} INGESTION_TASKS_FLOW: {{ .Values.taskFlowManager.ingestionTasksFlow | toJson | quote }} EXPORT_TASKS_FLOW: {{ .Values.taskFlowManager.exportTasksFlow | toJson | quote }} - SEED_TASKS_FLOW: {{ .Values.taskFlowManager.seedTasksFlow | toJson | quote }} + DELETE_CACHE_TASKS_FLOW: {{ .Values.taskFlowManager.deleteCacheTasksFlow | toJson | quote }} DELETE_LAYER_TASKS_FLOW: {{ .Values.taskFlowManager.deleteLayerTasksFlow | toJson | quote }} {{- with .Values.configManagement }} CONFIG_NAME: {{ .name | quote }} diff --git a/helm/values.yaml b/helm/values.yaml index 36a3138..b4528dc 100644 --- a/helm/values.yaml +++ b/helm/values.yaml @@ -93,7 +93,9 @@ jobDefinitions: type: '' export: type: '' - seed: + updateCacheDeletion: + type: '' + swapCacheDeletion: type: '' deleteLayer: type: '' @@ -115,8 +117,6 @@ jobDefinitions: type: '' export: type: '' - seed: - type: '' delete: type: '' @@ -132,8 +132,8 @@ taskFlowManager: - tilesExporting - polygon-parts - finalize - seedTasksFlow: - - TilesSeeding + deleteCacheTasksFlow: + - tiles-deletion deleteLayerTasksFlow: - delete - tiles-deletion diff --git a/src/common/interfaces.ts b/src/common/interfaces.ts index 73d8e26..4784dd3 100644 --- a/src/common/interfaces.ts +++ b/src/common/interfaces.ts @@ -21,7 +21,8 @@ export interface IJobDefinitionsConfig { update: string; swapUpdate: string; export: string; - seed: string; + updateCacheDeletion: string; + swapCacheDeletion: string; deleteLayer: string; }; tasks: { @@ -32,7 +33,6 @@ export interface IJobDefinitionsConfig { validation: string; init: string; export: string; - seed: string; tilesDeletion: string; delete: string; }; diff --git a/src/tasks/handlers/seed/seedHandler.ts b/src/tasks/handlers/deleteCache/deleteCacheHandler.ts similarity index 82% rename from src/tasks/handlers/seed/seedHandler.ts rename to src/tasks/handlers/deleteCache/deleteCacheHandler.ts index 6227bc5..ed5e9fb 100644 --- a/src/tasks/handlers/seed/seedHandler.ts +++ b/src/tasks/handlers/deleteCache/deleteCacheHandler.ts @@ -7,7 +7,7 @@ import { SERVICES } from '../../../common/constants'; import { JobHandler } from '../jobHandler'; @injectable() -export class SeedJobHandler extends JobHandler { +export class DeleteCacheJobHandler extends JobHandler { protected readonly tasksFlow: TaskTypes; protected readonly excludedTypes: TaskTypes; protected readonly blockedDuplicationTypes: TaskTypes; @@ -20,8 +20,8 @@ export class SeedJobHandler extends JobHandler { task: ITaskResponse ) { super(logger, config, jobManagerClient, job, task); - this.tasksFlow = this.config.get('taskFlowManager.seedTasksFlow') as unknown as TaskTypes; - this.excludedTypes = [this.jobDefinitions.tasks.seed]; + this.tasksFlow = this.config.get('taskFlowManager.deleteCacheTasksFlow') as unknown as TaskTypes; + this.excludedTypes = [this.jobDefinitions.tasks.tilesDeletion]; this.blockedDuplicationTypes = []; this.initializeTaskOperations(); diff --git a/src/tasks/handlers/jobHandlerFactory.ts b/src/tasks/handlers/jobHandlerFactory.ts index 47c9fa8..fbeb8ad 100644 --- a/src/tasks/handlers/jobHandlerFactory.ts +++ b/src/tasks/handlers/jobHandlerFactory.ts @@ -6,7 +6,7 @@ import type { IJobDefinitionsConfig } from '../../common/interfaces'; import type { JobHandler } from './jobHandler'; import { IngestionJobHandler } from './ingestion/ingestionHandler'; import { ExportJobHandler } from './export/exportHandler'; -import { SeedJobHandler } from './seed/seedHandler'; +import { DeleteCacheJobHandler } from './deleteCache/deleteCacheHandler'; import { DeleteLayerJobHandler } from './deleteLayer/deleteLayerHandler'; export function getJobHandler( @@ -29,8 +29,9 @@ export function getJobHandler( case jobDefinitions.jobs.export: { return new ExportJobHandler(logger, config, jobManagerClient, job, task); } - case jobDefinitions.jobs.seed: { - return new SeedJobHandler(logger, config, jobManagerClient, job, task); + case jobDefinitions.jobs.updateCacheDeletion: + case jobDefinitions.jobs.swapCacheDeletion: { + return new DeleteCacheJobHandler(logger, config, jobManagerClient, job, task); } case jobDefinitions.jobs.deleteLayer: { return new DeleteLayerJobHandler(logger, config, jobManagerClient, job, task); diff --git a/tests/integration/tasks/deleteCache/taskManager.spec.ts b/tests/integration/tasks/deleteCache/taskManager.spec.ts new file mode 100644 index 0000000..4f7f1cb --- /dev/null +++ b/tests/integration/tasks/deleteCache/taskManager.spec.ts @@ -0,0 +1,115 @@ +import nock, { cleanAll, isDone, pendingMocks } from 'nock'; +import { OperationStatus } from '@map-colonies/mc-priority-queue'; +import { StatusCodes as httpStatusCodes } from 'http-status-codes'; +import { trace } from '@opentelemetry/api'; +import { jsLogger } from '@map-colonies/js-logger'; +import { initConfig } from '../../../../src/common/config'; +import { configMock } from '../../../mocks/configMock'; +import { getApp } from '../../../../src/app'; +import type { IJobManagerConfig, IJobDefinitionsConfig } from '../../../../src/common/interfaces'; +import { getDeleteCacheJobMock, getTaskMock } from '../../../mocks/jobMocks'; +import { calculateJobPercentage } from '../../../../src/utils/jobUtils'; +import { SERVICES } from '../../../../src/common/constants'; +import { registerExternalValues } from '../../../../src/containerConfig'; +import { TasksRequestSender } from '../helpers/requestSender'; +import { getTestContainerConfig, resetContainer } from '../helpers/containerConfig'; + +describe('tasks', function () { + let requestSender: TasksRequestSender; + let jobManagerConfigMock: IJobManagerConfig; + let jobDefinitionsConfig: IJobDefinitionsConfig; + + beforeAll(async function () { + await initConfig(true); + }); + + beforeEach(async function () { + const [app] = await getApp({ + override: [...(await getTestContainerConfig())], + useChild: true, + }); + + await registerExternalValues({ + override: [ + { token: SERVICES.LOGGER, provider: { useValue: await jsLogger({ enabled: false }) } }, + { token: SERVICES.CONFIG, provider: { useValue: configMock } }, + { token: SERVICES.TRACER, provider: { useValue: trace.getTracer('testTracer') } }, + ], + }); + + requestSender = new TasksRequestSender(app); + jobManagerConfigMock = configMock.get('jobManagement.config') as unknown as IJobManagerConfig; + jobDefinitionsConfig = configMock.get('jobDefinitions') as IJobDefinitionsConfig; + cleanAll(); + }); + + afterEach(function () { + resetContainer(); + jest.restoreAllMocks(); + if (!isDone()) { + throw new Error(`Not all nock interceptors were used: ${JSON.stringify(pendingMocks())}`); + } + }); + + const deleteCacheJobTypes = [{ jobTypeKey: 'updateCacheDeletion' as const }, { jobTypeKey: 'swapCacheDeletion' as const }]; + + describe('Happy Path', function () { + it.each(deleteCacheJobTypes)( + 'should return 200 when getting completed but not last tiles-deletion task - $jobTypeKey', + async ({ jobTypeKey }) => { + // mocks + const mockJob = getDeleteCacheJobMock(jobDefinitionsConfig.jobs[jobTypeKey]); + const mockTask = getTaskMock(mockJob.id, { type: jobDefinitionsConfig.tasks.tilesDeletion, status: OperationStatus.COMPLETED }); + nock(jobManagerConfigMock.jobManagerBaseUrl).post('/tasks/find', { id: mockTask.id }).reply(httpStatusCodes.OK, [mockTask]); + nock(jobManagerConfigMock.jobManagerBaseUrl) + .get(`/jobs/${mockJob.id}`) + .query({ shouldReturnTasks: false }) + .reply(httpStatusCodes.OK, mockJob); + const taskPercentage = calculateJobPercentage(mockJob.completedTasks, mockJob.taskCount); + nock(jobManagerConfigMock.jobManagerBaseUrl).put(`/jobs/${mockJob.id}`, { percentage: taskPercentage }).reply(httpStatusCodes.OK); + // action + const response = await requestSender.handleTaskNotification(mockTask.id); + // expectation + expect(response.status).toBe(httpStatusCodes.OK); + expect(response).toSatisfyApiSpec(); + } + ); + + it.each(deleteCacheJobTypes)('should return 200 when getting last completed tiles-deletion task - $jobTypeKey', async ({ jobTypeKey }) => { + // mocks + const mockJob = getDeleteCacheJobMock(jobDefinitionsConfig.jobs[jobTypeKey], { completedTasks: 5, taskCount: 5 }); + const mockTask = getTaskMock(mockJob.id, { type: jobDefinitionsConfig.tasks.tilesDeletion, status: OperationStatus.COMPLETED }); + nock(jobManagerConfigMock.jobManagerBaseUrl).post('/tasks/find', { id: mockTask.id }).reply(httpStatusCodes.OK, [mockTask]); + nock(jobManagerConfigMock.jobManagerBaseUrl).get(`/jobs/${mockJob.id}`).query({ shouldReturnTasks: false }).reply(httpStatusCodes.OK, mockJob); + nock(jobManagerConfigMock.jobManagerBaseUrl) + .put(`/jobs/${mockJob.id}`, { percentage: 100, status: OperationStatus.COMPLETED }) + .reply(httpStatusCodes.OK); + // action + const response = await requestSender.handleTaskNotification(mockTask.id); + // expectation + expect(response.status).toBe(httpStatusCodes.OK); + expect(response).toSatisfyApiSpec(); + }); + + it.each(deleteCacheJobTypes)( + 'should return 200 and fail the job when getting failed tiles-deletion task - $jobTypeKey', + async ({ jobTypeKey }) => { + // mocks + const reason = 'Tiles deletion failed due to storage error'; + const mockJob = getDeleteCacheJobMock(jobDefinitionsConfig.jobs[jobTypeKey]); + const mockTask = getTaskMock(mockJob.id, { type: jobDefinitionsConfig.tasks.tilesDeletion, status: OperationStatus.FAILED, reason }); + nock(jobManagerConfigMock.jobManagerBaseUrl).post('/tasks/find', { id: mockTask.id }).reply(httpStatusCodes.OK, [mockTask]); + nock(jobManagerConfigMock.jobManagerBaseUrl) + .get(`/jobs/${mockJob.id}`) + .query({ shouldReturnTasks: false }) + .reply(httpStatusCodes.OK, mockJob); + nock(jobManagerConfigMock.jobManagerBaseUrl).put(`/jobs/${mockJob.id}`, { status: OperationStatus.FAILED, reason }).reply(httpStatusCodes.OK); + // action + const response = await requestSender.handleTaskNotification(mockTask.id); + // expectation + expect(response.status).toBe(httpStatusCodes.OK); + expect(response).toSatisfyApiSpec(); + } + ); + }); +}); diff --git a/tests/integration/tasks/seed/taskManager.spec.ts b/tests/integration/tasks/seed/taskManager.spec.ts deleted file mode 100644 index 197fd0e..0000000 --- a/tests/integration/tasks/seed/taskManager.spec.ts +++ /dev/null @@ -1,152 +0,0 @@ -import nock, { cleanAll, isDone, pendingMocks } from 'nock'; -import { OperationStatus } from '@map-colonies/mc-priority-queue'; -import { StatusCodes as httpStatusCodes } from 'http-status-codes'; -import { trace } from '@opentelemetry/api'; -import { jsLogger } from '@map-colonies/js-logger'; -import { initConfig } from '../../../../src/common/config'; -import { configMock } from '../../../mocks/configMock'; -import { getApp } from '../../../../src/app'; -import type { IJobManagerConfig, IJobDefinitionsConfig } from '../../../../src/common/interfaces'; -import { getSeedingJobMock, getTaskMock } from '../../../mocks/jobMocks'; -import { calculateJobPercentage } from '../../../../src/utils/jobUtils'; -import { SERVICES } from '../../../../src/common/constants'; -import { registerExternalValues } from '../../../../src/containerConfig'; -import { TasksRequestSender } from '../helpers/requestSender'; -import { getTestContainerConfig, resetContainer } from '../helpers/containerConfig'; - -describe('tasks', function () { - let requestSender: TasksRequestSender; - let jobManagerConfigMock: IJobManagerConfig; - let jobDefinitionsConfig: IJobDefinitionsConfig; - - beforeAll(async function () { - await initConfig(true); - }); - - beforeEach(async function () { - const [app] = await getApp({ - override: [...(await getTestContainerConfig())], - useChild: true, - }); - - await registerExternalValues({ - override: [ - { token: SERVICES.LOGGER, provider: { useValue: await jsLogger({ enabled: false }) } }, - { token: SERVICES.CONFIG, provider: { useValue: configMock } }, - { token: SERVICES.TRACER, provider: { useValue: trace.getTracer('testTracer') } }, - ], - }); - - requestSender = new TasksRequestSender(app); - jobManagerConfigMock = configMock.get('jobManagement.config') as unknown as IJobManagerConfig; - jobDefinitionsConfig = configMock.get('jobDefinitions') as IJobDefinitionsConfig; - cleanAll(); - }); - - afterEach(function () { - resetContainer(); - jest.restoreAllMocks(); - if (!isDone()) { - throw new Error(`Not all nock interceptors were used: ${JSON.stringify(pendingMocks())}`); - } - }); - - describe('Happy Path', function () { - it('should return 200 when getting completed but not last seeding task', async () => { - // mocks - const mockSeedingJob = getSeedingJobMock(); - const mockSeedTask = getTaskMock(mockSeedingJob.id, { type: jobDefinitionsConfig.tasks.seed, status: OperationStatus.COMPLETED }); - nock(jobManagerConfigMock.jobManagerBaseUrl).post('/tasks/find', { id: mockSeedTask.id }).reply(httpStatusCodes.OK, [mockSeedTask]); - nock(jobManagerConfigMock.jobManagerBaseUrl) - .get(`/jobs/${mockSeedingJob.id}`) - .query({ shouldReturnTasks: false }) - .reply(httpStatusCodes.OK, mockSeedingJob); - const taskPercentage = calculateJobPercentage(mockSeedingJob.completedTasks, mockSeedingJob.taskCount); - nock(jobManagerConfigMock.jobManagerBaseUrl).put(`/jobs/${mockSeedingJob.id}`, { percentage: taskPercentage }).reply(httpStatusCodes.OK); - // action - const response = await requestSender.handleTaskNotification(mockSeedTask.id); - // expectation - expect(response.status).toBe(httpStatusCodes.OK); - expect(response).toSatisfyApiSpec(); - }); - - it('should return 200 when getting last completed seeding task', async () => { - // mocks - const mockSeedingJob = getSeedingJobMock({ completedTasks: 5, taskCount: 5 }); - const mockSeedTask = getTaskMock(mockSeedingJob.id, { type: jobDefinitionsConfig.tasks.seed, status: OperationStatus.COMPLETED }); - nock(jobManagerConfigMock.jobManagerBaseUrl).post('/tasks/find', { id: mockSeedTask.id }).reply(httpStatusCodes.OK, [mockSeedTask]); - nock(jobManagerConfigMock.jobManagerBaseUrl) - .get(`/jobs/${mockSeedingJob.id}`) - .query({ shouldReturnTasks: false }) - .reply(httpStatusCodes.OK, mockSeedingJob); - nock(jobManagerConfigMock.jobManagerBaseUrl) - .put(`/jobs/${mockSeedingJob.id}`, { percentage: 100, status: OperationStatus.COMPLETED }) - .reply(httpStatusCodes.OK); - // action - const response = await requestSender.handleTaskNotification(mockSeedTask.id); - // expectation - expect(response.status).toBe(httpStatusCodes.OK); - expect(response).toSatisfyApiSpec(); - }); - - it('should return 200 when getting failed seeding task', async () => { - // mocks - const mockSeedingJob = getSeedingJobMock(); - const mockSeedTask = getTaskMock(mockSeedingJob.id, { - type: jobDefinitionsConfig.tasks.seed, - status: OperationStatus.FAILED, - reason: 'some error reason', - }); - nock(jobManagerConfigMock.jobManagerBaseUrl).post('/tasks/find', { id: mockSeedTask.id }).reply(httpStatusCodes.OK, [mockSeedTask]); - nock(jobManagerConfigMock.jobManagerBaseUrl) - .get(`/jobs/${mockSeedingJob.id}`) - .query({ shouldReturnTasks: false }) - .reply(httpStatusCodes.OK, mockSeedingJob); - nock(jobManagerConfigMock.jobManagerBaseUrl) - .put(`/jobs/${mockSeedingJob.id}`, { status: OperationStatus.FAILED, reason: 'some error reason' }) - .reply(httpStatusCodes.OK); - // action - const response = await requestSender.handleTaskNotification(mockSeedTask.id); - // expectation - expect(response.status).toBe(httpStatusCodes.OK); - expect(response).toSatisfyApiSpec(); - }); - }); - - it.each([ - { - taskType: 'seeding', - jobType: 'ingestion', - getJobMock: () => getSeedingJobMock(), - taskTypeKey: 'seed' as const, - reason: 'Seeding process failed due to network error', - }, - ])( - 'should return 200 and apply correct job failure logic when $taskType task fails in $jobType job', - async ({ getJobMock, taskTypeKey, reason }) => { - // mocks - const jobMock = getJobMock(); - const taskMock = getTaskMock(jobMock.id, { - type: jobDefinitionsConfig.tasks[taskTypeKey], - status: OperationStatus.FAILED, - reason, - }); - - nock(jobManagerConfigMock.jobManagerBaseUrl).post('/tasks/find', { id: taskMock.id }).reply(httpStatusCodes.OK, [taskMock]); - nock(jobManagerConfigMock.jobManagerBaseUrl).get(`/jobs/${jobMock.id}`).query({ shouldReturnTasks: false }).reply(httpStatusCodes.OK, jobMock); - nock(jobManagerConfigMock.jobManagerBaseUrl) - .put(`/jobs/${jobMock.id}`, { - status: OperationStatus.FAILED, - reason, - }) - .reply(httpStatusCodes.OK); - - // action - const response = await requestSender.handleTaskNotification(taskMock.id); - - // expectation - expect(response.status).toBe(httpStatusCodes.OK); - expect(response).toSatisfyApiSpec(); - } - ); -}); diff --git a/tests/mocks/configMock.ts b/tests/mocks/configMock.ts index 40845a1..96caf51 100644 --- a/tests/mocks/configMock.ts +++ b/tests/mocks/configMock.ts @@ -82,7 +82,8 @@ const registerDefaultConfig = (): void => { update: 'Ingestion_Update', swapUpdate: 'Ingestion_Swap_Update', export: 'Export', - seed: 'TilesSeeding', + updateCacheDeletion: 'Update_Delete_Cache', + swapCacheDeletion: 'Swap_Delete_Cache', deleteLayer: 'Delete_Layer', }, tasks: { @@ -93,7 +94,6 @@ const registerDefaultConfig = (): void => { polygonParts: 'polygon-parts', finalize: 'finalize', export: 'tilesExporting', - seed: 'TilesSeeding', tilesDeletion: 'tiles-deletion', delete: 'delete', }, @@ -102,7 +102,7 @@ const registerDefaultConfig = (): void => { taskFlowManager: { ingestionTasksFlow: ['validation', 'create-tasks', 'tilesMerging', 'finalize'], exportTasksFlow: ['init', 'tilesExporting', 'polygon-parts', 'finalize'], - seedTasksFlow: ['TilesSeeding'], + deleteCacheTasksFlow: ['tiles-deletion'], deleteLayerTasksFlow: ['delete', 'tiles-deletion'], }, }; diff --git a/tests/mocks/jobMocks.ts b/tests/mocks/jobMocks.ts index 6b7e4d0..e0ceaa4 100644 --- a/tests/mocks/jobMocks.ts +++ b/tests/mocks/jobMocks.ts @@ -76,12 +76,15 @@ export const getExportJobMock = (override?: Partial>): IJobResponse => { +export const getDeleteCacheJobMock = ( + jobType: string = 'Update_Delete_Cache', + override?: Partial> +): IJobResponse => { const defaultJobMock = { id: faker.string.uuid(), resourceId: 'test', version: '1.0', - type: 'TilesSeeding', + type: jobType, description: '', status: OperationStatus.IN_PROGRESS, percentage: 87, diff --git a/tests/unit/tasks/handlers/baseJobHandler.spec.ts b/tests/unit/tasks/handlers/baseJobHandler.spec.ts index 840b992..839945d 100644 --- a/tests/unit/tasks/handlers/baseJobHandler.spec.ts +++ b/tests/unit/tasks/handlers/baseJobHandler.spec.ts @@ -25,7 +25,8 @@ describe('BaseJobHandler', () => { { mockJob: createTestJob(jobDefinitionsConfig.jobs.update) }, { mockJob: createTestJob(jobDefinitionsConfig.jobs.swapUpdate) }, { mockJob: createTestJob(jobDefinitionsConfig.jobs.export) }, - { mockJob: createTestJob(jobDefinitionsConfig.jobs.seed) }, + { mockJob: createTestJob(jobDefinitionsConfig.jobs.updateCacheDeletion) }, + { mockJob: createTestJob(jobDefinitionsConfig.jobs.swapCacheDeletion) }, ]; const testCaseHandlerLog = '$mockJob.type handler'; @@ -137,7 +138,9 @@ describe('BaseJobHandler', () => { }); describe('isJobCompleted', () => { - const nonSeedTestCases = testCases.filter(({ mockJob }) => mockJob.type !== jobDefinitionsConfig.jobs.seed); // removing seed job test case as finalize task type is not handled there + const nonDeleteCacheTestCases = testCases.filter( + ({ mockJob }) => mockJob.type !== jobDefinitionsConfig.jobs.updateCacheDeletion && mockJob.type !== jobDefinitionsConfig.jobs.swapCacheDeletion + ); // removing deleteCache job test cases as finalize task type is not handled there it.each(testCases)(`should return true when all tasks are completed - ${testCaseHandlerLog}`, (testCase) => { let { mockJob } = testCase; @@ -171,7 +174,7 @@ describe('BaseJobHandler', () => { expect(result).toBe(false); }); - it.each(nonSeedTestCases)(`should return false in case task type is not finalize - ${testCaseHandlerLog}`, (testCase) => { + it.each(nonDeleteCacheTestCases)(`should return false in case task type is not finalize - ${testCaseHandlerLog}`, (testCase) => { let { mockJob } = testCase; mockJob = { ...mockJob, completedTasks: 10, taskCount: 10 }; mockTask = getTaskMock(mockJob.id, { diff --git a/tests/unit/tasks/handlers/jobHandler.spec.ts b/tests/unit/tasks/handlers/jobHandler.spec.ts index 9f28438..0cc8fed 100644 --- a/tests/unit/tasks/handlers/jobHandler.spec.ts +++ b/tests/unit/tasks/handlers/jobHandler.spec.ts @@ -22,7 +22,8 @@ describe('JobHandler', () => { { mockJob: createTestJob(jobDefinitionsConfig.jobs.update), taskType: jobDefinitionsConfig.tasks.merge }, { mockJob: createTestJob(jobDefinitionsConfig.jobs.swapUpdate), taskType: jobDefinitionsConfig.tasks.merge }, { mockJob: createTestJob(jobDefinitionsConfig.jobs.export), taskType: jobDefinitionsConfig.tasks.export }, - { mockJob: createTestJob(jobDefinitionsConfig.jobs.seed), taskType: jobDefinitionsConfig.tasks.seed }, + { mockJob: createTestJob(jobDefinitionsConfig.jobs.updateCacheDeletion), taskType: jobDefinitionsConfig.tasks.tilesDeletion }, + { mockJob: createTestJob(jobDefinitionsConfig.jobs.swapCacheDeletion), taskType: jobDefinitionsConfig.tasks.tilesDeletion }, { mockJob: createTestJob(jobDefinitionsConfig.jobs.deleteLayer), taskType: jobDefinitionsConfig.tasks.delete }, ]; @@ -60,8 +61,11 @@ describe('JobHandler', () => { describe('handleCompletedNotification', () => { const finalizeCases = testCases.filter( - ({ mockJob }) => mockJob.type !== jobDefinitionsConfig.jobs.seed && mockJob.type !== jobDefinitionsConfig.jobs.deleteLayer - ); // removing seed and deleteLayer job test cases as finalize task type is not handled there + ({ mockJob }) => + mockJob.type !== jobDefinitionsConfig.jobs.updateCacheDeletion && + mockJob.type !== jobDefinitionsConfig.jobs.swapCacheDeletion && + mockJob.type !== jobDefinitionsConfig.jobs.deleteLayer + ); // removing deleteCache and deleteLayer job test cases as finalize task type is not handled there it.each(finalizeCases)( `should complete job when all of the task are completed and task type is "finalize" - ${testCaseHandlerLog}`, diff --git a/tests/unit/tasks/models/tasksManager.spec.ts b/tests/unit/tasks/models/tasksManager.spec.ts index 0b9b7db..03e6f6f 100644 --- a/tests/unit/tasks/models/tasksManager.spec.ts +++ b/tests/unit/tasks/models/tasksManager.spec.ts @@ -3,7 +3,7 @@ import { OperationStatus } from '@map-colonies/mc-priority-queue'; import type { ExportFinalizeErrorCallbackParams } from '@map-colonies/raster-shared'; import { ExportFinalizeType } from '@map-colonies/raster-shared'; import { registerDefaultConfig, clear as clearConfig } from '../../../mocks/configMock'; -import { createTestJob, getExportJobMock, getSeedingJobMock, getTaskMock } from '../../../mocks/jobMocks'; +import { createTestJob, getExportJobMock, getDeleteCacheJobMock, getTaskMock } from '../../../mocks/jobMocks'; import { IrrelevantOperationStatusError } from '../../../../src/common/errors'; import type { TasksModelTestContext } from './tasksManagerSetup'; import { setupTasksManagerTest } from './tasksManagerSetup'; @@ -129,23 +129,23 @@ describe('TasksManager', () => { expect(mockUpdateJob).toHaveBeenCalledWith(exportJobMock.id, { status: OperationStatus.FAILED, reason: exportTaskMock.reason }); }); - it('should fail a job on a failed seeding task', async () => { + it('should fail a job on a failed tiles-deletion task', async () => { // mocks const { tasksManager, mockFindTasks, mockUpdateJob, jobDefinitionsConfigMock, mockGetJob } = testContext; - const seedingJob = getSeedingJobMock(); - const seedTaskMock = getTaskMock(seedingJob.id, { - type: jobDefinitionsConfigMock.tasks.seed, + const deleteCacheJob = getDeleteCacheJobMock(); + const tilesDeletionTaskMock = getTaskMock(deleteCacheJob.id, { + type: jobDefinitionsConfigMock.tasks.tilesDeletion, status: OperationStatus.FAILED, reason: 'some error reason', }); - mockFindTasks.mockResolvedValueOnce([seedTaskMock]); - mockGetJob.mockResolvedValue(seedingJob); + mockFindTasks.mockResolvedValueOnce([tilesDeletionTaskMock]); + mockGetJob.mockResolvedValue(deleteCacheJob); // action - await tasksManager.handleTaskNotification(seedTaskMock.id); + await tasksManager.handleTaskNotification(tilesDeletionTaskMock.id); // expectation expect(mockUpdateJob).toHaveBeenCalledTimes(1); - expect(mockUpdateJob).toHaveBeenCalledWith(seedingJob.id, { status: OperationStatus.FAILED, reason: 'some error reason' }); + expect(mockUpdateJob).toHaveBeenCalledWith(deleteCacheJob.id, { status: OperationStatus.FAILED, reason: 'some error reason' }); }); });