-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathget-letter-data.test.ts
More file actions
127 lines (108 loc) · 4.55 KB
/
get-letter-data.test.ts
File metadata and controls
127 lines (108 loc) · 4.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// mock error mapper
jest.mock('../../mappers/error-mapper');
import { mapErrorToResponse } from '../../mappers/error-mapper';
const mockedMapErrorToResponse = jest.mocked(mapErrorToResponse);
const expectedErrorResponse: APIGatewayProxyResult = {
statusCode: 400,
body: 'Error'
};
mockedMapErrorToResponse.mockReturnValue(expectedErrorResponse);
// mock letterService
jest.mock('../../services/letter-operations');
import * as letterService from '../../services/letter-operations';
import type { APIGatewayProxyResult, Context } from 'aws-lambda';
import { mockDeep } from 'jest-mock-extended';
import { makeApiGwEvent } from './utils/test-utils';
import { ValidationError } from '../../errors';
import * as errors from '../../contracts/errors';
import { createGetLetterDataHandler } from '../get-letter-data';
import { Destination, S3Client } from '@aws-sdk/client-s3';
import pino from 'pino';
import { LetterRepository } from '../../../../../internal/datastore/src';
import { EnvVars } from '../../config/env';
import { Deps } from "../../config/deps";
describe('API Lambda handler', () => {
const mockedDeps: jest.Mocked<Deps> = {
s3Client: {} as unknown as S3Client,
letterRepo: {} as unknown as LetterRepository,
logger: { info: jest.fn(), error: jest.fn() } as unknown as pino.Logger,
env: {
SUPPLIER_ID_HEADER: 'nhsd-supplier-id',
APIM_CORRELATION_HEADER: 'nhsd-correlation-id',
LETTERS_TABLE_NAME: 'LETTERS_TABLE_NAME',
LETTER_TTL_HOURS: 12960,
DOWNLOAD_URL_TTL_SECONDS: 60
} as unknown as EnvVars
} as Deps;
beforeEach(() => {
jest.clearAllMocks();
});
it('returns 303 Found with a pre signed url', async () => {
const mockedGetLetterDataUrlService = letterService.getLetterDataUrl as jest.Mock;
mockedGetLetterDataUrlService.mockResolvedValue('https://somePreSignedUrl.com');
const event = makeApiGwEvent({
path: '/letters/letter1/data',
headers: {
'nhsd-supplier-id': 'supplier1',
'nhsd-correlation-id': 'correlationId',
'x-request-id': 'requestId'
},
pathParameters: {id: 'id1'}
});
const context = mockDeep<Context>();
const callback = jest.fn();
const getLetterDataHandler = createGetLetterDataHandler(mockedDeps);
const result = await getLetterDataHandler(event, context, callback);
expect(result).toEqual({
statusCode: 303,
headers: {
'Location': 'https://somePreSignedUrl.com',
},
body: ''
});
});
it('returns error if headers are empty', async () => {
const event = makeApiGwEvent({ path: '/letters/letter1/data', headers: {},
pathParameters: {id: 'id1'}
});
const context = mockDeep<Context>();
const callback = jest.fn();
const getLetterDataHandler = createGetLetterDataHandler(mockedDeps);
const result = await getLetterDataHandler(event, context, callback);
expect(mockedMapErrorToResponse).toHaveBeenCalledWith(new Error('The request headers are empty'), undefined, mockedDeps.logger);
expect(result).toEqual(expectedErrorResponse);
});
it('returns error if correlation id not provided in request', async () => {
const event = makeApiGwEvent({
path: '/letters/letter1/data',
queryStringParameters: { limit: '2000' },
headers: {
'nhsd-supplier-id': 'supplier1',
'x-request-id': 'requestId'
},
pathParameters: {id: 'id1'}
});
const context = mockDeep<Context>();
const callback = jest.fn();
const getLetterDataHandler = createGetLetterDataHandler(mockedDeps);
const result = await getLetterDataHandler(event, context, callback);
expect(mockedMapErrorToResponse).toHaveBeenCalledWith(new Error("The request headers don't contain the APIM correlation id"), undefined, mockedDeps.logger);
expect(result).toEqual(expectedErrorResponse);
});
it('returns error response when path parameter letterId is not found', async () => {
const event = makeApiGwEvent({
path: '/letters/',
headers: {
'nhsd-supplier-id': 'supplier1',
'nhsd-correlation-id': 'correlationId',
'x-request-id': 'requestId'
},
});
const context = mockDeep<Context>();
const callback = jest.fn();
const getLetterDataHandler = createGetLetterDataHandler(mockedDeps);
const result = await getLetterDataHandler(event, context, callback);
expect(mockedMapErrorToResponse).toHaveBeenCalledWith(new ValidationError(errors.ApiErrorDetail.InvalidRequestMissingLetterIdPathParameter), 'correlationId', mockedDeps.logger);
expect(result).toEqual(expectedErrorResponse);
});
});