@p0security/cli 0.19.8 → 0.19.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/dist/commands/scp.js +7 -1
- package/build/dist/commands/scp.js.map +1 -1
- package/build/dist/commands/ssh.js +7 -1
- package/build/dist/commands/ssh.js.map +1 -1
- package/build/dist/common/auth/server.d.ts +1 -1
- package/build/dist/common/auth/server.js +29 -9
- package/build/dist/common/auth/server.js.map +1 -1
- package/build/dist/common/fetch.d.ts +1 -3
- package/build/dist/common/fetch.js +1 -3
- package/build/dist/common/fetch.js.map +1 -1
- package/build/dist/drivers/config.d.ts +1 -0
- package/build/dist/drivers/config.js +8 -1
- package/build/dist/drivers/config.js.map +1 -1
- package/build/dist/drivers/env.js +2 -0
- package/build/dist/drivers/env.js.map +1 -1
- package/build/dist/middlewares/version.js +7 -0
- package/build/dist/middlewares/version.js.map +1 -1
- package/build/dist/plugins/okta/aws.js +36 -11
- package/build/dist/plugins/okta/aws.js.map +1 -1
- package/build/dist/plugins/okta/login.d.ts +20 -2
- package/build/dist/plugins/okta/login.js +42 -6
- package/build/dist/plugins/okta/login.js.map +1 -1
- package/build/dist/plugins/ssh/index.js +8 -39
- package/build/dist/plugins/ssh/index.js.map +1 -1
- package/build/dist/types/org.d.ts +1 -0
- package/build/dist/version.js +1 -1
- package/build/dist/version.js.map +1 -1
- package/build/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +14 -10
- package/build/dist/commands/__tests__/grant.test.d.ts +0 -1
- package/build/dist/commands/__tests__/grant.test.js +0 -56
- package/build/dist/commands/__tests__/grant.test.js.map +0 -1
- package/build/dist/commands/__tests__/login.test.d.ts +0 -1
- package/build/dist/commands/__tests__/login.test.js +0 -204
- package/build/dist/commands/__tests__/login.test.js.map +0 -1
- package/build/dist/commands/__tests__/ls.test.d.ts +0 -1
- package/build/dist/commands/__tests__/ls.test.js +0 -86
- package/build/dist/commands/__tests__/ls.test.js.map +0 -1
- package/build/dist/commands/__tests__/request.test.d.ts +0 -1
- package/build/dist/commands/__tests__/request.test.js +0 -150
- package/build/dist/commands/__tests__/request.test.js.map +0 -1
- package/build/dist/commands/__tests__/ssh.test.d.ts +0 -1
- package/build/dist/commands/__tests__/ssh.test.js +0 -181
- package/build/dist/commands/__tests__/ssh.test.js.map +0 -1
- package/build/dist/commands/aws/__tests__/__input__/saml-response.d.ts +0 -11
- package/build/dist/commands/aws/__tests__/__input__/saml-response.js +0 -19
- package/build/dist/commands/aws/__tests__/__input__/saml-response.js.map +0 -1
- package/build/dist/commands/aws/__tests__/__input__/sts-response.d.ts +0 -11
- package/build/dist/commands/aws/__tests__/__input__/sts-response.js +0 -38
- package/build/dist/commands/aws/__tests__/__input__/sts-response.js.map +0 -1
- package/build/dist/commands/aws/__tests__/role.test.d.ts +0 -1
- package/build/dist/commands/aws/__tests__/role.test.js +0 -103
- package/build/dist/commands/aws/__tests__/role.test.js.map +0 -1
- package/build/dist/common/__mocks__/keys.d.ts +0 -15
- package/build/dist/common/__mocks__/keys.js +0 -23
- package/build/dist/common/__mocks__/keys.js.map +0 -1
- package/build/dist/drivers/__mocks__/stdio.d.ts +0 -14
- package/build/dist/drivers/__mocks__/stdio.js +0 -26
- package/build/dist/drivers/__mocks__/stdio.js.map +0 -1
- package/build/dist/drivers/__tests__/api.test.d.ts +0 -1
- package/build/dist/drivers/__tests__/api.test.js +0 -688
- package/build/dist/drivers/__tests__/api.test.js.map +0 -1
- package/build/dist/drivers/auth/__mocks__/index.d.ts +0 -30
- package/build/dist/drivers/auth/__mocks__/index.js +0 -47
- package/build/dist/drivers/auth/__mocks__/index.js.map +0 -1
- package/build/dist/plugins/__mocks__/login.d.ts +0 -14
- package/build/dist/plugins/__mocks__/login.js +0 -25
- package/build/dist/plugins/__mocks__/login.js.map +0 -1
- package/build/dist/plugins/aws/__mocks__/assumeRole.d.ts +0 -12
- package/build/dist/plugins/aws/__mocks__/assumeRole.js +0 -22
- package/build/dist/plugins/aws/__mocks__/assumeRole.js.map +0 -1
- package/build/dist/plugins/aws/__tests__/utils.test.d.ts +0 -1
- package/build/dist/plugins/aws/__tests__/utils.test.js +0 -82
- package/build/dist/plugins/aws/__tests__/utils.test.js.map +0 -1
- package/build/tsconfig.tsbuildinfo +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@p0security/cli",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.10",
|
|
4
4
|
"description": "Execute infra CLI commands with P0 grants",
|
|
5
5
|
"main": "index.ts",
|
|
6
6
|
"repository": {
|
|
@@ -54,7 +54,6 @@
|
|
|
54
54
|
"@trivago/prettier-plugin-sort-imports": "^4.3.0",
|
|
55
55
|
"@types/express": "^4.17.21",
|
|
56
56
|
"@types/inquirer": "^9.0.7",
|
|
57
|
-
"@types/jest": "^29.5.12",
|
|
58
57
|
"@types/jsdom": "^21.1.6",
|
|
59
58
|
"@types/lodash": "^4.14.202",
|
|
60
59
|
"@types/node": "^20.17.46",
|
|
@@ -63,6 +62,7 @@
|
|
|
63
62
|
"@types/yargs": "^17.0.13",
|
|
64
63
|
"@typescript-eslint/eslint-plugin": "^6.4.0",
|
|
65
64
|
"@typescript-eslint/parser": "^6.0.0",
|
|
65
|
+
"@vitest/ui": "^3.2.4",
|
|
66
66
|
"esbuild": "^0.25.4",
|
|
67
67
|
"eslint": "^8.56.0",
|
|
68
68
|
"eslint-config-prettier": "^9.1.0",
|
|
@@ -71,19 +71,23 @@
|
|
|
71
71
|
"eslint-plugin-n": "^16.6.2",
|
|
72
72
|
"eslint-plugin-notice": "^0.9.10",
|
|
73
73
|
"eslint-plugin-promise": "^6.1.1",
|
|
74
|
-
"jest": "^29.7.0",
|
|
75
74
|
"prettier": "^3.2.4",
|
|
76
|
-
"ts-
|
|
77
|
-
"
|
|
75
|
+
"ts-node": "^10.9.2",
|
|
76
|
+
"vite-tsconfig-paths": "^5.1.4",
|
|
77
|
+
"vitest": "^3.2.4"
|
|
78
78
|
},
|
|
79
79
|
"scripts": {
|
|
80
|
-
"build": "tsc && cp -r public build/dist/",
|
|
81
|
-
"build:macos": "tsc && cp -r public build/dist/ && node esbuild.js",
|
|
82
|
-
"build:windows": "tsc && xcopy public build\\dist\\ /E /I /Y && node esbuild.js",
|
|
83
|
-
"test
|
|
80
|
+
"build": "tsc --project tsconfig.build.json && cp -r public build/dist/",
|
|
81
|
+
"build:macos": "tsc --project tsconfig.build.json && cp -r public build/dist/ && node esbuild.js",
|
|
82
|
+
"build:windows": "tsc --project tsconfig.build.json && xcopy public build\\dist\\ /E /I /Y && node esbuild.js",
|
|
83
|
+
"test": "yarn test:unit",
|
|
84
|
+
"test:unit": "NODE_ENV=unit vitest run",
|
|
84
85
|
"clean": "rm -rf build",
|
|
85
86
|
"format": "yarn prettier --write .",
|
|
86
|
-
"lint": "yarn
|
|
87
|
+
"lint": "yarn lint:formatting && yarn lint:code && yarn lint:types",
|
|
88
|
+
"lint:formatting": "prettier --check .",
|
|
89
|
+
"lint:code": "eslint --max-warnings 0 .",
|
|
90
|
+
"lint:types": "tsc",
|
|
87
91
|
"p0": "node --no-deprecation ./p0",
|
|
88
92
|
"prepublishOnly": "npm run clean && npm run build"
|
|
89
93
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
/** Copyright © 2024-present P0 Security
|
|
16
|
-
|
|
17
|
-
This file is part of @p0security/cli
|
|
18
|
-
|
|
19
|
-
@p0security/cli is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.
|
|
20
|
-
|
|
21
|
-
@p0security/cli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
22
|
-
|
|
23
|
-
You should have received a copy of the GNU General Public License along with @p0security/cli. If not, see <https://www.gnu.org/licenses/>.
|
|
24
|
-
**/
|
|
25
|
-
const api_1 = require("../../drivers/api");
|
|
26
|
-
const stdio_1 = require("../../drivers/stdio");
|
|
27
|
-
const grant_1 = require("../grant");
|
|
28
|
-
const yargs_1 = __importDefault(require("yargs"));
|
|
29
|
-
jest.mock("../../drivers/api");
|
|
30
|
-
jest.mock("../../drivers/auth");
|
|
31
|
-
jest.mock("../../drivers/stdio");
|
|
32
|
-
const mockFetchCommand = api_1.fetchCommand;
|
|
33
|
-
const mockPrint1 = stdio_1.print1;
|
|
34
|
-
const mockPrint2 = stdio_1.print2;
|
|
35
|
-
describe("grant", () => {
|
|
36
|
-
beforeEach(() => jest.clearAllMocks());
|
|
37
|
-
describe("when valid grant command", () => {
|
|
38
|
-
const command = "grant gcloud role viewer --to someone@test.com --principal-type user";
|
|
39
|
-
function mockFetch() {
|
|
40
|
-
mockFetchCommand.mockResolvedValue({
|
|
41
|
-
ok: true,
|
|
42
|
-
message: "a message",
|
|
43
|
-
id: "abcefg",
|
|
44
|
-
isPreexisting: false,
|
|
45
|
-
isPersistent: false,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
it(`should print request response`, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
49
|
-
mockFetch();
|
|
50
|
-
yield (0, grant_1.grantCommand)((0, yargs_1.default)()).parse(command);
|
|
51
|
-
expect(mockPrint2.mock.calls).toMatchSnapshot();
|
|
52
|
-
expect(mockPrint1).not.toHaveBeenCalled();
|
|
53
|
-
}));
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
//# sourceMappingURL=grant.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grant.test.js","sourceRoot":"","sources":["../../../../src/commands/__tests__/grant.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA;;;;;;;;;GASG;AACH,2CAAiD;AACjD,+CAAqD;AACrD,oCAAwC;AACxC,kDAA0B;AAE1B,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAC/B,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAChC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AAEjC,MAAM,gBAAgB,GAAG,kBAAyB,CAAC;AACnD,MAAM,UAAU,GAAG,cAAmB,CAAC;AACvC,MAAM,UAAU,GAAG,cAAmB,CAAC;AAEvC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAEvC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,MAAM,OAAO,GACX,sEAAsE,CAAC;QAEzE,SAAS,SAAS;YAChB,gBAAgB,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,WAAW;gBACpB,EAAE,EAAE,QAAQ;gBACZ,aAAa,EAAE,KAAK;gBACpB,YAAY,EAAE,KAAK;aACpB,CAAC,CAAC;QACL,CAAC;QAED,EAAE,CAAC,+BAA+B,EAAE,GAAS,EAAE;YAC7C,SAAS,EAAE,CAAC;YACZ,MAAM,IAAA,oBAAY,EAAC,IAAA,eAAK,GAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,EAAE,CAAC;YAChD,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC5C,CAAC,CAAA,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
26
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
27
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
28
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
29
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
30
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
31
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
32
|
-
});
|
|
33
|
-
};
|
|
34
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
-
/** Copyright © 2024-present P0 Security
|
|
36
|
-
|
|
37
|
-
This file is part of @p0security/cli
|
|
38
|
-
|
|
39
|
-
@p0security/cli is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.
|
|
40
|
-
|
|
41
|
-
@p0security/cli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
42
|
-
|
|
43
|
-
You should have received a copy of the GNU General Public License along with @p0security/cli. If not, see <https://www.gnu.org/licenses/>.
|
|
44
|
-
**/
|
|
45
|
-
const api_1 = require("../../drivers/api");
|
|
46
|
-
const auth = __importStar(require("../../drivers/auth"));
|
|
47
|
-
const config = __importStar(require("../../drivers/config"));
|
|
48
|
-
const env_1 = require("../../drivers/env");
|
|
49
|
-
const stdio_1 = require("../../drivers/stdio");
|
|
50
|
-
const login_1 = require("../../plugins/login");
|
|
51
|
-
const login_2 = require("../login");
|
|
52
|
-
const auth_1 = require("firebase/auth");
|
|
53
|
-
const promises_1 = require("fs/promises");
|
|
54
|
-
jest.spyOn(Date, "now").mockReturnValue(1.6e12);
|
|
55
|
-
jest.mock("fs/promises");
|
|
56
|
-
jest.mock("../../drivers/auth/path", () => ({
|
|
57
|
-
getIdentityFilePath: jest.fn(() => "/dummy/identity/file/path"),
|
|
58
|
-
}));
|
|
59
|
-
jest.mock("../../drivers/stdio");
|
|
60
|
-
jest.mock("../../plugins/login");
|
|
61
|
-
jest.mock("../../drivers/api");
|
|
62
|
-
jest.mock("../../util", () => (Object.assign(Object.assign({}, jest.requireActual("../../util")), { getAppName: () => "p0" })));
|
|
63
|
-
const mockIdentity = {
|
|
64
|
-
// @ts-expect-error credential has more fields, this is enough for tests
|
|
65
|
-
credential: {
|
|
66
|
-
expires_at: Date.now() * 1e-3 + 60 * 1000,
|
|
67
|
-
},
|
|
68
|
-
// @ts-expect-error org has more fields, this is enough for tests
|
|
69
|
-
org: {
|
|
70
|
-
tenantId: "test-tenant",
|
|
71
|
-
slug: "test-org",
|
|
72
|
-
ssoProvider: "google",
|
|
73
|
-
},
|
|
74
|
-
token: "test",
|
|
75
|
-
};
|
|
76
|
-
const mockSignInWithCredential = auth_1.signInWithCredential;
|
|
77
|
-
const mockReadFile = promises_1.readFile;
|
|
78
|
-
const mockWriteFile = promises_1.writeFile;
|
|
79
|
-
const mockFetchOrgData = api_1.fetchOrgData;
|
|
80
|
-
describe("login", () => {
|
|
81
|
-
beforeEach(() => {
|
|
82
|
-
jest.spyOn(config, "loadConfig").mockResolvedValueOnce(env_1.defaultConfig);
|
|
83
|
-
jest.spyOn(config, "saveConfig").mockImplementation(jest.fn());
|
|
84
|
-
jest.spyOn(config, "getTenantConfig").mockReturnValue(env_1.defaultConfig);
|
|
85
|
-
// do NOT spyOn getContactMessage — you want the real one
|
|
86
|
-
});
|
|
87
|
-
it("prints a friendly error if the org is not provided", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
88
|
-
yield expect((0, login_2.login)({})).rejects.toMatchInlineSnapshot(`"The organization ID is required. Please provide it as an argument or set the P0_ORG environment variable."`);
|
|
89
|
-
}));
|
|
90
|
-
it("prints a friendly error if the org is not found", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
91
|
-
mockFetchOrgData.mockImplementation(() => {
|
|
92
|
-
throw "Not found";
|
|
93
|
-
});
|
|
94
|
-
yield expect((0, login_2.login)({ org: "test-org" })).rejects.toMatchInlineSnapshot(`"Could not find organization"`);
|
|
95
|
-
}));
|
|
96
|
-
it("prints a friendly error if unsupported login", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
97
|
-
mockFetchOrgData.mockResolvedValue({
|
|
98
|
-
slug: "test-org",
|
|
99
|
-
tenantId: "test-tenant",
|
|
100
|
-
ssoProvider: "microsoft",
|
|
101
|
-
});
|
|
102
|
-
yield expect((0, login_2.login)({ org: "test-org" })).rejects.toMatchInlineSnapshot(`"Unsupported login for your organization"`);
|
|
103
|
-
}));
|
|
104
|
-
describe("identity file does not exist", () => {
|
|
105
|
-
beforeEach(() => {
|
|
106
|
-
jest.clearAllMocks();
|
|
107
|
-
// Mock `readFile` to throw an "ENOENT" error
|
|
108
|
-
mockReadFile.mockImplementation(() => {
|
|
109
|
-
const error = new Error("File not found");
|
|
110
|
-
error.code = "ENOENT";
|
|
111
|
-
return Promise.reject(error);
|
|
112
|
-
});
|
|
113
|
-
mockFetchOrgData.mockResolvedValue({
|
|
114
|
-
slug: "test-org",
|
|
115
|
-
tenantId: "test-tenant",
|
|
116
|
-
ssoProvider: "google",
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
it("it should ask user to log in", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
120
|
-
yield expect((0, login_2.login)({ org: "test-org" })).rejects.toMatchInlineSnapshot(`"Please run \`p0 login <organization>\`."`);
|
|
121
|
-
}));
|
|
122
|
-
});
|
|
123
|
-
describe("organization exists", () => {
|
|
124
|
-
let credentialData = "";
|
|
125
|
-
beforeEach(() => {
|
|
126
|
-
credentialData = "";
|
|
127
|
-
jest.clearAllMocks();
|
|
128
|
-
jest.spyOn(config, "loadConfig").mockResolvedValueOnce(env_1.defaultConfig);
|
|
129
|
-
mockReadFile.mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () { return Buffer.from(credentialData, "utf-8"); }));
|
|
130
|
-
mockWriteFile.mockImplementation((_path, data) => __awaiter(void 0, void 0, void 0, function* () {
|
|
131
|
-
credentialData = data;
|
|
132
|
-
}));
|
|
133
|
-
mockSignInWithCredential.mockImplementation((_auth, _firebaseCredential) => __awaiter(void 0, void 0, void 0, function* () {
|
|
134
|
-
return Promise.resolve({
|
|
135
|
-
user: {
|
|
136
|
-
email: "user@p0.dev",
|
|
137
|
-
getIdToken: jest.fn().mockResolvedValue("mock-id-token"),
|
|
138
|
-
},
|
|
139
|
-
});
|
|
140
|
-
}));
|
|
141
|
-
mockFetchOrgData.mockResolvedValue({
|
|
142
|
-
slug: "test-org",
|
|
143
|
-
tenantId: "test-tenant",
|
|
144
|
-
ssoProvider: "google",
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
it("should call the provider's login function", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
148
|
-
yield (0, login_2.login)({ org: "test-org" });
|
|
149
|
-
expect(login_1.pluginLoginMap.google).toHaveBeenCalled();
|
|
150
|
-
}));
|
|
151
|
-
it("should write the user's identity & config to the file system", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
152
|
-
yield (0, login_2.login)({ org: "test-org" });
|
|
153
|
-
expect(mockWriteFile.mock.calls).toMatchSnapshot();
|
|
154
|
-
}));
|
|
155
|
-
it("validates authentication", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
156
|
-
yield (0, login_2.login)({ org: "test-org" });
|
|
157
|
-
expect(auth_1.signInWithCredential.mock.calls).toMatchSnapshot();
|
|
158
|
-
}));
|
|
159
|
-
it("returns an error message if firebase cannot determine the user email", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
160
|
-
mockSignInWithCredential.mockResolvedValueOnce({
|
|
161
|
-
user: {},
|
|
162
|
-
});
|
|
163
|
-
yield expect((0, login_2.login)({ org: "test-org" })).rejects.toMatchInlineSnapshot(`
|
|
164
|
-
"Can not sign in: this user has previously signed in with a different identity provider.
|
|
165
|
-
Please contact support@p0.dev for assistance."
|
|
166
|
-
`);
|
|
167
|
-
}));
|
|
168
|
-
describe("already logged in", () => {
|
|
169
|
-
beforeEach(() => {
|
|
170
|
-
jest.clearAllMocks();
|
|
171
|
-
jest.spyOn(auth, "loadCredentials").mockResolvedValue(mockIdentity);
|
|
172
|
-
mockFetchOrgData.mockResolvedValue({
|
|
173
|
-
slug: "test-org",
|
|
174
|
-
tenantId: "test-tenant",
|
|
175
|
-
ssoProvider: "google",
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
it("no org provided, prints current logged-in status", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
179
|
-
yield (0, login_2.login)({});
|
|
180
|
-
expect(stdio_1.print2).toHaveBeenCalledWith("You are currently logged in to the test-org organization.");
|
|
181
|
-
expect(stdio_1.print2).toHaveBeenCalledWith(expect.stringContaining("The current session expires in "));
|
|
182
|
-
}));
|
|
183
|
-
it("org provided, prints already logged-in status", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
184
|
-
yield (0, login_2.login)({ org: "test-org" });
|
|
185
|
-
expect(stdio_1.print2).toHaveBeenCalledWith("You are already logged in to the test-org organization.");
|
|
186
|
-
expect(stdio_1.print2).toHaveBeenCalledWith(expect.stringContaining("The current session expires in "));
|
|
187
|
-
}));
|
|
188
|
-
it("--refresh provided, need to re-login", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
189
|
-
yield (0, login_2.login)({ org: "test-org", refresh: true });
|
|
190
|
-
expect(stdio_1.print2).toHaveBeenCalledWith("You are now logged in to the test-org organization, and can use the p0 CLI.");
|
|
191
|
-
}));
|
|
192
|
-
it("different org provided, need to re-login", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
193
|
-
mockFetchOrgData.mockResolvedValue({
|
|
194
|
-
slug: "other-org",
|
|
195
|
-
tenantId: "other-tenant",
|
|
196
|
-
ssoProvider: "google",
|
|
197
|
-
});
|
|
198
|
-
yield (0, login_2.login)({ org: "other-org" });
|
|
199
|
-
expect(stdio_1.print2).toHaveBeenCalledWith("You are now logged in to the other-org organization, and can use the p0 CLI.");
|
|
200
|
-
}));
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
});
|
|
204
|
-
//# sourceMappingURL=login.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login.test.js","sourceRoot":"","sources":["../../../../src/commands/__tests__/login.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
/** Copyright © 2024-present P0 Security
|
|
16
|
-
|
|
17
|
-
This file is part of @p0security/cli
|
|
18
|
-
|
|
19
|
-
@p0security/cli is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.
|
|
20
|
-
|
|
21
|
-
@p0security/cli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
22
|
-
|
|
23
|
-
You should have received a copy of the GNU General Public License along with @p0security/cli. If not, see <https://www.gnu.org/licenses/>.
|
|
24
|
-
**/
|
|
25
|
-
const api_1 = require("../../drivers/api");
|
|
26
|
-
const stdio_1 = require("../../drivers/stdio");
|
|
27
|
-
const yargs_1 = require("../../testing/yargs");
|
|
28
|
-
const ls_1 = require("../ls");
|
|
29
|
-
const yargs_2 = __importDefault(require("yargs"));
|
|
30
|
-
jest.mock("../../drivers/api");
|
|
31
|
-
jest.mock("../../drivers/auth");
|
|
32
|
-
jest.mock("../../drivers/stdio");
|
|
33
|
-
jest.spyOn(process, "exit");
|
|
34
|
-
const mockFetchCommand = api_1.fetchCommand;
|
|
35
|
-
const mockPrint1 = stdio_1.print1;
|
|
36
|
-
const mockPrint2 = stdio_1.print2;
|
|
37
|
-
describe("ls", () => {
|
|
38
|
-
beforeEach(() => jest.clearAllMocks());
|
|
39
|
-
describe("when valid ls command", () => {
|
|
40
|
-
const command = "ls ssh destination";
|
|
41
|
-
const mockItems = (items) => mockFetchCommand.mockResolvedValue({
|
|
42
|
-
ok: true,
|
|
43
|
-
term: "",
|
|
44
|
-
arg: "destination",
|
|
45
|
-
items,
|
|
46
|
-
});
|
|
47
|
-
it("should print list response", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
48
|
-
mockItems([
|
|
49
|
-
{ key: "instance-1", group: "Group", value: "Resource 1" },
|
|
50
|
-
{ key: "instance-2", value: "Resource 2" },
|
|
51
|
-
]);
|
|
52
|
-
yield (0, ls_1.lsCommand)((0, yargs_2.default)()).exitProcess(false).parse(command);
|
|
53
|
-
expect(mockPrint1.mock.calls).toMatchSnapshot("stdout");
|
|
54
|
-
expect(mockPrint2.mock.calls).toMatchSnapshot("stderr");
|
|
55
|
-
}));
|
|
56
|
-
it("should print friendly message if no items", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
57
|
-
mockItems([]);
|
|
58
|
-
yield (0, ls_1.lsCommand)((0, yargs_2.default)()).exitProcess(false).parse(command);
|
|
59
|
-
expect(mockPrint1.mock.calls).toMatchSnapshot("stdout");
|
|
60
|
-
expect(mockPrint2.mock.calls).toMatchSnapshot("stderr");
|
|
61
|
-
}));
|
|
62
|
-
});
|
|
63
|
-
describe("when error", () => {
|
|
64
|
-
const command = "ls foo";
|
|
65
|
-
beforeAll(() => {
|
|
66
|
-
mockFetchCommand.mockResolvedValue({
|
|
67
|
-
error: `p0 ls
|
|
68
|
-
|
|
69
|
-
List available resources
|
|
70
|
-
|
|
71
|
-
Commands:
|
|
72
|
-
p0 ls ssh <destination> Secure Shell (SSH) session
|
|
73
|
-
|
|
74
|
-
Options:
|
|
75
|
-
--help Show help [boolean]
|
|
76
|
-
|
|
77
|
-
Unknown argument: foo`,
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
it("should print error message", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
81
|
-
const error = yield (0, yargs_1.failure)((0, ls_1.lsCommand)((0, yargs_2.default)().exitProcess(false)), command);
|
|
82
|
-
expect(error).toMatchSnapshot();
|
|
83
|
-
}));
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
//# sourceMappingURL=ls.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ls.test.js","sourceRoot":"","sources":["../../../../src/commands/__tests__/ls.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA;;;;;;;;;GASG;AACH,2CAAiD;AACjD,+CAAqD;AACrD,+CAA8C;AAC9C,8BAAkC;AAClC,kDAA0B;AAE1B,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;AAC/B,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAChC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AACjC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAE5B,MAAM,gBAAgB,GAAG,kBAAyB,CAAC;AACnD,MAAM,UAAU,GAAG,cAAmB,CAAC;AACvC,MAAM,UAAU,GAAG,cAAmB,CAAC;AAEvC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;IAClB,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAEvC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,MAAM,OAAO,GAAG,oBAAoB,CAAC;QAErC,MAAM,SAAS,GAAG,CAAC,KAAe,EAAE,EAAE,CACpC,gBAAgB,CAAC,iBAAiB,CAAC;YACjC,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,EAAE;YACR,GAAG,EAAE,aAAa;YAClB,KAAK;SACN,CAAC,CAAC;QAEL,EAAE,CAAC,4BAA4B,EAAE,GAAS,EAAE;YAC1C,SAAS,CAAC;gBACR,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE;gBAC1D,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;aAC3C,CAAC,CAAC;YACH,MAAM,IAAA,cAAS,EAAC,IAAA,eAAK,GAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC,CAAA,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAS,EAAE;YACzD,SAAS,CAAC,EAAE,CAAC,CAAC;YACd,MAAM,IAAA,cAAS,EAAC,IAAA,eAAK,GAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3D,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACxD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC1D,CAAC,CAAA,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,MAAM,OAAO,GAAG,QAAQ,CAAC;QAEzB,SAAS,CAAC,GAAG,EAAE;YACb,gBAAgB,CAAC,iBAAiB,CAAC;gBACjC,KAAK,EAAE;;;;;;;;;;sBAUO;aACf,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAS,EAAE;YAC1C,MAAM,KAAK,GAAG,MAAM,IAAA,eAAO,EACzB,IAAA,cAAS,EAAC,IAAA,eAAK,GAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EACrC,OAAO,CACR,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,CAAC,eAAe,EAAE,CAAC;QAClC,CAAC,CAAA,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
|
|
12
|
-
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
|
|
13
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
14
|
-
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
15
|
-
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
16
|
-
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
|
|
17
|
-
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
18
|
-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
|
19
|
-
function fulfill(value) { resume("next", value); }
|
|
20
|
-
function reject(value) { resume("throw", value); }
|
|
21
|
-
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
22
|
-
};
|
|
23
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
24
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
25
|
-
};
|
|
26
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
-
/** Copyright © 2024-present P0 Security
|
|
28
|
-
|
|
29
|
-
This file is part of @p0security/cli
|
|
30
|
-
|
|
31
|
-
@p0security/cli is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License.
|
|
32
|
-
|
|
33
|
-
@p0security/cli is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
34
|
-
|
|
35
|
-
You should have received a copy of the GNU General Public License along with @p0security/cli. If not, see <https://www.gnu.org/licenses/>.
|
|
36
|
-
**/
|
|
37
|
-
const api_1 = require("../../drivers/api");
|
|
38
|
-
const stdio_1 = require("../../drivers/stdio");
|
|
39
|
-
const yargs_1 = require("../../testing/yargs");
|
|
40
|
-
const util_1 = require("../../util");
|
|
41
|
-
const request_1 = require("../request");
|
|
42
|
-
const yargs_2 = __importDefault(require("yargs"));
|
|
43
|
-
jest.mock("../../drivers/api", () => (Object.assign(Object.assign({}, jest.requireActual("../../drivers/api")), { fetchCommand: jest.fn(), fetchStreamingCommand: jest.fn(), streamingApiFetch: jest.fn() })));
|
|
44
|
-
jest.mock("../../drivers/auth");
|
|
45
|
-
jest.mock("../../drivers/stdio", () => (Object.assign(Object.assign({}, jest.requireActual("../../drivers/stdio")), { print1: jest.fn(), print2: jest.fn() })));
|
|
46
|
-
const mockFetchCommand = api_1.fetchCommand;
|
|
47
|
-
const mockFetchStreamingCommand = api_1.fetchStreamingCommand;
|
|
48
|
-
const mockPrint1 = stdio_1.print1;
|
|
49
|
-
const mockPrint2 = stdio_1.print2;
|
|
50
|
-
describe("request", () => {
|
|
51
|
-
beforeEach(() => {
|
|
52
|
-
jest.clearAllMocks();
|
|
53
|
-
});
|
|
54
|
-
describe("when valid request command", () => {
|
|
55
|
-
const command = "request gcloud role viewer";
|
|
56
|
-
function mockFetch(response) {
|
|
57
|
-
mockFetchCommand.mockResolvedValue(Object.assign({ ok: true, message: "a message", id: "abcefg", isPreexisting: false, isPersistent: false }, (response !== null && response !== void 0 ? response : {})));
|
|
58
|
-
}
|
|
59
|
-
describe.each([
|
|
60
|
-
[false, false, true],
|
|
61
|
-
[true, false, true],
|
|
62
|
-
[false, true, true],
|
|
63
|
-
])("preexisting=%p persistent=%p", (isPreexisting, isPersistent, should) => {
|
|
64
|
-
it(`should${should ? "" : " not"} print request response`, () => __awaiter(void 0, void 0, void 0, function* () {
|
|
65
|
-
mockFetch({ isPreexisting, isPersistent });
|
|
66
|
-
yield (0, request_1.requestCommand)((0, yargs_2.default)()).parse(command);
|
|
67
|
-
expect(mockPrint2.mock.calls).toMatchSnapshot();
|
|
68
|
-
expect(mockPrint1).not.toHaveBeenCalled();
|
|
69
|
-
}));
|
|
70
|
-
});
|
|
71
|
-
it("should wait for access", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
72
|
-
/**
|
|
73
|
-
* This test checks that the request command waits for access to be granted
|
|
74
|
-
* before resolving the promise.
|
|
75
|
-
*/
|
|
76
|
-
mockFetchStreamingCommand.mockImplementation(function () {
|
|
77
|
-
return __asyncGenerator(this, arguments, function* () {
|
|
78
|
-
yield yield __await({
|
|
79
|
-
ok: true,
|
|
80
|
-
message: "a message",
|
|
81
|
-
id: "abcefg",
|
|
82
|
-
isPreexisting: false,
|
|
83
|
-
isPersistent: false,
|
|
84
|
-
request: { status: "NEW" },
|
|
85
|
-
});
|
|
86
|
-
yield __await((0, util_1.sleep)(200));
|
|
87
|
-
yield yield __await({
|
|
88
|
-
ok: true,
|
|
89
|
-
message: "Request approved",
|
|
90
|
-
id: "abcefg",
|
|
91
|
-
isPreexisting: false,
|
|
92
|
-
isPersistent: false,
|
|
93
|
-
request: { status: "DONE" },
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
const promise = (0, request_1.requestCommand)((0, yargs_2.default)()).parse(`${command} --wait`);
|
|
98
|
-
// await for the first response to yield
|
|
99
|
-
const wait = (0, util_1.sleep)(100);
|
|
100
|
-
yield expect(wait).resolves.toBeUndefined();
|
|
101
|
-
yield expect(promise).resolves.toBeDefined();
|
|
102
|
-
expect(mockPrint2.mock.calls).toMatchSnapshot();
|
|
103
|
-
expect(mockPrint1).not.toHaveBeenCalled();
|
|
104
|
-
}));
|
|
105
|
-
});
|
|
106
|
-
describe("when error", () => {
|
|
107
|
-
const command = "request foo";
|
|
108
|
-
beforeAll(() => {
|
|
109
|
-
mockFetchCommand.mockResolvedValue({
|
|
110
|
-
error: `p0 request
|
|
111
|
-
|
|
112
|
-
Request access to a resource using P0
|
|
113
|
-
|
|
114
|
-
Commands:
|
|
115
|
-
p0 request gcloud Google Cloud
|
|
116
|
-
|
|
117
|
-
Options:
|
|
118
|
-
--help Show help [boolean]
|
|
119
|
-
--reason Reason access is needed [string]
|
|
120
|
-
-w, --wait Block until the request is completed [boolean]
|
|
121
|
-
|
|
122
|
-
Unknown argument: foo`,
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
it("should print error message", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
126
|
-
const error = yield (0, yargs_1.failure)((0, request_1.requestCommand)((0, yargs_2.default)()), command);
|
|
127
|
-
expect(error).toMatchSnapshot();
|
|
128
|
-
}));
|
|
129
|
-
it("should handle stream errors", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
130
|
-
mockFetchStreamingCommand.mockImplementation(function () {
|
|
131
|
-
return __asyncGenerator(this, arguments, function* () {
|
|
132
|
-
yield yield __await({
|
|
133
|
-
ok: true,
|
|
134
|
-
message: "a message",
|
|
135
|
-
id: "abcefg",
|
|
136
|
-
isPreexisting: false,
|
|
137
|
-
isPersistent: false,
|
|
138
|
-
request: { status: "NEW" },
|
|
139
|
-
});
|
|
140
|
-
yield __await((0, util_1.sleep)(200));
|
|
141
|
-
throw new TypeError("terminated");
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
const command = "request gcloud role viewer --wait";
|
|
145
|
-
const error = yield (0, yargs_1.failure)((0, request_1.requestCommand)((0, yargs_2.default)()), command);
|
|
146
|
-
expect(error).toMatchSnapshot();
|
|
147
|
-
}));
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
//# sourceMappingURL=request.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request.test.js","sourceRoot":"","sources":["../../../../src/commands/__tests__/request.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|