Upload files to "tests/providers/aws"
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
import { beforeEach, describe, expect, it, mock } from "bun:test";
|
||||
|
||||
const mockStsGetCallerIdentity = mock();
|
||||
const mockFromEnv = mock();
|
||||
const mockFromTokenFile = mock();
|
||||
const mockFromContainerMetadata = mock();
|
||||
const mockFromInstanceMetadata = mock();
|
||||
const mockFromProfile = mock();
|
||||
const mockGetAvailableProfiles = mock();
|
||||
|
||||
mock.module("../../../src/providers/aws/client", () => ({
|
||||
stsGetCallerIdentity: mockStsGetCallerIdentity,
|
||||
}));
|
||||
|
||||
mock.module("../../../src/providers/aws/credentials", () => ({
|
||||
fromEnv: mockFromEnv,
|
||||
fromTokenFile: mockFromTokenFile,
|
||||
fromContainerMetadata: mockFromContainerMetadata,
|
||||
fromInstanceMetadata: mockFromInstanceMetadata,
|
||||
fromProfile: mockFromProfile,
|
||||
getAvailableProfiles: mockGetAvailableProfiles,
|
||||
}));
|
||||
|
||||
import { AwsAccountService } from "../../../src/providers/aws/awsAccount";
|
||||
|
||||
function makeCredentialSource(
|
||||
label: string,
|
||||
resolve: () => Promise<{ accessKeyId: string; secretAccessKey: string; sessionToken?: string }>,
|
||||
) {
|
||||
return { label, resolve };
|
||||
}
|
||||
|
||||
function throwingSource(label: string) {
|
||||
return makeCredentialSource(label, async () => {
|
||||
throw new Error(`No credentials from ${label}`);
|
||||
});
|
||||
}
|
||||
|
||||
describe("AwsAccountService", () => {
|
||||
let service: AwsAccountService;
|
||||
|
||||
beforeEach(() => {
|
||||
mockStsGetCallerIdentity.mockReset();
|
||||
mockFromEnv.mockReset();
|
||||
mockFromTokenFile.mockReset();
|
||||
mockFromContainerMetadata.mockReset();
|
||||
mockFromInstanceMetadata.mockReset();
|
||||
mockFromProfile.mockReset();
|
||||
mockGetAvailableProfiles.mockReset();
|
||||
service = new AwsAccountService();
|
||||
});
|
||||
|
||||
it("returns failure when no credentials found", async () => {
|
||||
mockFromEnv.mockReturnValue(throwingSource("env"));
|
||||
mockFromTokenFile.mockReturnValue(throwingSource("token-file"));
|
||||
mockFromContainerMetadata.mockReturnValue(throwingSource("container-metadata"));
|
||||
mockFromInstanceMetadata.mockReturnValue(throwingSource("instance-metadata"));
|
||||
mockGetAvailableProfiles.mockResolvedValue([]);
|
||||
|
||||
const result = await service.execute();
|
||||
|
||||
expect(result.success).toBe(false);
|
||||
expect(result.error?.message).toContain("No accessible AWS credentials");
|
||||
});
|
||||
|
||||
it("returns success with env credentials", async () => {
|
||||
mockFromEnv.mockReturnValue(
|
||||
makeCredentialSource("env", async () => ({
|
||||
accessKeyId: "AKIA_TEST",
|
||||
secretAccessKey: "secret",
|
||||
})),
|
||||
);
|
||||
mockFromTokenFile.mockReturnValue(throwingSource("token-file"));
|
||||
mockFromContainerMetadata.mockReturnValue(throwingSource("container-metadata"));
|
||||
mockFromInstanceMetadata.mockReturnValue(throwingSource("instance-metadata"));
|
||||
mockGetAvailableProfiles.mockResolvedValue([]);
|
||||
mockStsGetCallerIdentity.mockResolvedValue({
|
||||
account: "123456789012",
|
||||
arn: "arn:aws:iam::123456789012:user/test",
|
||||
userId: "AIDACKCEVSQ6C2EXAMPLE",
|
||||
});
|
||||
|
||||
const result = await service.execute();
|
||||
|
||||
expect(result.success).toBe(true);
|
||||
expect((result.data as any[])[0].source).toBe("env");
|
||||
expect((result.data as any[])[0].account).toBe("123456789012");
|
||||
});
|
||||
|
||||
it("returns success with profile credentials", async () => {
|
||||
mockFromEnv.mockReturnValue(throwingSource("env"));
|
||||
mockFromTokenFile.mockReturnValue(throwingSource("token-file"));
|
||||
mockFromContainerMetadata.mockReturnValue(throwingSource("container-metadata"));
|
||||
mockFromInstanceMetadata.mockReturnValue(throwingSource("instance-metadata"));
|
||||
mockGetAvailableProfiles.mockResolvedValue(["dev", "prod"]);
|
||||
mockFromProfile.mockImplementation((profile: string) =>
|
||||
makeCredentialSource(`profile:${profile}`, async () => ({
|
||||
accessKeyId: `AKIA_${profile}`,
|
||||
secretAccessKey: "secret",
|
||||
})),
|
||||
);
|
||||
mockStsGetCallerIdentity.mockResolvedValue({
|
||||
account: "123456789012",
|
||||
arn: "arn:aws:iam::123456789012:user/test",
|
||||
userId: "AIDACKCEVSQ6C2EXAMPLE",
|
||||
});
|
||||
|
||||
const result = await service.execute();
|
||||
|
||||
expect(result.success).toBe(true);
|
||||
expect((result.data as any[]).length).toBe(2);
|
||||
expect((result.data as any[])[0].source).toBe("profile:dev");
|
||||
expect((result.data as any[])[1].source).toBe("profile:prod");
|
||||
});
|
||||
|
||||
it("continues on profile failure", async () => {
|
||||
mockFromEnv.mockReturnValue(throwingSource("env"));
|
||||
mockFromTokenFile.mockReturnValue(throwingSource("token-file"));
|
||||
mockFromContainerMetadata.mockReturnValue(throwingSource("container-metadata"));
|
||||
mockFromInstanceMetadata.mockReturnValue(throwingSource("instance-metadata"));
|
||||
mockGetAvailableProfiles.mockResolvedValue(["bad", "good"]);
|
||||
mockFromProfile.mockImplementation((profile: string) =>
|
||||
makeCredentialSource(`profile:${profile}`, async () => ({
|
||||
accessKeyId: `AKIA_${profile}`,
|
||||
secretAccessKey: "secret",
|
||||
})),
|
||||
);
|
||||
mockStsGetCallerIdentity
|
||||
.mockRejectedValueOnce(new Error("STS failure"))
|
||||
.mockResolvedValueOnce({
|
||||
account: "123456789012",
|
||||
arn: "arn:aws:iam::123456789012:user/test",
|
||||
userId: "AIDACKCEVSQ6C2EXAMPLE",
|
||||
});
|
||||
|
||||
const result = await service.execute();
|
||||
|
||||
expect(result.success).toBe(true);
|
||||
expect((result.data as any[]).length).toBe(1);
|
||||
expect((result.data as any[])[0].source).toBe("profile:good");
|
||||
});
|
||||
|
||||
it("detects static credentials", async () => {
|
||||
mockFromEnv.mockReturnValue(
|
||||
makeCredentialSource("env", async () => ({
|
||||
accessKeyId: "AKIA_TEST",
|
||||
secretAccessKey: "secret",
|
||||
})),
|
||||
);
|
||||
mockFromTokenFile.mockReturnValue(throwingSource("token-file"));
|
||||
mockFromContainerMetadata.mockReturnValue(throwingSource("container-metadata"));
|
||||
mockFromInstanceMetadata.mockReturnValue(throwingSource("instance-metadata"));
|
||||
mockGetAvailableProfiles.mockResolvedValue([]);
|
||||
mockStsGetCallerIdentity.mockResolvedValue({
|
||||
account: "123456789012",
|
||||
arn: "arn:aws:iam::123456789012:user/test",
|
||||
userId: "AIDACKCEVSQ6C2EXAMPLE",
|
||||
});
|
||||
|
||||
const result = await service.execute();
|
||||
|
||||
expect(result.success).toBe(true);
|
||||
expect((result.data as any[])[0].staticCredentials).toBe(true);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user