Skip to content

Commit 8f2f357

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

File tree

4 files changed

+51
-8
lines changed

4 files changed

+51
-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: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,28 @@ 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+
const error = generateNotifyError(unexpectedStatus, errorMessage);
142+
jest.mocked(sendEmailMethodMock).mockImplementation(() => Promise.reject(error));
141143

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

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

0 commit comments

Comments
 (0)