1
- import { fromInstanceMetadata } from "@smithy/credential-provider-imds" ;
2
- import { CredentialsProviderError } from "@smithy/property-provider" ;
1
+ import type { Exact } from "@smithy/types" ;
3
2
import { afterEach , beforeEach , describe , expect , it , vi } from "vitest" ;
4
3
5
- import { fromAwsCliV2CompatibleProviderChain } from "./fromAwsCliV2CompatibleProviderChain" ;
4
+ import {
5
+ AwsCliV2CompatibleProviderOptions ,
6
+ fromAwsCliV2CompatibleProviderChain ,
7
+ } from "./fromAwsCliV2CompatibleProviderChain" ;
8
+
9
+ // the options type should have no required fields.
10
+ type Assert = Exact < AwsCliV2CompatibleProviderOptions , Partial < AwsCliV2CompatibleProviderOptions > > ;
11
+ const typeAssertion : Assert = true as const ;
12
+ void typeAssertion ;
6
13
7
14
describe ( "fromAwsCliV2CompatibleProviderChain" , ( ) => {
8
15
let mockFromIni : any ;
9
- let mockFromEnv : any ;
10
- let mockFromTokenFile : any ;
11
- let mockFromSSO : any ;
12
- let mockFromProcess : any ;
13
- let mockFromInstanceMetadata : any ;
16
+ let mockFromNodeProviderChain : any ;
14
17
15
18
const mockLogger = {
16
19
debug : vi . fn ( ) ,
@@ -33,61 +36,14 @@ describe("fromAwsCliV2CompatibleProviderChain", () => {
33
36
fromIni : mockFromIni ,
34
37
} ) ) ;
35
38
36
- mockFromEnv = vi . fn ( async ( ) => ( {
37
- accessKeyId : "ENV_ACCESS_KEY" ,
38
- secretAccessKey : "ENV_SECRET_KEY" ,
39
- } ) ) ;
40
- vi . doMock ( "@aws-sdk/credential-provider-env" , ( ) => ( {
41
- fromEnv : ( ) => mockFromEnv ,
42
- } ) ) ;
43
- mockFromEnv = vi . fn ( async ( ) => {
44
- return {
45
- accessKeyId : "ENV_ACCESS_KEY" ,
46
- secretAccessKey : "ENV_SECRET_KEY" ,
47
- } ;
48
- } ) ;
49
- vi . doMock ( "@aws-sdk/credential-provider-env" , ( ) => ( {
50
- fromEnv : ( ) => mockFromEnv ,
51
- } ) ) ;
52
-
53
- mockFromTokenFile = vi . fn ( async ( ) => {
54
- return {
55
- accessKeyId : "TOKEN_ACCESS_KEY" ,
56
- secretAccessKey : "TOKEN_SECRET_KEY" ,
57
- } ;
58
- } ) ;
59
- vi . doMock ( "@aws-sdk/credential-provider-web-identity" , ( ) => ( {
60
- fromTokenFile : ( ) => mockFromTokenFile ,
61
- } ) ) ;
62
-
63
- mockFromSSO = vi . fn ( async ( ) => {
64
- return {
65
- accessKeyId : "SSO_ACCESS_KEY" ,
66
- secretAccessKey : "SSO_SECRET_KEY" ,
67
- } ;
68
- } ) ;
69
- vi . doMock ( "@aws-sdk/credential-provider-sso" , ( ) => ( {
70
- fromSSO : ( ) => mockFromSSO ,
71
- } ) ) ;
72
-
73
- mockFromProcess = vi . fn ( async ( ) => {
74
- return {
75
- accessKeyId : "PROCESS_ACCESS_KEY" ,
76
- secretAccessKey : "PROCESS_SECRET_KEY" ,
77
- } ;
78
- } ) ;
79
- vi . doMock ( "@aws-sdk/credential-provider-process" , ( ) => ( {
80
- fromProcess : ( ) => mockFromProcess ,
81
- } ) ) ;
82
-
83
- mockFromInstanceMetadata = vi . fn ( async ( ) => {
84
- return {
85
- accessKeyId : "REMOTE_ACCESS_KEY" ,
86
- secretAccessKey : "REMOTE_SECRET_KEY" ,
87
- } ;
88
- } ) ;
89
- vi . doMock ( "@smithy/credential-provider-imds" , ( ) => ( {
90
- fromInstanceMetadata : ( ) => mockFromInstanceMetadata ,
39
+ mockFromNodeProviderChain = vi . fn ( ( ) =>
40
+ vi . fn ( async ( ) => ( {
41
+ accessKeyId : "AWS_SDK_CHAIN_AK" ,
42
+ secretAccessKey : "AWS_SDK_CHAIN_SK" ,
43
+ } ) )
44
+ ) ;
45
+ vi . doMock ( "@aws-sdk/credential-provider-node" , ( ) => ( {
46
+ defaultProvider : mockFromNodeProviderChain ,
91
47
} ) ) ;
92
48
} ) ;
93
49
@@ -109,170 +65,22 @@ describe("fromAwsCliV2CompatibleProviderChain", () => {
109
65
} ) ;
110
66
111
67
expect ( mockFromIni ) . toHaveBeenCalled ( ) ;
112
- expect ( mockLogger . debug ) . toHaveBeenCalledWith ( expect . stringContaining ( "Using fromIni with profile:test-profile" ) ) ;
113
- } ) ;
114
-
115
- it ( "should fall back to environment variables if no profile is provided" , async ( ) => {
116
- const provider = fromAwsCliV2CompatibleProviderChain ( {
117
- logger : mockLogger ,
118
- } ) ;
119
-
120
- const result = await provider ( ) ;
121
-
122
- expect ( result ) . toEqual ( {
123
- accessKeyId : "ENV_ACCESS_KEY" ,
124
- secretAccessKey : "ENV_SECRET_KEY" ,
125
- } ) ;
126
-
127
- expect ( mockFromEnv ) . toHaveBeenCalled ( ) ;
128
- expect ( mockLogger . debug ) . toHaveBeenCalledWith ( expect . stringContaining ( "Using from custom credential chain" ) ) ;
129
- } ) ;
130
-
131
- it ( "should fall back to web identity credentials when environment variables are unavailable" , async ( ) => {
132
- vi . doMock ( "@aws-sdk/credential-provider-env" , ( ) => ( {
133
- fromEnv : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No env credentials" ) ) ,
134
- } ) ) ;
135
-
136
- const provider = fromAwsCliV2CompatibleProviderChain ( { logger : mockLogger } ) ;
137
-
138
- const result = await provider ( ) ;
139
-
140
- expect ( result ) . toEqual ( {
141
- accessKeyId : "TOKEN_ACCESS_KEY" ,
142
- secretAccessKey : "TOKEN_SECRET_KEY" ,
143
- } ) ;
144
-
145
- expect ( mockFromTokenFile ) . toHaveBeenCalled ( ) ;
146
- } ) ;
147
-
148
- it ( "should fall back to SSO credentials when web identity is unavailable" , async ( ) => {
149
- vi . doMock ( "@aws-sdk/credential-provider-env" , ( ) => ( {
150
- fromEnv : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No env credentials" ) ) ,
151
- } ) ) ;
152
- vi . doMock ( "@aws-sdk/credential-provider-web-identity" , ( ) => ( {
153
- fromTokenFile : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No token file" ) ) ,
154
- } ) ) ;
155
-
156
- const provider = fromAwsCliV2CompatibleProviderChain ( { logger : mockLogger } ) ;
157
-
158
- const result = await provider ( ) ;
159
-
160
- expect ( result ) . toEqual ( {
161
- accessKeyId : "SSO_ACCESS_KEY" ,
162
- secretAccessKey : "SSO_SECRET_KEY" ,
163
- } ) ;
164
-
165
- expect ( mockFromSSO ) . toHaveBeenCalled ( ) ;
166
- } ) ;
167
-
168
- it ( "should fall back to process credentials when SSO is unavailable" , async ( ) => {
169
- vi . doMock ( "@aws-sdk/credential-provider-env" , ( ) => ( {
170
- fromEnv : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No env credentials" ) ) ,
171
- } ) ) ;
172
-
173
- vi . doMock ( "@aws-sdk/credential-provider-ini" , ( ) => ( {
174
- fromIni : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No ini credentials" ) ) ,
175
- } ) ) ;
176
-
177
- vi . doMock ( "@aws-sdk/credential-provider-web-identity" , ( ) => ( {
178
- fromTokenFile : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No token file" ) ) ,
179
- } ) ) ;
180
-
181
- vi . doMock ( "@aws-sdk/credential-provider-sso" , ( ) => ( {
182
- fromSSO : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No SSO credentials" ) ) ,
183
- } ) ) ;
184
-
185
- mockFromProcess = vi . fn ( ) . mockResolvedValue ( {
186
- accessKeyId : "PROCESS_ACCESS_KEY" ,
187
- secretAccessKey : "PROCESS_SECRET_KEY" ,
188
- } ) ;
189
-
190
- vi . doMock ( "@aws-sdk/credential-provider-process" , ( ) => ( {
191
- fromProcess : ( ) => mockFromProcess ,
192
- } ) ) ;
193
-
194
- vi . doMock ( "@smithy/credential-provider-imds" , ( ) => ( {
195
- fromInstanceMetadata : ( ) => mockFromInstanceMetadata ,
196
- } ) ) ;
197
-
198
- const { fromAwsCliV2CompatibleProviderChain } = await import ( "./fromAwsCliV2CompatibleProviderChain" ) ;
199
- const provider = fromAwsCliV2CompatibleProviderChain ( {
200
- logger : mockLogger ,
201
- } ) ;
202
-
203
- const result = await provider ( ) ;
204
-
205
- expect ( result ) . toEqual ( {
206
- accessKeyId : "PROCESS_ACCESS_KEY" ,
207
- secretAccessKey : "PROCESS_SECRET_KEY" ,
208
- } ) ;
209
- expect ( mockFromProcess ) . toHaveBeenCalled ( ) ;
68
+ expect ( mockLogger . debug ) . toHaveBeenCalledWith (
69
+ `@aws-sdk/credential-providers - fromAwsCliV2CompatibleProviderChain - Using fromIni with profile: test-profile`
70
+ ) ;
210
71
} ) ;
211
72
212
- it ( "should fall back to remote credentials when process credentials are unavailable" , async ( ) => {
213
- vi . doMock ( "@aws-sdk/credential-provider-env" , ( ) => ( {
214
- fromEnv : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No env credentials" ) ) ,
215
- } ) ) ;
216
-
217
- vi . doMock ( "@aws-sdk/credential-provider-ini" , ( ) => ( {
218
- fromIni : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No ini credentials" ) ) ,
219
- } ) ) ;
220
-
221
- vi . doMock ( "@aws-sdk/credential-provider-web-identity" , ( ) => ( {
222
- fromTokenFile : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No token file" ) ) ,
223
- } ) ) ;
224
-
225
- vi . doMock ( "@aws-sdk/credential-provider-sso" , ( ) => ( {
226
- fromSSO : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No SSO credentials" ) ) ,
227
- } ) ) ;
228
-
229
- vi . doMock ( "@aws-sdk/credential-provider-process" , ( ) => ( {
230
- fromProcess : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No process credentials" ) ) ,
231
- } ) ) ;
232
-
233
- mockFromInstanceMetadata = vi . fn ( ) . mockResolvedValue ( {
234
- accessKeyId : "REMOTE_ACCESS_KEY" ,
235
- secretAccessKey : "REMOTE_SECRET_KEY" ,
236
- } ) ;
237
-
238
- vi . doMock ( "@smithy/credential-provider-imds" , ( ) => ( {
239
- fromInstanceMetadata : ( ) => mockFromInstanceMetadata ,
240
- } ) ) ;
241
-
242
- const { fromAwsCliV2CompatibleProviderChain } = await import ( "./fromAwsCliV2CompatibleProviderChain" ) ;
73
+ it . only ( "should fall back to fromNodeProviderChain when no profile is specified" , async ( ) => {
243
74
const provider = fromAwsCliV2CompatibleProviderChain ( {
244
- logger : mockLogger ,
75
+ logger : console ,
245
76
} ) ;
246
77
247
78
const result = await provider ( ) ;
248
79
249
80
expect ( result ) . toEqual ( {
250
- accessKeyId : "REMOTE_ACCESS_KEY " ,
251
- secretAccessKey : "REMOTE_SECRET_KEY " ,
81
+ accessKeyId : "AWS_SDK_CHAIN_AK " ,
82
+ secretAccessKey : "AWS_SDK_CHAIN_SK " ,
252
83
} ) ;
253
- expect ( mockFromInstanceMetadata ) . toHaveBeenCalled ( ) ;
254
- } ) ;
255
-
256
- it ( "should throw error when no credentials are found" , async ( ) => {
257
- vi . doMock ( "@aws-sdk/credential-provider-env" , ( ) => ( {
258
- fromEnv : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No env credentials" ) ) ,
259
- } ) ) ;
260
- vi . doMock ( "@aws-sdk/credential-provider-web-identity" , ( ) => ( {
261
- fromTokenFile : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No token file" ) ) ,
262
- } ) ) ;
263
- vi . doMock ( "@aws-sdk/credential-provider-sso" , ( ) => ( {
264
- fromSSO : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No SSO credentials" ) ) ,
265
- } ) ) ;
266
- vi . doMock ( "@aws-sdk/credential-provider-process" , ( ) => ( {
267
- fromProcess : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No process credentials" ) ) ,
268
- } ) ) ;
269
- vi . doMock ( "@smithy/credential-provider-imds" , ( ) => ( {
270
- fromInstanceMetadata : ( ) => ( ) => Promise . reject ( new CredentialsProviderError ( "No remote credentials" ) ) ,
271
- } ) ) ;
272
- const { fromAwsCliV2CompatibleProviderChain } = await import ( "./fromAwsCliV2CompatibleProviderChain" ) ;
273
- const provider = fromAwsCliV2CompatibleProviderChain ( { logger : mockLogger } ) ;
274
-
275
- await expect ( provider ( ) ) . rejects . toThrow ( CredentialsProviderError ) ;
276
- await expect ( provider ( ) ) . rejects . toThrow ( "Could not load credentials from any providers" ) ;
84
+ expect ( mockFromNodeProviderChain ) . toHaveBeenCalled ( ) ;
277
85
} ) ;
278
86
} ) ;
0 commit comments