Skip to content

Commit 3b734ad

Browse files
authored
More command tests (#23)
This adds testing for all commands except SSH.
1 parent 7f5e7f3 commit 3b734ad

File tree

18 files changed

+368
-32
lines changed

18 files changed

+368
-32
lines changed

__mocks__/@firebase/auth.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export const getAuth = jest.fn().mockReturnValue({});
2+
3+
export const signInWithCredential = jest.fn();
4+
5+
export const SignInMethod = {
6+
GOOGLE: "google.com",
7+
};
8+
9+
export class OAuthProvider {
10+
credential() {
11+
return "test-credential";
12+
}
13+
}

__mocks__/firebase/firestore.ts

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,37 @@
1-
import { noop } from "lodash";
2-
31
export const doc = jest.fn();
42

3+
export const getCollection = jest.fn();
4+
5+
export const getDoc = jest.fn();
6+
57
export const getFirestore = jest.fn().mockReturnValue({});
68

79
let snapshotCallbacks: ((snapshot: object) => void)[] = [];
810

11+
/** Triggerable mock onSnapshot
12+
*
13+
* Usage:
14+
* ```
15+
* import { onSnapshot } from "firebase/firestore";
16+
*
17+
* beforeEach(() => {
18+
* (onSnapshot as any).clear();
19+
* })
20+
*
21+
* test(..., () => {
22+
* // call code under test here
23+
* (onSnapshot as any).trigger(data)
24+
* })
25+
* ```
26+
*
27+
* Note that only one `onSnapshot` may be tested at a time.
28+
*/
929
export const onSnapshot = Object.assign(
1030
jest.fn().mockImplementation((_doc, cb) => {
1131
snapshotCallbacks.push(cb);
12-
return noop;
32+
return () => {
33+
snapshotCallbacks = [];
34+
};
1335
}),
1436
{
1537
clear: (snapshotCallbacks = []),
@@ -21,4 +43,6 @@ export const onSnapshot = Object.assign(
2143
}
2244
);
2345

46+
export const query = jest.fn();
47+
2448
export const terminate = jest.fn();

jest.config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
/** @type {import('ts-jest').JestConfigWithTsJest} */
22
module.exports = {
3+
testRegex: ".*\\.test\\.ts$",
4+
prettierPath: null,
35
preset: "ts-jest",
46
testEnvironment: "node",
57
modulePathIgnorePatterns: ["/build"],
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`login organization exists should write the user's identity to the file system 1`] = `
4+
[
5+
[
6+
"/path/to/home/.p0",
7+
"{
8+
"credential": {
9+
"access_token": "test-access-token",
10+
"id_token": "test-id-token",
11+
"token_type": "oidc",
12+
"scope": "oidc",
13+
"expires_in": 3600,
14+
"refresh_token": "test-refresh-token",
15+
"device_secret": "test-device-secret",
16+
"expires_at": 1600003599
17+
},
18+
"org": {
19+
"slug": "test-org",
20+
"tenantId": "test-tenant",
21+
"ssoProvider": "google"
22+
}
23+
}",
24+
{
25+
"mode": "600",
26+
},
27+
],
28+
]
29+
`;
30+
31+
exports[`login organization exists validates authentication 1`] = `
32+
[
33+
[
34+
{
35+
"tenantId": "test-tenant",
36+
},
37+
"test-credential",
38+
],
39+
]
40+
`;

src/commands/__tests__/login.test.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { pluginLoginMap } from "../../plugins/login";
2+
import { mockGetDoc } from "../../testing/firestore";
3+
import { login } from "../login";
4+
import { signInWithCredential } from "firebase/auth";
5+
import { readFile, writeFile } from "fs/promises";
6+
7+
jest.spyOn(Date, "now").mockReturnValue(1.6e12);
8+
jest.mock("fs/promises");
9+
jest.mock("../../drivers/auth", () => ({
10+
...jest.requireActual("../../drivers/auth"),
11+
IDENTITY_FILE_PATH: "/path/to/home/.p0",
12+
}));
13+
jest.mock("../../drivers/stdio");
14+
jest.mock("../../plugins/login");
15+
16+
const mockReadFile = readFile as jest.Mock;
17+
const mockWriteFile = writeFile as jest.Mock;
18+
19+
describe("login", () => {
20+
it("prints a friendly error if the org is not found", async () => {
21+
mockGetDoc(undefined);
22+
await expect(login({ org: "test-org" })).rejects.toMatchInlineSnapshot(
23+
`"Could not find organization"`
24+
);
25+
});
26+
it("should print a friendly error if unsupported login", async () => {
27+
mockGetDoc({
28+
slug: "test-org",
29+
tenantId: "test-tenant",
30+
ssoProvider: "microsoft",
31+
});
32+
await expect(login({ org: "test-org" })).rejects.toMatchInlineSnapshot(
33+
`"Unsupported login for your organization"`
34+
);
35+
});
36+
describe("organization exists", () => {
37+
let credentialData: string = "";
38+
mockReadFile.mockImplementation(async () =>
39+
Buffer.from(credentialData, "utf-8")
40+
);
41+
mockWriteFile.mockImplementation(async (_path, data) => {
42+
credentialData = data;
43+
});
44+
beforeEach(() => {
45+
credentialData = "";
46+
jest.clearAllMocks();
47+
mockGetDoc({
48+
slug: "test-org",
49+
tenantId: "test-tenant",
50+
ssoProvider: "google",
51+
});
52+
});
53+
it("should call the provider's login function", async () => {
54+
await login({ org: "test-org" });
55+
expect(pluginLoginMap.google).toHaveBeenCalled();
56+
});
57+
it("should write the user's identity to the file system", async () => {
58+
await login({ org: "test-org" });
59+
expect(mockWriteFile.mock.calls).toMatchSnapshot();
60+
});
61+
it("validates authentication", async () => {
62+
await login({ org: "test-org" });
63+
expect((signInWithCredential as jest.Mock).mock.calls).toMatchSnapshot();
64+
});
65+
});
66+
});

src/commands/__tests__/ls.test.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { fetchCommand } from "../../drivers/api";
22
import { print1, print2 } from "../../drivers/stdio";
3+
import { failure } from "../../testing/yargs";
34
import { lsCommand } from "../ls";
45
import yargs from "yargs";
56

@@ -25,7 +26,7 @@ describe("ls", () => {
2526
});
2627

2728
it("should print list response", async () => {
28-
await lsCommand(yargs).parse(command);
29+
await lsCommand(yargs()).parse(command);
2930
expect(mockPrint1.mock.calls).toMatchSnapshot();
3031
expect(mockPrint2.mock.calls).toMatchSnapshot();
3132
});
@@ -51,14 +52,7 @@ Unknown argument: foo`,
5152
});
5253

5354
it("should print error message", async () => {
54-
let error: any;
55-
try {
56-
await lsCommand(yargs)
57-
.fail((_, err) => (error = err))
58-
.parse(command);
59-
} catch (thrown: any) {
60-
error = thrown;
61-
}
55+
const error = await failure(lsCommand(yargs()), command);
6256
expect(error).toMatchSnapshot();
6357
});
6458
});

src/commands/__tests__/request.test.ts

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { fetchCommand } from "../../drivers/api";
22
import { print1, print2 } from "../../drivers/stdio";
3+
import { failure } from "../../testing/yargs";
34
import { RequestResponse } from "../../types/request";
45
import { sleep } from "../../util";
56
import { requestCommand } from "../request";
@@ -40,7 +41,7 @@ describe("request", () => {
4041
(isPreexisting, isPersistent, should) => {
4142
it(`should${should ? "" : " not"} print request response`, async () => {
4243
mockFetch({ isPreexisting, isPersistent });
43-
await requestCommand(yargs).parse(command);
44+
await requestCommand(yargs()).parse(command);
4445
expect(mockPrint2.mock.calls).toMatchSnapshot();
4546
expect(mockPrint1).not.toHaveBeenCalled();
4647
});
@@ -49,7 +50,7 @@ describe("request", () => {
4950

5051
it("should wait for access", async () => {
5152
mockFetch();
52-
const promise = requestCommand(yargs).parse(`${command} --wait`);
53+
const promise = requestCommand(yargs()).parse(`${command} --wait`);
5354
const wait = sleep(10);
5455
await expect(wait).resolves.toBeUndefined();
5556
(onSnapshot as any).trigger({
@@ -83,14 +84,7 @@ Unknown argument: foo`,
8384
});
8485

