Skip to content

Commit 41d314c

Browse files
feat(DTFS2-7049): test unknown Gov.UK Notify responses
1 parent 8acb0e9 commit 41d314c

File tree

4 files changed

+49
-8
lines changed

4 files changed

+49
-8
lines changed

src/helper-modules/govuk-notify/govuk-notify.service.test.ts

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ describe('GovukNotifyService', () => {
3636
});
3737

3838
describe('sendEmail', () => {
39-
const generateNotifyError = (status: number, message: string) => {
39+
const generateNotifyError = (status: number, message?: string) => {
4040
const response = {
4141
data: {
4242
status_code: status,
@@ -96,8 +96,15 @@ describe('GovukNotifyService', () => {
9696
error: 'Internal Server Error',
9797
status: 500,
9898
},
99+
{
100+
exceptionClass: InternalServerErrorException,
101+
exceptionName: 'Internal Server Error Exception',
102+
error: 'Internal Server Error',
103+
status: 500,
104+
},
99105
])('throws exception $exceptionName for unexpected $status', async ({ exceptionClass, exceptionName, error, status }) => {
100-
jest.mocked(sendEmailMethodMock).mockImplementation(() => Promise.reject(generateNotifyError(status, errorMessage)));
106+
const notifyError = generateNotifyError(status, errorMessage);
107+
jest.mocked(sendEmailMethodMock).mockImplementation(() => Promise.reject(notifyError));
101108

102109
const resultPromise = service.sendEmail(govUkNotifyKey, { sendToEmailAddress, templateId, personalisation });
103110

@@ -106,18 +113,37 @@ describe('GovukNotifyService', () => {
106113
await expect(resultPromise).rejects.toThrow(exceptionName);
107114
await expect(resultPromise).rejects.toHaveProperty('status', status);
108115
await expect(resultPromise).rejects.toHaveProperty('response', { message: [errorMessage], error, statusCode: status });
116+
expect(loggerError).toHaveBeenCalledTimes(1);
117+
expect(loggerError).toHaveBeenCalledWith(notifyError);
109118
});
110119

111120
it('throws generic Error exception for unexpected status', async () => {
112121
const unexpectedStatus = valueGenerator.integer({ min: 900, max: 999 });
113-
jest.mocked(sendEmailMethodMock).mockImplementation(() => Promise.reject(generateNotifyError(unexpectedStatus, errorMessage)));
122+
const notifyError = generateNotifyError(unexpectedStatus, errorMessage);
123+
jest.mocked(sendEmailMethodMock).mockImplementation(() => Promise.reject(notifyError));
114124

115125
const resultPromise = service.sendEmail(govUkNotifyKey, { sendToEmailAddress, templateId, personalisation });
116126

117127
expect(sendEmailMethodMock).toHaveBeenCalledTimes(1);
118128
await expect(resultPromise).rejects.toBeInstanceOf(Error);
119129
await expect(resultPromise).rejects.toThrow(errorMessage);
120130
await expect(resultPromise).rejects.toHaveProperty('message', errorMessage);
131+
expect(loggerError).toHaveBeenCalledTimes(1);
132+
expect(loggerError).toHaveBeenCalledWith(notifyError);
133+
});
134+
135+
it('throws generic Error exception for error without error message', async () => {
136+
const notifyError = generateNotifyError(400);
137+
jest.mocked(sendEmailMethodMock).mockImplementation(() => Promise.reject(notifyError));
138+
139+
const resultPromise = service.sendEmail(govUkNotifyKey, { sendToEmailAddress, templateId, personalisation });
140+
141+
expect(sendEmailMethodMock).toHaveBeenCalledTimes(1);
142+
await expect(resultPromise).rejects.toBeInstanceOf(Error);
143+
await expect(resultPromise).rejects.toThrow('NotifyClient failed with unexpected error %o');
144+
await expect(resultPromise).rejects.toHaveProperty('message', 'NotifyClient failed with unexpected error %o');
145+
expect(loggerError).toHaveBeenCalledTimes(1);
146+
expect(loggerError).toHaveBeenCalledWith(notifyError);
121147
});
122148

123149
it('throws exception UnprocessableEntityException for empty response from GOV.UK Notify client', async () => {
@@ -128,6 +154,8 @@ describe('GovukNotifyService', () => {
128154
expect(sendEmailMethodMock).toHaveBeenCalledTimes(1);
129155
await expect(resultPromise).rejects.toBeInstanceOf(UnprocessableEntityException);
130156
await expect(resultPromise).rejects.toThrow('No GOV.UK Notify response');
157+
expect(loggerError).toHaveBeenCalledTimes(1);
158+
expect(loggerError).toHaveBeenCalledWith('Empty response from GOV.UK Notify');
131159
});
132160
});
133161
});

src/helper-modules/govuk-notify/govuk-notify.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class GovukNotifyService {
5656
throw new Error(err.response.data.errors[0].message);
5757
}
5858
} else {
59-
throw new Error(JSON.stringify(err.response.data));
59+
throw new Error('NotifyClient failed with unexpected error %o', err);
6060
}
6161
});
6262

src/modules/emails/emails.controller.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ describe('EmailsController', () => {
2929
const govUkNotifyKey = valueGenerator.string({ length: 10 });
3030

3131
it('returns receipt response for sent email', async () => {
32-
when(emailsServiceSendEmail).calledWith(govUkNotifyKey, request[0]).mockResolvedValueOnce(postEmailsResponse[0]);
32+
when(emailsServiceSendEmail).calledWith(govUkNotifyKey, request).mockResolvedValueOnce(postEmailsResponse[0]);
3333

3434
const response = await controller.postEmail(govUkNotifyKey, request);
3535

test/emails/post-emails.api-test.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,26 @@ describe('POST /emails', () => {
136136
});
137137
});
138138

139-
it('returns a 500 response if the Notify client responds with status 500', async () => {
140-
jest.mocked(sendEmailMethodMock).mockImplementation(() => Promise.reject(generateNotifyError(500)));
139+
it('returns a 500 response if the Notify client responds with unexpected status', async () => {
140+
const unexpectedStatus = valueGenerator.integer({ min: 900, max: 999 });
141+
jest.mocked(sendEmailMethodMock).mockImplementation(() => Promise.reject(generateNotifyError(unexpectedStatus, errorMessage)));
141142

142143
const { status, body } = await api.post(mdmPath, request, { govUkNotifyKey });
143144

144145
expect(status).toBe(500);
145-
expect(body).toStrictEqual({
146+
expect(body).toMatchObject({
147+
statusCode: 500,
148+
message: 'Internal server error',
149+
});
150+
});
151+
152+
it("returns a 500 response if the Notify client error doesn't have message attribute", async () => {
153+
jest.mocked(sendEmailMethodMock).mockImplementation(() => Promise.reject(generateNotifyError(400)));
154+
155+
const { status, body } = await api.post(mdmPath, request, { govUkNotifyKey });
156+
157+
expect(status).toBe(500);
158+
expect(body).toMatchObject({
146159
statusCode: 500,
147160
message: 'Internal server error',
148161
});

0 commit comments

Comments
 (0)