Skip to content

Commit 96ee3af

Browse files
authored
test: add tests for loggerMiddleware (#1492)
1 parent f1fe216 commit 96ee3af

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
import { FinalizeHandlerArguments, Logger, MiddlewareStack } from "@aws-sdk/types";
2+
3+
import { getLoggerPlugin, loggerMiddleware, loggerMiddlewareOptions } from "./loggerMiddleware";
4+
5+
describe("getLoggerPlugin", () => {
6+
const mockClientStack = {
7+
add: jest.fn(),
8+
};
9+
10+
afterEach(() => {
11+
jest.clearAllMocks();
12+
});
13+
14+
it("adds loggerMiddleware", () => {
15+
getLoggerPlugin({}).applyToStack((mockClientStack as unknown) as MiddlewareStack<any, any>);
16+
expect(mockClientStack.add).toHaveBeenCalledTimes(1);
17+
expect(mockClientStack.add.mock.calls[0][1]).toEqual(loggerMiddlewareOptions);
18+
});
19+
});
20+
21+
describe("loggerMiddleware", () => {
22+
const next = jest.fn();
23+
24+
const args = {
25+
input: {
26+
inputKey: "inputValue",
27+
},
28+
request: {
29+
method: "GET",
30+
headers: {},
31+
},
32+
};
33+
34+
const mockResponse = {
35+
response: {
36+
statusCode: 200,
37+
headers: {},
38+
},
39+
output: {
40+
$metadata: {
41+
statusCode: 200,
42+
requestId: "requestId",
43+
},
44+
outputKey: "outputValue",
45+
},
46+
};
47+
48+
beforeEach(() => {
49+
next.mockResolvedValueOnce(mockResponse);
50+
});
51+
52+
afterEach(() => {
53+
jest.clearAllMocks();
54+
});
55+
56+
it("returns without logging if context.logger is not defined", async () => {
57+
const response = await loggerMiddleware()(next, {})(args as FinalizeHandlerArguments<any>);
58+
expect(next).toHaveBeenCalledTimes(1);
59+
expect(response).toStrictEqual(mockResponse);
60+
});
61+
62+
it("returns without logging if context.logger doesn't have debug/info functions", async () => {
63+
const logger = {} as Logger;
64+
const response = await loggerMiddleware()(next, { logger })(args as FinalizeHandlerArguments<any>);
65+
expect(next).toHaveBeenCalledTimes(1);
66+
expect(response).toStrictEqual(mockResponse);
67+
});
68+
69+
it("logs $metadata, input, output if context.logger has info function", async () => {
70+
const logger = ({ info: jest.fn() } as unknown) as Logger;
71+
72+
const inputFilterSensitiveLog = jest.fn().mockImplementationOnce((input) => input);
73+
const outputFilterSensitiveLog = jest.fn().mockImplementationOnce((output) => output);
74+
const context = {
75+
logger,
76+
inputFilterSensitiveLog,
77+
outputFilterSensitiveLog,
78+
};
79+
80+
const response = await loggerMiddleware()(next, context)(args as FinalizeHandlerArguments<any>);
81+
expect(next).toHaveBeenCalledTimes(1);
82+
expect(response).toStrictEqual(mockResponse);
83+
84+
expect(inputFilterSensitiveLog).toHaveBeenCalledTimes(1);
85+
expect(outputFilterSensitiveLog).toHaveBeenCalledTimes(1);
86+
expect(logger.info).toHaveBeenCalledTimes(1);
87+
88+
const {
89+
output: { $metadata, ...outputWithoutMetadata },
90+
} = mockResponse;
91+
expect(logger.info).toHaveBeenCalledWith({
92+
$metadata,
93+
input: args.input,
94+
output: outputWithoutMetadata,
95+
});
96+
});
97+
98+
it("logs httpRequest, httpResponse if context.logger has debug function", async () => {
99+
const logger = ({ debug: jest.fn() } as unknown) as Logger;
100+
const response = await loggerMiddleware()(next, { logger })(args as FinalizeHandlerArguments<any>);
101+
expect(next).toHaveBeenCalledTimes(1);
102+
expect(response).toStrictEqual(mockResponse);
103+
104+
expect(logger.debug).toHaveBeenCalledTimes(2);
105+
expect(logger.debug).toHaveBeenNthCalledWith(1, {
106+
httpRequest: args.request,
107+
});
108+
expect(logger.debug).toHaveBeenNthCalledWith(2, {
109+
httpResponse: mockResponse.response,
110+
});
111+
});
112+
});

0 commit comments

Comments
 (0)