Skip to content

Commit 25645f5

Browse files
authored
Merge pull request #943 from govuk-one-login/FPAD-8044-non-blocking-event-catalogue-schema-validation
FPAD-8044: Add non-blocking event catalogue schema validation
2 parents 845ffcc + d214192 commit 25645f5

2 files changed

Lines changed: 23 additions & 8 deletions

File tree

src/handlers/account-deletion-processor-handler.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logger from '../commons/logger';
2+
import Ajv2019 from 'ajv/dist/2019';
23
import { DynamoDatabaseService } from '../services/dynamo-database-service';
34
import { LOGS_PREFIX_SENSITIVE_INFO, MetricNames } from '../data-types/constants';
45
import { AppConfigService } from '../services/app-config-service';
@@ -7,6 +8,11 @@ import { addMetric, metric } from '../commons/metrics';
78
import { accountDeleteMessageSchema } from '../contracts/account-delete-message';
89
import { prettifyError } from 'zod';
910
import jsonSafeParse from '../commons/json-safe-parse';
11+
import { AUTH_DELETE_ACCOUNTSchema } from '@govuk-one-login/event-catalogue-schemas';
12+
13+
const ajv2019 = new Ajv2019({ allErrors: true });
14+
15+
const validateEventCatalogue = ajv2019.compile(AUTH_DELETE_ACCOUNTSchema);
1016

1117
enum ParserErrorType {
1218
BODY_JSON_PARSER_ERROR = 'BODY_JSON_PARSER_ERROR',
@@ -67,6 +73,15 @@ function parseMessage(record: SQSRecord): string {
6773
`The SQS message can not be parsed. ${prettifyError(result.error)}`,
6874
);
6975

76+
if (!validateEventCatalogue(recordBodyResult.data)) {
77+
logger.debug(`${LOGS_PREFIX_SENSITIVE_INFO} Event has failed event catalogue schema validation.`, {
78+
validationErrors: validateEventCatalogue.errors,
79+
});
80+
addMetric(MetricNames.INVALID_EVENT_RECEIVED_EVENT_CATALOGUE, undefined, undefined, {
81+
EVENT_NAME: result.data.event_name,
82+
});
83+
}
84+
7085
return result.data.user.user_id;
7186
}
7287

src/handlers/tests/account-deletion-processor-handler.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ describe('Account Deletion Processor', () => {
165165
mockRecord = { ...mockRecord, body: mockBody };
166166
mockEvent = { Records: [mockRecord] };
167167
await handler(mockEvent, mockContext);
168-
expect(mockPublishStoredMetric).toHaveBeenCalledTimes(1);
168+
expect(mockPublishStoredMetric).toHaveBeenCalled();
169169
expect(mockDynamoDBServiceUpdateDeleteStatus).toHaveBeenCalledWith('abcdef');
170170
});
171171

@@ -180,16 +180,16 @@ describe('Account Deletion Processor', () => {
180180
mockRecord = { ...mockRecord, body: mockBody };
181181
mockEvent = { Records: [mockRecord] };
182182
await expect(handler(mockEvent, mockContext)).rejects.toThrow('Failed to update the account status.');
183-
expect(mockPublishStoredMetric).toHaveBeenCalledTimes(1);
183+
expect(mockPublishStoredMetric).toHaveBeenCalled();
184184
expect(loggerErrorSpy).toHaveBeenCalledWith(`Sensitive info - Error updating account hello`, { error: 'Error' });
185-
expect(mockAddMetric).toHaveBeenCalledTimes(1);
185+
expect(mockAddMetric).toHaveBeenCalled();
186186
expect(mockAddMetric).toHaveBeenCalledWith(MetricNames.MARK_AS_DELETED_FAILED, 'Count', 1);
187187
});
188188

189189
it('successfully process the message when it contains a single record', async () => {
190190
mockDynamoDBServiceUpdateDeleteStatus.mockResolvedValue('');
191191
await handler(mockEvent, mockContext);
192-
expect(mockPublishStoredMetric).toHaveBeenCalledTimes(1);
192+
expect(mockPublishStoredMetric).toHaveBeenCalled();
193193
expect(mockDynamoDBServiceUpdateDeleteStatus).toHaveBeenCalledTimes(1);
194194
});
195195

@@ -204,7 +204,7 @@ describe('Account Deletion Processor', () => {
204204
const mockEvent = { Records: [mockRecord] };
205205
mockDynamoDBServiceUpdateDeleteStatus.mockResolvedValue('');
206206
await handler(mockEvent, mockContext);
207-
expect(mockPublishStoredMetric).toHaveBeenCalledTimes(1);
207+
expect(mockPublishStoredMetric).toHaveBeenCalled();
208208
expect(mockDynamoDBServiceUpdateDeleteStatus).toHaveBeenCalledTimes(1);
209209
});
210210

@@ -243,6 +243,7 @@ describe('Account Deletion Processor', () => {
243243
mockDynamoDBServiceUpdateDeleteStatus.mockResolvedValue('');
244244
await handler(mockEvent, mockContext);
245245
expect(mockPublishStoredMetric).toHaveBeenCalledTimes(1);
246+
expect(mockAddMetric).not.toHaveBeenCalledWith('INVALID_EVENT_RECEIVED_EVENT_CATALOGUE', 'Count', 1);
246247
expect(mockDynamoDBServiceUpdateDeleteStatus).toHaveBeenCalledTimes(1);
247248
});
248249

@@ -259,7 +260,7 @@ describe('Account Deletion Processor', () => {
259260
};
260261
const mockEvent = { Records: [mockRecord, mockRecord2] };
261262
await handler(mockEvent, mockContext);
262-
expect(mockPublishStoredMetric).toHaveBeenCalledTimes(1);
263+
expect(mockPublishStoredMetric).toHaveBeenCalled();
263264
expect(mockDynamoDBServiceUpdateDeleteStatus).toHaveBeenCalledTimes(2);
264265
});
265266

@@ -277,8 +278,7 @@ describe('Account Deletion Processor', () => {
277278
};
278279
const mockEvent = { Records: [mockRecord, mockRecord2] };
279280
await expect(handler(mockEvent, mockContext)).rejects.toThrow('Failed to update the account status.');
280-
expect(mockPublishStoredMetric).toHaveBeenCalledTimes(1);
281-
expect(mockAddMetric).toHaveBeenCalledTimes(1);
281+
expect(mockPublishStoredMetric).toHaveBeenCalled();
282282
expect(mockAddMetric).toHaveBeenCalledWith(MetricNames.MARK_AS_DELETED_FAILED, 'Count', 1);
283283
});
284284
});

0 commit comments

Comments
 (0)