Skip to content

Commit 2f59fc6

Browse files
committed
test(eventstream-handler-node): mock EventSigningStream in beforeEach
1 parent a3b14d0 commit 2f59fc6

File tree

2 files changed

+30
-16
lines changed

2 files changed

+30
-16
lines changed

packages/eventstream-handler-node/src/EventStreamPayloadHandler.spec.ts

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1+
import { Decoder, Encoder, EventSigner, FinalizeHandler, FinalizeHandlerArguments, HttpRequest } from "@aws-sdk/types";
12
import { once } from "events";
23
import { PassThrough, Readable } from "stream";
34

4-
const mockSingingStream = jest.fn().mockImplementation(() => new PassThrough());
5-
jest.mock("./EventSigningStream", () => ({
6-
EventSigningStream: mockSingingStream,
7-
}));
8-
import { Decoder, Encoder, EventSigner, FinalizeHandler, FinalizeHandlerArguments, HttpRequest } from "@aws-sdk/types";
9-
5+
import { EventSigningStream } from "./EventSigningStream";
106
import { EventStreamPayloadHandler } from "./EventStreamPayloadHandler";
117

8+
jest.mock("./EventSigningStream");
9+
1210
describe("EventStreamPayloadHandler", () => {
1311
const mockSigner: EventSigner = {
1412
sign: jest.fn(),
@@ -18,6 +16,7 @@ describe("EventStreamPayloadHandler", () => {
1816
const mockNextHandler: FinalizeHandler<any, any> = jest.fn();
1917

2018
beforeEach(() => {
19+
(EventSigningStream as unknown as jest.Mock).mockImplementation(() => new PassThrough());
2120
jest.clearAllMocks();
2221
});
2322

@@ -36,24 +35,24 @@ describe("EventStreamPayloadHandler", () => {
3635
});
3736

3837
it("should close the request payload if downstream middleware throws", async () => {
39-
expect.assertions(2);
40-
(mockNextHandler as any).mockImplementationOnce(() => Promise.reject(new Error()));
38+
const mockError = new Error("mockError");
39+
(mockNextHandler as any).mockImplementationOnce(() => Promise.reject(mockError));
4140
const handler = new EventStreamPayloadHandler({
4241
eventSigner: () => Promise.resolve(mockSigner),
4342
utf8Decoder: mockUtf8Decoder,
4443
utf8Encoder: mockUtf8encoder,
4544
});
4645
const mockRequest = { body: new Readable() } as HttpRequest;
47-
let error;
46+
4847
try {
4948
await handler.handle(mockNextHandler, {
5049
request: mockRequest,
5150
input: {},
5251
});
53-
} catch (e) {
54-
error = e;
52+
fail(`Expected ${mockError} to be thrown.`);
53+
} catch (error) {
54+
expect(error).toBe(mockError);
5555
}
56-
expect(error instanceof Error).toBe(true);
5756

5857
// Expect stream is closed
5958
// Ref: should use writableEnded when bumped to Node 13+
@@ -66,23 +65,31 @@ describe("EventStreamPayloadHandler", () => {
6665
});
6766

6867
it("should call event signer with request signature from signing middleware", async () => {
69-
const authorization =
70-
"AWS4-HMAC-SHA256 Credential=AKID/20200510/us-west-2/foo/aws4_request, SignedHeaders=host, Signature=1234567890";
68+
const priorSignature = "1234567890";
69+
const authorization = `AWS4-HMAC-SHA256 Credential=AKID/20200510/us-west-2/foo/aws4_request, SignedHeaders=host, Signature=${priorSignature}`;
70+
7171
const mockRequest = {
7272
body: new PassThrough(),
7373
headers: { authorization },
7474
} as any;
75+
7576
const handler = new EventStreamPayloadHandler({
7677
eventSigner: () => Promise.resolve(mockSigner),
7778
utf8Decoder: mockUtf8Decoder,
7879
utf8Encoder: mockUtf8encoder,
7980
});
81+
8082
await handler.handle(mockNextHandler, {
8183
request: mockRequest,
8284
input: {},
8385
});
84-
expect(mockSingingStream.mock.calls.length).toBe(1);
85-
expect(mockSingingStream.mock.calls[0][0].priorSignature).toBe("1234567890");
86+
87+
expect(EventSigningStream).toHaveBeenCalledTimes(1);
88+
expect(EventSigningStream).toHaveBeenCalledWith({
89+
priorSignature,
90+
eventMarshaller: expect.anything(),
91+
eventSigner: expect.anything(),
92+
});
8693
});
8794

8895
it("should start piping to request payload through event signer if downstream middleware returns", async () => {

packages/eventstream-handler-node/src/EventStreamPayloadHandler.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export interface EventStreamPayloadHandlerOptions {
3232
export class EventStreamPayloadHandler implements IEventStreamPayloadHandler {
3333
private readonly eventSigner: Provider<EventSigner>;
3434
private readonly eventMarshaller: EventMarshaller;
35+
3536
constructor(options: EventStreamPayloadHandlerOptions) {
3637
this.eventSigner = options.eventSigner;
3738
this.eventMarshaller = new EventMarshaller(options.utf8Encoder, options.utf8Decoder);
@@ -45,13 +46,16 @@ export class EventStreamPayloadHandler implements IEventStreamPayloadHandler {
4546
): Promise<FinalizeHandlerOutput<T>> {
4647
const request = args.request as HttpRequest;
4748
const { body: payload } = request;
49+
4850
if (!(payload instanceof Readable)) {
4951
throw new Error("Eventstream payload must be a Readable stream.");
5052
}
53+
5154
const payloadStream = payload as Readable;
5255
request.body = new PassThrough({
5356
objectMode: true,
5457
});
58+
5559
let result: FinalizeHandlerOutput<any>;
5660
try {
5761
result = await next(args);
@@ -61,6 +65,7 @@ export class EventStreamPayloadHandler implements IEventStreamPayloadHandler {
6165
request.body.end();
6266
throw e;
6367
}
68+
6469
// If response is successful, start piping the payload stream
6570
const match = (request.headers["authorization"] || "").match(/Signature=([\w]+)$/);
6671
// Sign the eventstream based on the signature from initial request.
@@ -70,11 +75,13 @@ export class EventStreamPayloadHandler implements IEventStreamPayloadHandler {
7075
eventMarshaller: this.eventMarshaller,
7176
eventSigner: await this.eventSigner(),
7277
});
78+
7379
pipeline(payloadStream, signingStream, request.body, (err) => {
7480
if (err) {
7581
throw err;
7682
}
7783
});
84+
7885
return result;
7986
}
8087
}

0 commit comments

Comments
 (0)