11import { AssumeRoleCommand , STSClient } from "@aws-sdk/nested-clients/sts" ;
22import { 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,80 @@ 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 chainCredentials = vi . fn ( ) ;
113+
114+ it ( "should use with 1st priority masterCredentials from the provider" , async ( ) => {
115+ const provider = fromTemporaryCredentials (
116+ {
117+ params : { RoleArn } ,
118+ masterCredentials : masterCredentials ,
119+ clientConfig : {
120+ credentials : clientConfigCredentials ,
121+ } ,
122+ } ,
123+ chainCredentials
124+ ) ;
125+ await provider ( {
126+ callerClientConfig : {
127+ region : async ( ) => "us-west-2" ,
128+ credentialDefaultProvider : callerClientCredentials ,
129+ } ,
130+ } ) ;
131+ expect ( masterCredentials ) . toHaveBeenCalled ( ) ;
132+ } ) ;
133+ it ( "should use with 2nd priority options.clientConfig.credentials" , async ( ) => {
134+ const provider = fromTemporaryCredentials (
135+ {
136+ params : { RoleArn } ,
137+ clientConfig : {
138+ credentials : clientConfigCredentials ,
139+ } ,
140+ } ,
141+ chainCredentials
142+ ) ;
143+ await provider ( {
144+ callerClientConfig : {
145+ region : async ( ) => "us-west-2" ,
146+ credentialDefaultProvider : callerClientCredentials ,
147+ } ,
148+ } ) ;
149+ expect ( clientConfigCredentials ) . toHaveBeenCalled ( ) ;
150+ } ) ;
151+ it ( "should use with 3rd priority caller client's credentialDefaultProvider" , async ( ) => {
152+ const provider = fromTemporaryCredentials (
153+ {
154+ params : { RoleArn } ,
155+ } ,
156+ chainCredentials
157+ ) ;
158+ await provider ( {
159+ callerClientConfig : {
160+ region : async ( ) => "us-west-2" ,
161+ credentialDefaultProvider : callerClientCredentials ,
162+ } ,
163+ } ) ;
164+ expect ( callerClientCredentials ) . toHaveBeenCalled ( ) ;
165+ } ) ;
166+ it ( "should use with 4th priority the node default provider chain (if in Node.js)" , async ( ) => {
167+ const provider = fromTemporaryCredentials (
168+ {
169+ params : { RoleArn } ,
170+ } ,
171+ chainCredentials
172+ ) ;
173+ await provider ( {
174+ callerClientConfig : {
175+ region : async ( ) => "us-west-2" ,
176+ } ,
177+ } ) ;
178+ expect ( chainCredentials ) . toHaveBeenCalled ( ) ;
179+ } ) ;
180+ } ) ;
181+
118182 it ( "should allow assume roles assuming roles assuming roles ad infinitum" , async ( ) => {
119183 const roleArnOf = ( id : string ) => `arn:aws:iam::123456789:role/${ id } ` ;
120184 const idOf = ( roleArn : string ) => roleArn . split ( "/" ) ?. [ 1 ] ?? "UNKNOWN" ;
@@ -176,7 +240,7 @@ describe("fromTemporaryCredentials", () => {
176240 const SerialNumber = "SERIAL_NUMBER" ;
177241 const mfaCode = "MFA_CODE" ;
178242 const mfaCodeProvider = vi . fn ( ) . mockResolvedValue ( mfaCode ) ;
179- const provider = fromTemporaryCredentials ( {
243+ const provider = fromTemporaryCredentialsNode ( {
180244 params : { RoleArn, SerialNumber, RoleSessionName } ,
181245 mfaCodeProvider,
182246 } ) ;
@@ -197,7 +261,7 @@ describe("fromTemporaryCredentials", () => {
197261 it ( "should reject the promise with a terminal error if a MFA serial presents but mfaCodeProvider is missing" , async ( ) => {
198262 const SerialNumber = "SERIAL_NUMBER" ;
199263 try {
200- await fromTemporaryCredentials ( {
264+ await fromTemporaryCredentialsNode ( {
201265 params : { RoleArn, SerialNumber, RoleSessionName } ,
202266 } ) ( ) ;
203267 fail ( "this test must fail" ) ;
0 commit comments