1
1
import { AssumeRoleCommand , STSClient } from "@aws-sdk/nested-clients/sts" ;
2
- import { beforeEach , describe , expect , test as it , vi } from "vitest" ;
2
+ import { afterEach , beforeEach , describe , expect , test as it , vi } from "vitest" ;
3
3
4
- import { fromTemporaryCredentials } from "./fromTemporaryCredentials" ;
4
+ import { fromTemporaryCredentials as fromTemporaryCredentialsNode } from "./fromTemporaryCredentials" ;
5
+ import { fromTemporaryCredentials } from "./fromTemporaryCredentials.browser" ;
5
6
6
7
const mockSend = vi . fn ( ) ;
7
8
const mockUsePlugin = vi . fn ( ) ;
@@ -55,7 +56,7 @@ describe("fromTemporaryCredentials", () => {
55
56
clientConfig : { region } ,
56
57
clientPlugins : [ plugin ] ,
57
58
} ;
58
- const provider = fromTemporaryCredentials ( options ) ;
59
+ const provider = fromTemporaryCredentialsNode ( options ) ;
59
60
const credential = await provider ( ) ;
60
61
expect ( credential ) . toEqual ( {
61
62
accessKeyId : "ACCESS_KEY_ID" ,
@@ -77,7 +78,7 @@ describe("fromTemporaryCredentials", () => {
77
78
78
79
it ( "should create STS client if not supplied" , async ( ) => {
79
80
const plugin = { applyToStack : ( ) => { } } ;
80
- const provider = fromTemporaryCredentials ( {
81
+ const provider = fromTemporaryCredentialsNode ( {
81
82
params : {
82
83
RoleArn,
83
84
RoleSessionName,
@@ -93,19 +94,8 @@ describe("fromTemporaryCredentials", () => {
93
94
expect ( mockUsePlugin ) . toHaveBeenNthCalledWith ( 1 , plugin ) ;
94
95
} ) ;
95
96
96
- it ( "should resolve default credentials if master credential is not supplied" , async ( ) => {
97
- const provider = fromTemporaryCredentials ( {
98
- params : {
99
- RoleArn,
100
- RoleSessionName,
101
- } ,
102
- } ) ;
103
- await provider ( ) ;
104
- expect ( vi . mocked ( STSClient as any ) ) . toHaveBeenCalledWith ( { } ) ;
105
- } ) ;
106
-
107
97
it ( "should create a role session name if none provided" , async ( ) => {
108
- const provider = fromTemporaryCredentials ( {
98
+ const provider = fromTemporaryCredentialsNode ( {
109
99
params : { RoleArn } ,
110
100
} ) ;
111
101
await provider ( ) ;
@@ -115,6 +105,94 @@ describe("fromTemporaryCredentials", () => {
115
105
} ) ;
116
106
} ) ;
117
107
108
+ describe ( "nested sts credential resolution order" , ( ) => {
109
+ const masterCredentials = vi . fn ( ) ;
110
+ const clientConfigCredentials = vi . fn ( ) ;
111
+ const callerClientCredentials = vi . fn ( ) ;
112
+ const callerClientCredentialsProvider = ( ) => callerClientCredentials ;
113
+ const chainCredentials = vi . fn ( ) ;
114
+ const chainCredentialsProvider = ( ) => chainCredentials ;
115
+
116
+ it ( "should use with 1st priority masterCredentials from the provider" , async ( ) => {
117
+ const provider = fromTemporaryCredentials (
118
+ {
119
+ params : { RoleArn } ,
120
+ masterCredentials : masterCredentials ,
121
+ clientConfig : {
122
+ credentials : clientConfigCredentials ,
123
+ } ,
124
+ } ,
125
+ chainCredentialsProvider
126
+ ) ;
127
+ await provider ( {
128
+ callerClientConfig : {
129
+ region : async ( ) => "us-west-2" ,
130
+ credentialDefaultProvider : callerClientCredentialsProvider ,
131
+ } ,
132
+ } ) ;
133
+ expect ( masterCredentials ) . toHaveBeenCalled ( ) ;
134
+ expect ( clientConfigCredentials ) . not . toHaveBeenCalled ( ) ;
135
+ expect ( callerClientCredentials ) . not . toHaveBeenCalled ( ) ;
136
+ expect ( chainCredentials ) . not . toHaveBeenCalled ( ) ;
137
+ } ) ;
138
+ it ( "should use with 2nd priority options.clientConfig.credentials" , async ( ) => {
139
+ const provider = fromTemporaryCredentials (
140
+ {
141
+ params : { RoleArn } ,
142
+ clientConfig : {
143
+ credentials : clientConfigCredentials ,
144
+ } ,
145
+ } ,
146
+ chainCredentialsProvider
147
+ ) ;
148
+ await provider ( {
149
+ callerClientConfig : {
150
+ region : async ( ) => "us-west-2" ,
151
+ credentialDefaultProvider : callerClientCredentialsProvider ,
152
+ } ,
153
+ } ) ;
154
+ expect ( masterCredentials ) . not . toHaveBeenCalled ( ) ;
155
+ expect ( clientConfigCredentials ) . toHaveBeenCalled ( ) ;
156
+ expect ( callerClientCredentials ) . not . toHaveBeenCalled ( ) ;
157
+ expect ( chainCredentials ) . not . toHaveBeenCalled ( ) ;
158
+ } ) ;
159
+ it ( "should use with 3rd priority caller client's credentialDefaultProvider" , async ( ) => {
160
+ const provider = fromTemporaryCredentials (
161
+ {
162
+ params : { RoleArn } ,
163
+ } ,
164
+ chainCredentialsProvider
165
+ ) ;
166
+ await provider ( {
167
+ callerClientConfig : {
168
+ region : async ( ) => "us-west-2" ,
169
+ credentialDefaultProvider : callerClientCredentialsProvider ,
170
+ } ,
171
+ } ) ;
172
+ expect ( masterCredentials ) . not . toHaveBeenCalled ( ) ;
173
+ expect ( clientConfigCredentials ) . not . toHaveBeenCalled ( ) ;
174
+ expect ( callerClientCredentials ) . toHaveBeenCalled ( ) ;
175
+ expect ( chainCredentials ) . not . toHaveBeenCalled ( ) ;
176
+ } ) ;
177
+ it ( "should use with 4th priority the node default provider chain (if in Node.js)" , async ( ) => {
178
+ const provider = fromTemporaryCredentials (
179
+ {
180
+ params : { RoleArn } ,
181
+ } ,
182
+ chainCredentialsProvider
183
+ ) ;
184
+ await provider ( {
185
+ callerClientConfig : {
186
+ region : async ( ) => "us-west-2" ,
187
+ } ,
188
+ } ) ;
189
+ expect ( masterCredentials ) . not . toHaveBeenCalled ( ) ;
190
+ expect ( clientConfigCredentials ) . not . toHaveBeenCalled ( ) ;
191
+ expect ( callerClientCredentials ) . not . toHaveBeenCalled ( ) ;
192
+ expect ( chainCredentials ) . toHaveBeenCalled ( ) ;
193
+ } ) ;
194
+ } ) ;
195
+
118
196
it ( "should allow assume roles assuming roles assuming roles ad infinitum" , async ( ) => {
119
197
const roleArnOf = ( id : string ) => `arn:aws:iam::123456789:role/${ id } ` ;
120
198
const idOf = ( roleArn : string ) => roleArn . split ( "/" ) ?. [ 1 ] ?? "UNKNOWN" ;
@@ -176,7 +254,7 @@ describe("fromTemporaryCredentials", () => {
176
254
const SerialNumber = "SERIAL_NUMBER" ;
177
255
const mfaCode = "MFA_CODE" ;
178
256
const mfaCodeProvider = vi . fn ( ) . mockResolvedValue ( mfaCode ) ;
179
- const provider = fromTemporaryCredentials ( {
257
+ const provider = fromTemporaryCredentialsNode ( {
180
258
params : { RoleArn, SerialNumber, RoleSessionName } ,
181
259
mfaCodeProvider,
182
260
} ) ;
@@ -197,7 +275,7 @@ describe("fromTemporaryCredentials", () => {
197
275
it ( "should reject the promise with a terminal error if a MFA serial presents but mfaCodeProvider is missing" , async ( ) => {
198
276
const SerialNumber = "SERIAL_NUMBER" ;
199
277
try {
200
- await fromTemporaryCredentials ( {
278
+ await fromTemporaryCredentialsNode ( {
201
279
params : { RoleArn, SerialNumber, RoleSessionName } ,
202
280
} ) ( ) ;
203
281
fail ( "this test must fail" ) ;
0 commit comments