@@ -37,7 +37,7 @@ describe('assumeRole', () => {
3737 } ) ;
3838
3939 describe ( 'with system credentials' , ( ) => {
40- it ( 'should successfully assume role using system credentials' , async ( ) => {
40+ it ( 'should successfully assume role using system credentials by environment ' , async ( ) => {
4141 const credentials : AwsAssumeRoleCredentialsType = {
4242 region : 'us-east-1' ,
4343 customEndpoints : false ,
@@ -113,6 +113,82 @@ describe('assumeRole', () => {
113113 ) ;
114114 } ) ;
115115
116+ it ( 'should successfully assume role using system credentials by instanceMetadata' , async ( ) => {
117+ const credentials : AwsAssumeRoleCredentialsType = {
118+ region : 'us-east-1' ,
119+ customEndpoints : false ,
120+ useSystemCredentialsForRole : true ,
121+ roleArn : 'arn:aws:iam::123456789012:role/TestRole' ,
122+ roleSessionName : 'test-session' ,
123+ } ;
124+
125+ const mockSystemCredentials = {
126+ accessKeyId : 'system-access-key' ,
127+ secretAccessKey : 'system-secret-key' ,
128+ sessionToken : 'system-session-token' ,
129+ source : 'instanceMetadata' as const ,
130+ } ;
131+
132+ jest
133+ . spyOn ( systemCredentialsUtils , 'getSystemCredentials' )
134+ . mockResolvedValue ( mockSystemCredentials ) ;
135+
136+ const mockResponse = {
137+ ok : true ,
138+ text : jest . fn ( ) . mockResolvedValue ( `<?xml version="1.0" encoding="UTF-8"?>
139+ <AssumeRoleResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
140+ <AssumeRoleResult>
141+ <Credentials>
142+ <AccessKeyId>assumed-access-key</AccessKeyId>
143+ <SecretAccessKey>assumed-secret-key</SecretAccessKey>
144+ <SessionToken>assumed-session-token</SessionToken>
145+ </Credentials>
146+ </AssumeRoleResult>
147+ </AssumeRoleResponse>` ) ,
148+ } ;
149+
150+ mockFetch . mockResolvedValue ( mockResponse as any ) ;
151+
152+ mockParseString . mockImplementation ( ( _xml , _options , callback ) => {
153+ callback ( null , {
154+ AssumeRoleResponse : {
155+ AssumeRoleResult : {
156+ Credentials : {
157+ AccessKeyId : 'assumed-access-key' ,
158+ SecretAccessKey : 'assumed-secret-key' ,
159+ SessionToken : 'assumed-session-token' ,
160+ } ,
161+ } ,
162+ } ,
163+ } ) ;
164+ } ) ;
165+
166+ const result = await assumeRole ( credentials , 'us-east-1' ) ;
167+
168+ expect ( result ) . toEqual ( {
169+ accessKeyId : 'assumed-access-key' ,
170+ secretAccessKey : 'assumed-secret-key' ,
171+ sessionToken : 'assumed-session-token' ,
172+ } ) ;
173+
174+ expect ( systemCredentialsUtils . getSystemCredentials ) . toHaveBeenCalled ( ) ;
175+ expect ( mockSign ) . toHaveBeenCalledWith (
176+ expect . objectContaining ( {
177+ method : 'POST' ,
178+ path : '/' ,
179+ region : 'us-east-1' ,
180+ } ) ,
181+ mockSystemCredentials ,
182+ ) ;
183+ expect ( mockFetch ) . toHaveBeenCalledWith (
184+ 'https://sts.us-east-1.amazonaws.com' ,
185+ expect . objectContaining ( {
186+ method : 'POST' ,
187+ body : expect . stringContaining ( 'Action=AssumeRole' ) ,
188+ } ) ,
189+ ) ;
190+ } ) ;
191+
116192 it ( 'should throw error when system credentials are not available' , async ( ) => {
117193 const credentials : AwsAssumeRoleCredentialsType = {
118194 region : 'us-east-1' ,
0 commit comments