@@ -9,16 +9,18 @@ import { getChecksumAlgorithmForRequest } from "./getChecksumAlgorithmForRequest
9
9
import { getChecksumLocationName } from "./getChecksumLocationName" ;
10
10
import { FlexibleChecksumsMiddlewareConfig } from "./getFlexibleChecksumsPlugin" ;
11
11
import { hasHeader } from "./hasHeader" ;
12
+ import { isStreaming } from "./isStreaming" ;
12
13
import { selectChecksumAlgorithmFunction } from "./selectChecksumAlgorithmFunction" ;
13
14
import { validateChecksumFromResponse } from "./validateChecksumFromResponse" ;
14
15
15
16
jest . mock ( "@aws-sdk/protocol-http" ) ;
17
+ jest . mock ( "./getChecksum" ) ;
16
18
jest . mock ( "./getChecksumAlgorithmForRequest" ) ;
17
19
jest . mock ( "./getChecksumLocationName" ) ;
18
- jest . mock ( "./selectChecksumAlgorithmFunction" ) ;
19
- jest . mock ( "./getChecksum" ) ;
20
20
jest . mock ( "./hasHeader" ) ;
21
+ jest . mock ( "./isStreaming" ) ;
21
22
jest . mock ( "./validateChecksumFromResponse" ) ;
23
+ jest . mock ( "./selectChecksumAlgorithmFunction" ) ;
22
24
23
25
describe ( flexibleChecksumsMiddleware . name , ( ) => {
24
26
const mockNext = jest . fn ( ) ;
@@ -31,8 +33,8 @@ describe(flexibleChecksumsMiddleware.name, () => {
31
33
const mockConfig = { } as PreviouslyResolved ;
32
34
const mockMiddlewareConfig = { input : mockInput } as FlexibleChecksumsMiddlewareConfig ;
33
35
34
- const mockBody = { } ;
35
- const mockHeaders = { } ;
36
+ const mockBody = { body : "mockBody" } ;
37
+ const mockHeaders = { "content-length" : 100 } ;
36
38
const mockRequest = { body : mockBody , headers : mockHeaders } ;
37
39
const mockArgs = { request : mockRequest } as BuildHandlerArguments < any > ;
38
40
const mockResult = { response : { } } ;
@@ -41,19 +43,20 @@ describe(flexibleChecksumsMiddleware.name, () => {
41
43
mockNext . mockResolvedValueOnce ( mockResult ) ;
42
44
const { isInstance } = HttpRequest ;
43
45
( isInstance as unknown as jest . Mock ) . mockReturnValue ( true ) ;
46
+ ( getChecksum as jest . Mock ) . mockReturnValue ( mockChecksum ) ;
44
47
( getChecksumAlgorithmForRequest as jest . Mock ) . mockReturnValue ( ChecksumAlgorithm . MD5 ) ;
45
48
( getChecksumLocationName as jest . Mock ) . mockReturnValue ( mockChecksumLocationName ) ;
46
- ( selectChecksumAlgorithmFunction as jest . Mock ) . mockReturnValue ( mockChecksumAlgorithmFunction ) ;
47
- ( getChecksum as jest . Mock ) . mockReturnValue ( mockChecksum ) ;
48
49
( hasHeader as jest . Mock ) . mockReturnValue ( false ) ;
50
+ ( isStreaming as jest . Mock ) . mockReturnValue ( false ) ;
51
+ ( selectChecksumAlgorithmFunction as jest . Mock ) . mockReturnValue ( mockChecksumAlgorithmFunction ) ;
49
52
} ) ;
50
53
51
54
afterEach ( ( ) => {
52
55
expect ( mockNext ) . toHaveBeenCalledTimes ( 1 ) ;
53
56
jest . clearAllMocks ( ) ;
54
57
} ) ;
55
58
56
- describe ( "skips checksum computation " , ( ) => {
59
+ describe ( "skips" , ( ) => {
57
60
it ( "if not an instance of HttpRequest" , async ( ) => {
58
61
const { isInstance } = HttpRequest ;
59
62
( isInstance as unknown as jest . Mock ) . mockReturnValue ( false ) ;
@@ -65,7 +68,6 @@ describe(flexibleChecksumsMiddleware.name, () => {
65
68
describe ( "request checksum" , ( ) => {
66
69
afterEach ( ( ) => {
67
70
expect ( getChecksumAlgorithmForRequest ) . toHaveBeenCalledTimes ( 1 ) ;
68
- expect ( selectChecksumAlgorithmFunction ) . not . toHaveBeenCalled ( ) ;
69
71
expect ( getChecksum ) . not . toHaveBeenCalled ( ) ;
70
72
} ) ;
71
73
@@ -75,6 +77,7 @@ describe(flexibleChecksumsMiddleware.name, () => {
75
77
await handler ( mockArgs ) ;
76
78
expect ( getChecksumLocationName ) . not . toHaveBeenCalled ( ) ;
77
79
expect ( mockNext ) . toHaveBeenCalledWith ( mockArgs ) ;
80
+ expect ( selectChecksumAlgorithmFunction ) . not . toHaveBeenCalled ( ) ;
78
81
} ) ;
79
82
80
83
it ( "if header is already present" , async ( ) => {
@@ -87,6 +90,7 @@ describe(flexibleChecksumsMiddleware.name, () => {
87
90
( hasHeader as jest . Mock ) . mockReturnValue ( true ) ;
88
91
await handler ( mockArgsWithChecksumHeader ) ;
89
92
expect ( getChecksumLocationName ) . toHaveBeenCalledTimes ( 1 ) ;
93
+ expect ( selectChecksumAlgorithmFunction ) . toHaveBeenCalledTimes ( 1 ) ;
90
94
expect ( hasHeader ) . toHaveBeenCalledTimes ( 1 ) ;
91
95
expect ( mockNext ) . toHaveBeenCalledWith ( mockArgsWithChecksumHeader ) ;
92
96
expect ( hasHeader ) . toHaveBeenCalledWith ( mockChecksumLocationName , mockHeadersWithChecksumHeader ) ;
@@ -112,21 +116,57 @@ describe(flexibleChecksumsMiddleware.name, () => {
112
116
} ) ;
113
117
} ) ;
114
118
115
- it ( "adds checksum in the request header" , async ( ) => {
116
- const handler = flexibleChecksumsMiddleware ( mockConfig , mockMiddlewareConfig ) ( mockNext , { } ) ;
117
- await handler ( mockArgs ) ;
118
- expect ( getChecksumLocationName ) . toHaveBeenCalledTimes ( 1 ) ;
119
- expect ( hasHeader ) . toHaveBeenCalledTimes ( 1 ) ;
120
- expect ( mockNext ) . toHaveBeenCalledWith ( {
121
- ...mockArgs ,
122
- request : {
123
- ...mockRequest ,
124
- headers : { ...mockHeaders , [ mockChecksumLocationName ] : mockChecksum } ,
125
- } ,
119
+ describe ( "adds checksum in the request header" , ( ) => {
120
+ afterEach ( ( ) => {
121
+ expect ( getChecksumAlgorithmForRequest ) . toHaveBeenCalledTimes ( 1 ) ;
122
+ expect ( getChecksumLocationName ) . toHaveBeenCalledTimes ( 1 ) ;
123
+ expect ( selectChecksumAlgorithmFunction ) . toHaveBeenCalledTimes ( 1 ) ;
124
+ } ) ;
125
+
126
+ it ( "for streaming body" , async ( ) => {
127
+ ( isStreaming as jest . Mock ) . mockReturnValue ( true ) ;
128
+ const mockUpdatedBody = { body : "mockUpdatedBody" } ;
129
+ const mockGetAwsChunkedEncodingStream = jest . fn ( ) . mockReturnValue ( mockUpdatedBody ) ;
130
+
131
+ const handler = flexibleChecksumsMiddleware (
132
+ { ...mockConfig , getAwsChunkedEncodingStream : mockGetAwsChunkedEncodingStream } ,
133
+ mockMiddlewareConfig
134
+ ) ( mockNext , { } ) ;
135
+ await handler ( mockArgs ) ;
136
+
137
+ expect ( mockNext ) . toHaveBeenCalledWith ( {
138
+ ...mockArgs ,
139
+ request : {
140
+ ...mockRequest ,
141
+ headers : {
142
+ ...mockHeaders ,
143
+ "content-length" : undefined ,
144
+ "content-encoding" : "aws-chunked" ,
145
+ "transfer-encoding" : "chunked" ,
146
+ "x-amz-decoded-content-length" : mockHeaders [ "content-length" ] ,
147
+ "x-amz-content-sha256" : "STREAMING-UNSIGNED-PAYLOAD-TRAILER" ,
148
+ "x-amz-trailer" : mockChecksumLocationName ,
149
+ } ,
150
+ body : mockUpdatedBody ,
151
+ } ,
152
+ } ) ;
153
+ expect ( mockGetAwsChunkedEncodingStream ) . toHaveBeenCalledTimes ( 1 ) ;
154
+ } ) ;
155
+
156
+ it ( "for non-streaming body" , async ( ) => {
157
+ const handler = flexibleChecksumsMiddleware ( mockConfig , mockMiddlewareConfig ) ( mockNext , { } ) ;
158
+ await handler ( mockArgs ) ;
159
+ expect ( hasHeader ) . toHaveBeenCalledTimes ( 1 ) ;
160
+ expect ( mockNext ) . toHaveBeenCalledWith ( {
161
+ ...mockArgs ,
162
+ request : {
163
+ ...mockRequest ,
164
+ headers : { ...mockHeaders , [ mockChecksumLocationName ] : mockChecksum } ,
165
+ } ,
166
+ } ) ;
167
+ expect ( hasHeader ) . toHaveBeenCalledWith ( mockChecksumLocationName , mockHeaders ) ;
168
+ expect ( getChecksum ) . toHaveBeenCalledTimes ( 1 ) ;
126
169
} ) ;
127
- expect ( hasHeader ) . toHaveBeenCalledWith ( mockChecksumLocationName , mockHeaders ) ;
128
- expect ( selectChecksumAlgorithmFunction ) . toHaveBeenCalledTimes ( 1 ) ;
129
- expect ( getChecksum ) . toHaveBeenCalledTimes ( 1 ) ;
130
170
} ) ;
131
171
132
172
it ( "validates checksum from the response header" , async ( ) => {
0 commit comments