UNPKG

@cloud-carbon-footprint/aws

Version:

The core logic to get cloud usage data and estimate energy and carbon emissions from Amazon Web Services.

163 lines (140 loc) 4.45 kB
/* * © 2021 Thoughtworks, Inc. */ import GCPCredentials from '../application/GCPCredentials' import { ChainableTemporaryCredentials, WebIdentityCredentials } from 'aws-sdk' import Mock = jest.Mock const Credentials = jest.requireActual('aws-sdk').Credentials jest.mock('aws-sdk', () => { return { ChainableTemporaryCredentials: jest.fn(), WebIdentityCredentials: jest.fn(), Credentials: jest.requireActual('aws-sdk').Credentials, } }) const authClientMock = { email: 'test@test.com' } const mockToken = 'some-token' jest.mock('google-auth-library', () => { return { GoogleAuth: jest.fn().mockImplementation(() => ({ getClient: jest.fn().mockResolvedValue(authClientMock), getProjectId: jest.fn().mockResolvedValue('test-project.id'), })), } }) jest.mock('@google-cloud/iam-credentials', () => { return { IAMCredentialsClient: jest.fn().mockImplementation(() => ({ generateIdToken: jest.fn().mockResolvedValue([{ token: mockToken }]), })), } }) function mockChainableTemporaryCredentials( targetAccessKeyId: string, targetSecretAccessKey: string, targetSessionToken: string, ) { const chainableTemporaryCredentials = ChainableTemporaryCredentials as unknown as Mock chainableTemporaryCredentials.mockImplementationOnce(() => { return new Credentials( targetAccessKeyId, targetSecretAccessKey, targetSessionToken, ) }) return chainableTemporaryCredentials } function mockWebIdentityCredentials( targetAccessKeyId: string, targetSecretAccessKey: string, targetSessionToken: string, ) { const webIdentityCredentials = WebIdentityCredentials as unknown as Mock const credentials = new Credentials( targetAccessKeyId, targetSecretAccessKey, targetSessionToken, ) webIdentityCredentials.mockImplementationOnce(() => { return credentials }) return { webIdentityCredentials, webIdentityReturnedCredentials: credentials } } let credentials: any describe('GCPCredentials instance', () => { beforeEach(() => { const accountId = '1233452012' const targetRoleName = 'myRoleName' const proxyAccountId = '11111' const proxyRoleName = 'proxyRoleName' credentials = new GCPCredentials( accountId, targetRoleName, proxyAccountId, proxyRoleName, ) }) it('should set credentials when calling get()', async () => { //given const targetAccessKeyId = 'alsorandomchars' const targetSecretAccessKey = 'verylongstringwithrandomchars' const targetSessionToken = 'hi' mockChainableTemporaryCredentials( targetAccessKeyId, targetSecretAccessKey, targetSessionToken, ) //when await credentials.getPromise() //then expect(credentials.accessKeyId).toEqual(targetAccessKeyId) expect(credentials.secretAccessKey).toEqual(targetSecretAccessKey) expect(credentials.sessionToken).toEqual(targetSessionToken) expect(credentials.expireTime).toBeInstanceOf(Date) }) it('should create ChainableTemporaryCredentials with expected options', async () => { //given const chainableTemporaryCredentials = mockChainableTemporaryCredentials( '', '', '', ) const { webIdentityReturnedCredentials } = mockWebIdentityCredentials( 'a', 'b', 'c', ) const accountId = '1233452012' const targetRoleName = 'myRoleName' const chainableTemporaryCredentialsOptions = { params: { RoleArn: `arn:aws:iam::${accountId}:role/${targetRoleName}`, RoleSessionName: targetRoleName, }, masterCredentials: webIdentityReturnedCredentials, } //when await credentials.getPromise() //then expect(chainableTemporaryCredentials).toHaveBeenCalledWith( chainableTemporaryCredentialsOptions, ) }) it('should create WebIdentityCredentials with expected options', async () => { //given mockChainableTemporaryCredentials('', '', '') const { webIdentityCredentials } = mockWebIdentityCredentials('a', 'b', 'c') const proxyAccountId = '11111' const proxyRoleName = 'proxyRoleName' const webOptions = { RoleArn: `arn:aws:iam::${proxyAccountId}:role/${proxyRoleName}`, RoleSessionName: proxyRoleName, WebIdentityToken: mockToken, } //when await credentials.getPromise() //then expect(webIdentityCredentials).toHaveBeenCalledWith(webOptions) }) })