11import { 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" ;
33
4- import { fromTemporaryCredentials } from "./fromTemporaryCredentials" ;
4+ import { fromTemporaryCredentials as fromTemporaryCredentialsNode } from "./fromTemporaryCredentials" ;
5+ import { fromTemporaryCredentials } from "./fromTemporaryCredentials.browser" ;
56
67const mockSend = vi . fn ( ) ;
78const mockUsePlugin = vi . fn ( ) ;
@@ -55,7 +56,7 @@ describe("fromTemporaryCredentials", () => {
5556 clientConfig : { region } ,
5657 clientPlugins : [ plugin ] ,
5758 } ;
58- const provider = fromTemporaryCredentials ( options ) ;
59+ const provider = fromTemporaryCredentialsNode ( options ) ;
5960 const credential = await provider ( ) ;
6061 expect ( credential ) . toEqual ( {
6162 accessKeyId : "ACCESS_KEY_ID" ,
@@ -77,7 +78,7 @@ describe("fromTemporaryCredentials", () => {
7778
7879 it ( "should create STS client if not supplied" , async ( ) => {
7980 const plugin = { applyToStack : ( ) => { } } ;
80- const provider = fromTemporaryCredentials ( {
81+ const provider = fromTemporaryCredentialsNode ( {
8182 params : {
8283 RoleArn,
8384 RoleSessionName,
@@ -93,19 +94,8 @@ describe("fromTemporaryCredentials", () => {
9394 expect ( mockUsePlugin ) . toHaveBeenNthCalledWith ( 1 , plugin ) ;
9495 } ) ;
9596
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-
10797 it ( "should create a role session name if none provided" , async ( ) => {
108- const provider = fromTemporaryCredentials ( {
98+ const provider = fromTemporaryCredentialsNode ( {
10999 params : { RoleArn } ,
110100 } ) ;
111101 await provider ( ) ;
@@ -115,6 +105,94 @@ describe("fromTemporaryCredentials", () => {
115105 } ) ;
116106 } ) ;
117107
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+
118196 it ( "should allow assume roles assuming roles assuming roles ad infinitum" , async ( ) => {
119197 const roleArnOf = ( id : string ) => `arn:aws:iam::123456789:role/${ id } ` ;
120198 const idOf = ( roleArn : string ) => roleArn . split ( "/" ) ?. [ 1 ] ?? "UNKNOWN" ;
@@ -176,7 +254,7 @@ describe("fromTemporaryCredentials", () => {
176254 const SerialNumber = "SERIAL_NUMBER" ;
177255 const mfaCode = "MFA_CODE" ;
178256 const mfaCodeProvider = vi . fn ( ) . mockResolvedValue ( mfaCode ) ;
179- const provider = fromTemporaryCredentials ( {
257+ const provider = fromTemporaryCredentialsNode ( {
180258 params : { RoleArn, SerialNumber, RoleSessionName } ,
181259 mfaCodeProvider,
182260 } ) ;
@@ -197,7 +275,7 @@ describe("fromTemporaryCredentials", () => {
197275 it ( "should reject the promise with a terminal error if a MFA serial presents but mfaCodeProvider is missing" , async ( ) => {
198276 const SerialNumber = "SERIAL_NUMBER" ;
199277 try {
200- await fromTemporaryCredentials ( {
278+ await fromTemporaryCredentialsNode ( {
201279 params : { RoleArn, SerialNumber, RoleSessionName } ,
202280 } ) ( ) ;
203281 fail ( "this test must fail" ) ;
0 commit comments