8586
it("should print error message", async () => {
86-
let error: any;
87-
try {
88-
await requestCommand(yargs)
89-
.fail((_, err) => (error = err))
90-
.parse(command);
91-
} catch (thrown: any) {
92-
error = thrown;
93-
}
87+
const error = await failure(requestCommand(yargs()), command);
9488
expect(error).toMatchSnapshot();
9589
});
9690
});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export const samlResponse = `<html>
2+
<body>
3+
<input name="SAMLResponse" type="hidden" value="PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxzYW1sMnA6UmVzcG9uc2UgeG1sbnM6c2FtbDJwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgRGVzdGluYXRpb249Imh0dHBzOi8vc2lnbmluLmF3cy5hbWF6b24uY29tL3NhbWwiIElEPSJhYmMiIElzc3VlSW5zdGFudD0iMjAyNC0wMS0wMVQwMDowMDowMC4wMDBaIiBWZXJzaW9uPSIyLjAiPgogIDxzYW1sMjpJc3N1ZXIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6ZW50aXR5Ij5odHRwOi8vd3d3Lm9rdGEuY29tL2FiY2RlZjwvc2FtbDI6SXNzdWVyPgogIDxkczpTaWduYXR1cmUgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgogICAgPGRzOlNpZ25lZEluZm8+CiAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+CiAgICAgIDxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNyc2Etc2hhMjU2Ii8+CiAgICAgIDxkczpSZWZlcmVuY2UgVVJJPSIjYWJjIj4KICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4KICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPgogICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyI+CiAgICAgICAgICAgIDxlYzpJbmNsdXNpdmVOYW1lc3BhY2VzIHhtbG5zOmVjPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiIFByZWZpeExpc3Q9InhzIi8+CiAgICAgICAgICA8L2RzOlRyYW5zZm9ybT4KICAgICAgICA8L2RzOlRyYW5zZm9ybXM+CiAgICAgICAgPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIvPgogICAgICAgIDxkczpEaWdlc3RWYWx1ZT5kaWdlc3Q8L2RzOkRpZ2VzdFZhbHVlPgogICAgICA8L2RzOlJlZmVyZW5jZT4KICAgIDwvZHM6U2lnbmVkSW5mbz4KICAgIDxkczpTaWduYXR1cmVWYWx1ZT5zaWduYXR1cmU8L2RzOlNpZ25hdHVyZVZhbHVlPgogICAgPGRzOktleUluZm8+CiAgICAgIDxkczpYNTA5RGF0YT4KICAgICAgICA8ZHM6WDUwOUNlcnRpZmljYXRlPmNlcnRpZmljYXRlPC9kczpYNTA5Q2VydGlmaWNhdGU+CiAgICAgIDwvZHM6WDUwOURhdGE+CiAgICA8L2RzOktleUluZm8+CiAgPC9kczpTaWduYXR1cmU+CiAgPHNhbWwycDpTdGF0dXMgeG1sbnM6c2FtbDJwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiPgogICAgPHNhbWwycDpTdGF0dXNDb2RlIFZhbHVlPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6c3RhdHVzOlN1Y2Nlc3MiLz4KICA8L3NhbWwycDpTdGF0dXM+CiAgPHNhbWwyOkFzc2VydGlvbiB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBJRD0iYWJjIiBJc3N1ZUluc3RhbnQ9IjIwMjQtMDEtMDFUMDA6MDA6MDAuMDAwWiIgVmVyc2lvbj0iMi4wIj4KICAgIDxzYW1sMjpJc3N1ZXIgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6ZW50aXR5Ij5odHRwOi8vd3d3Lm9rdGEuY29tL2FiY2RlZjwvc2FtbDI6SXNzdWVyPgogICAgPGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CiAgICAgIDxkczpTaWduZWRJbmZvPgogICAgICAgIDxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+CiAgICAgICAgPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZHNpZy1tb3JlI3JzYS1zaGEyNTYiLz4KICAgICAgICA8ZHM6UmVmZXJlbmNlIFVSST0iI2lkODQ3NzcyOTk3NzUzMjMwMTkyNzA4ODcwOCI+CiAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4KICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+CiAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiPgogICAgICAgICAgICAgIDxlYzpJbmNsdXNpdmVOYW1lc3BhY2VzIHhtbG5zOmVjPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiIFByZWZpeExpc3Q9InhzIi8+CiAgICAgICAgICAgIDwvZHM6VHJhbnNmb3JtPgogICAgICAgICAgPC9kczpUcmFuc2Zvcm1zPgogICAgICAgICAgPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jI3NoYTI1NiIvPgogICAgICAgICAgPGRzOkRpZ2VzdFZhbHVlPmRpZ2VzdDwvZHM6RGlnZXN0VmFsdWU+CiAgICAgICAgPC9kczpSZWZlcmVuY2U+CiAgICAgIDwvZHM6U2lnbmVkSW5mbz4KICAgICAgPGRzOlNpZ25hdHVyZVZhbHVlPnNpZ25hdHVyZTwvZHM6U2lnbmF0dXJlVmFsdWU+CiAgICAgIDxkczpLZXlJbmZvPgogICAgICAgIDxkczpYNTA5RGF0YT4KICAgICAgICAgIDxkczpYNTA5Q2VydGlmaWNhdGU+Y2VydGlmaWNhdGU8L2RzOlg1MDlDZXJ0aWZpY2F0ZT4KICAgICAgICA8L2RzOlg1MDlEYXRhPgogICAgICA8L2RzOktleUluZm8+CiAgICA8L2RzOlNpZ25hdHVyZT4KICAgIDxzYW1sMjpTdWJqZWN0IHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIj4KICAgICAgPHNhbWwyOk5hbWVJRCBGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpuYW1laWQtZm9ybWF0OnVuc3BlY2lmaWVkIj50ZXN0LXVzZXJAdGVzdC5jb208L3NhbWwyOk5hbWVJRD4KICAgICAgPHNhbWwyOlN1YmplY3RDb25maXJtYXRpb24gTWV0aG9kPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6Y206YmVhcmVyIj4KICAgICAgICA8c2FtbDI6U3ViamVjdENvbmZpcm1hdGlvbkRhdGEgTm90T25PckFmdGVyPSIyMDI0LTAxLTAxVDAwOjAwOjAwLjAwMFoiIFJlY2lwaWVudD0iaHR0cHM6Ly9zaWduaW4uYXdzLmFtYXpvbi5jb20vc2FtbCIvPgogICAgICA8L3NhbWwyOlN1YmplY3RDb25maXJtYXRpb24+CiAgICA8L3NhbWwyOlN1YmplY3Q+CiAgICA8c2FtbDI6Q29uZGl0aW9ucyB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiIgTm90QmVmb3JlPSIyMDI0LTAxLTAxVDAwOjAwOjAwLjAwMFoiIE5vdE9uT3JBZnRlcj0iMjAyNC0wMS0wMVQwMDowMDowMC4wMDBaIj4KICAgICAgPHNhbWwyOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICAgICAgPHNhbWwyOkF1ZGllbmNlPnVybjphbWF6b246d2Vic2VydmljZXM8L3NhbWwyOkF1ZGllbmNlPgogICAgICA8L3NhbWwyOkF1ZGllbmNlUmVzdHJpY3Rpb24+CiAgICA8L3NhbWwyOkNvbmRpdGlvbnM+CiAgICA8c2FtbDI6QXV0aG5TdGF0ZW1lbnQgeG1sbnM6c2FtbDI9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIEF1dGhuSW5zdGFudD0iMjAyNC0wMS0wMVQwMDowMDowMC4wMDBaIiBTZXNzaW9uSW5kZXg9ImFiYyI+CiAgICAgIDxzYW1sMjpBdXRobkNvbnRleHQ+CiAgICAgICAgPHNhbWwyOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkUHJvdGVjdGVkVHJhbnNwb3J0PC9zYW1sMjpBdXRobkNvbnRleHRDbGFzc1JlZj4KICAgICAgPC9zYW1sMjpBdXRobkNvbnRleHQ+CiAgICA8L3NhbWwyOkF1dGhuU3RhdGVtZW50PgogICAgPHNhbWwyOkF0dHJpYnV0ZVN0YXRlbWVudCB4bWxuczpzYW1sMj0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmFzc2VydGlvbiI+CiAgICAgIDxzYW1sMjpBdHRyaWJ1dGUgTmFtZT0iaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9TQU1ML0F0dHJpYnV0ZXMvUm9sZSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1cmkiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPmFybjphd3M6aWFtOjoxOnNhbWwtcHJvdmlkZXIvdGVzdF9va3RhLGFybjphd3M6aWFtOjoxOnJvbGUvUm9sZTE8L3NhbWwyOkF0dHJpYnV0ZVZhbHVlPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPmFybjphd3M6aWFtOjoxOnNhbWwtcHJvdmlkZXIvdGVzdF9va3RhLGFybjphd3M6aWFtOjoxOnJvbGUvUm9sZTI8L3NhbWwyOkF0dHJpYnV0ZVZhbHVlPgogICAgICA8L3NhbWwyOkF0dHJpYnV0ZT4KICAgICAgPHNhbWwyOkF0dHJpYnV0ZSBOYW1lPSJodHRwczovL2F3cy5hbWF6b24uY29tL1NBTUwvQXR0cmlidXRlcy9Sb2xlU2Vzc2lvbk5hbWUiIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3QtdXNlckB0ZXN0LmNvbTwvc2FtbDI6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDI6QXR0cmlidXRlPgogICAgICA8c2FtbDI6QXR0cmlidXRlIE5hbWU9Imh0dHBzOi8vYXdzLmFtYXpvbi5jb20vU0FNTC9BdHRyaWJ1dGVzL1Nlc3Npb25EdXJhdGlvbiIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDpiYXNpYyI+CiAgICAgICAgPHNhbWwyOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+MzYwMDwvc2FtbDI6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDI6QXR0cmlidXRlPgogICAgICA8c2FtbDI6QXR0cmlidXRlIE5hbWU9Imh0dHBzOi8vYXdzLmFtYXpvbi5jb20vU0FNTC9BdHRyaWJ1dGVzL1ByaW5jaXBhbFRhZzpvcmciIE5hbWVGb3JtYXQ9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphdHRybmFtZS1mb3JtYXQ6YmFzaWMiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3Q8L3NhbWwyOkF0dHJpYnV0ZVZhbHVlPgogICAgICA8L3NhbWwyOkF0dHJpYnV0ZT4KICAgICAgPHNhbWwyOkF0dHJpYnV0ZSBOYW1lPSJodHRwczovL2F3cy5hbWF6b24uY29tL1NBTUwvQXR0cmlidXRlcy9Tb3VyY2VJZGVudGl0eSIgTmFtZUZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmF0dHJuYW1lLWZvcm1hdDp1cmkiPgogICAgICAgIDxzYW1sMjpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnRlc3QtdXNlckB0ZXN0LmNvbTwvc2FtbDI6QXR0cmlidXRlVmFsdWU+CiAgICAgIDwvc2FtbDI6QXR0cmlidXRlPgogICAgPC9zYW1sMjpBdHRyaWJ1dGVTdGF0ZW1lbnQ+CiAgPC9zYW1sMjpBc3NlcnRpb24+Cjwvc2FtbDJwOlJlc3BvbnNlPg==" />
4+
</body>
5+
</html>`;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
export const stsResponse = `<AssumeRoleWithSAMLResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
2+
<AssumeRoleWithSAMLResult>
3+
<Audience>https://signin.aws.amazon.com/saml</Audience>
4+
<AssumedRoleUser>
5+
<AssumedRoleId>ABCDEFGHIJLMNOPQRST:test-user@test.com</AssumedRoleId>
6+
<Arn>arn:aws:sts::1:assumed-role/Role1/test-user@test.com</Arn>
7+
</AssumedRoleUser>
8+
<Credentials>
9+
<AccessKeyId>test-access-key</AccessKeyId>
10+
<SecretAccessKey>secret-access-key</SecretAccessKey>
11+
<SessionToken>session-token</SessionToken>
12+
<Expiration>2024-02-22T00:18:21Z</Expiration>
13+
</Credentials>
14+
<Subject>test-user@test.com</Subject>
15+
<NameQualifier>abcdefghijklmnop</NameQualifier>
16+
<SourceIdentity>test-user@test.com</SourceIdentity>
17+
<PackedPolicySize>2</PackedPolicySize>
18+
<SubjectType>unspecified</SubjectType>
19+
<Issuer>http://www.okta.com/abc</Issuer>
20+
</AssumeRoleWithSAMLResult>
21+
<ResponseMetadata>
22+
<RequestId>f5b94ad4-f322-4d7b-b568-84f2ec184cd7</RequestId>
23+
</ResponseMetadata>
24+
</AssumeRoleWithSAMLResponse>`;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`aws role a single installed account with Okta SAML assume should assume a role: stderr 1`] = `
4+
[
5+
[
6+
"Execute the following commands:
7+
",
8+
],
9+
[
10+
"
11+
Or, populate these environment variables using BASH command substitution:
12+
13+
$(p0 aws role assume Role1)
14+
",
15+
],
16+
]
17+
`;
18+
19+
exports[`aws role a single installed account with Okta SAML assume should assume a role: stdout 1`] = `
20+
[
21+
[
22+
" export AWS_ACCESS_KEY_ID=test-access-key
23+
export AWS_SECRET_ACCESS_KEY=secret-access-key
24+
export AWS_SESSION_TOKEN=session-token",
25+
],
26+
]
27+
`;
28+
29+
exports[`aws role a single installed account with Okta SAML ls lists roles: stderr 1`] = `
30+
[
31+
[
32+
"Your available roles for account 1:",
33+
],
34+
]
35+
`;
36+
37+
exports[`aws role a single installed account with Okta SAML ls lists roles: stdout 1`] = `
38+
[
39+
[
40+
" Role1
41+
Role2",
42+
],
43+
]
44+
`;

0 commit comments

Comments
 (0)