@red-hat-developer-hub/e2e-test-utils 2.1.15 → 2.1.16
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/dist/secrets/bitwarden.d.ts +43 -0
- package/dist/secrets/bitwarden.d.ts.map +1 -1
- package/dist/secrets/bitwarden.js +465 -53
- package/dist/secrets/cli.d.ts +48 -1
- package/dist/secrets/cli.d.ts.map +1 -1
- package/dist/secrets/cli.js +455 -28
- package/dist/secrets/command.d.ts +7 -0
- package/dist/secrets/command.d.ts.map +1 -1
- package/dist/secrets/command.js +103 -26
- package/dist/secrets/config.d.ts +11 -1
- package/dist/secrets/config.d.ts.map +1 -1
- package/dist/secrets/config.js +32 -1
- package/dist/secrets/environment-name.d.ts +2 -0
- package/dist/secrets/environment-name.d.ts.map +1 -0
- package/dist/secrets/environment-name.js +4 -0
- package/dist/secrets/environment.d.ts +10 -0
- package/dist/secrets/environment.d.ts.map +1 -1
- package/dist/secrets/environment.js +35 -4
- package/dist/secrets/exec.d.ts +9 -1
- package/dist/secrets/exec.d.ts.map +1 -1
- package/dist/secrets/exec.js +318 -38
- package/dist/secrets/gsm-wrapper.d.ts +42 -0
- package/dist/secrets/gsm-wrapper.d.ts.map +1 -0
- package/dist/secrets/gsm-wrapper.js +238 -0
- package/dist/secrets/gsm.d.ts +33 -0
- package/dist/secrets/gsm.d.ts.map +1 -0
- package/dist/secrets/gsm.js +172 -0
- package/dist/secrets/index.d.ts +9 -4
- package/dist/secrets/index.d.ts.map +1 -1
- package/dist/secrets/index.js +7 -2
- package/dist/secrets/lock.d.ts +3 -0
- package/dist/secrets/lock.d.ts.map +1 -0
- package/dist/secrets/lock.js +28 -0
- package/dist/secrets/mutation.d.ts +71 -0
- package/dist/secrets/mutation.d.ts.map +1 -0
- package/dist/secrets/mutation.js +210 -0
- package/dist/secrets/secret-input.d.ts +17 -0
- package/dist/secrets/secret-input.d.ts.map +1 -0
- package/dist/secrets/secret-input.js +40 -0
- package/dist/secrets/stream.d.ts +9 -0
- package/dist/secrets/stream.d.ts.map +1 -0
- package/dist/secrets/stream.js +211 -0
- package/dist/secrets/temporary-secret.d.ts +13 -0
- package/dist/secrets/temporary-secret.d.ts.map +1 -0
- package/dist/secrets/temporary-secret.js +87 -0
- package/dist/secrets/tests/bitwarden.test.js +640 -0
- package/dist/secrets/tests/cli.integration.test.js +131 -3
- package/dist/secrets/tests/cli.test.js +281 -6
- package/dist/secrets/tests/command.test.d.ts +2 -0
- package/dist/secrets/tests/command.test.d.ts.map +1 -0
- package/dist/secrets/tests/command.test.js +39 -0
- package/dist/secrets/tests/config.test.js +20 -1
- package/dist/secrets/tests/environment.test.js +145 -3
- package/dist/secrets/tests/exec.test.js +469 -2
- package/dist/secrets/tests/gsm-wrapper.test.d.ts +2 -0
- package/dist/secrets/tests/gsm-wrapper.test.d.ts.map +1 -0
- package/dist/secrets/tests/gsm-wrapper.test.js +166 -0
- package/dist/secrets/tests/gsm.test.d.ts +2 -0
- package/dist/secrets/tests/gsm.test.d.ts.map +1 -0
- package/dist/secrets/tests/gsm.test.js +181 -0
- package/dist/secrets/tests/mutation.test.d.ts +2 -0
- package/dist/secrets/tests/mutation.test.d.ts.map +1 -0
- package/dist/secrets/tests/mutation.test.js +390 -0
- package/dist/secrets/tests/secret-input.test.d.ts +2 -0
- package/dist/secrets/tests/secret-input.test.d.ts.map +1 -0
- package/dist/secrets/tests/secret-input.test.js +71 -0
- package/dist/secrets/tests/stream.test.d.ts +2 -0
- package/dist/secrets/tests/stream.test.d.ts.map +1 -0
- package/dist/secrets/tests/stream.test.js +88 -0
- package/dist/secrets/tests/temporary-secret.test.d.ts +2 -0
- package/dist/secrets/tests/temporary-secret.test.d.ts.map +1 -0
- package/dist/secrets/tests/temporary-secret.test.js +76 -0
- package/package.json +1 -1
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/naming-convention, playwright/expect-expect -- node:test assertions */
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { access, mkdir, mkdtemp, readFile, rm, writeFile, } from "node:fs/promises";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import test from "node:test";
|
|
7
|
+
import { GsmWrapper } from "../gsm-wrapper.js";
|
|
8
|
+
const script = '#!/bin/bash\nset -euo pipefail\nGCLOUD_CONFIG_PATH=x\nCONTAINER_ENGINE=podman\nIMAGE="${SECRET_MANAGER_IMAGE:-quay.io/openshift/ci-public:ci_secret-manager_latest}"\n';
|
|
9
|
+
test("downloads and atomically caches the GSM wrapper", async () => {
|
|
10
|
+
const cacheDir = await mkdtemp(path.join(os.tmpdir(), "gsm-wrapper-test-"));
|
|
11
|
+
const calls = [];
|
|
12
|
+
try {
|
|
13
|
+
const wrapper = new GsmWrapper({
|
|
14
|
+
cacheDir,
|
|
15
|
+
fetchScript: async () => script,
|
|
16
|
+
env: {
|
|
17
|
+
BW_SESSION: "must-not-reach-gsm",
|
|
18
|
+
VAULT_TOKEN: "must-not-reach-gsm",
|
|
19
|
+
},
|
|
20
|
+
commandRunner: async (_command, args, options) => {
|
|
21
|
+
calls.push([...args]);
|
|
22
|
+
assert.equal(options?.env?.BW_SESSION, undefined);
|
|
23
|
+
assert.equal(options?.env?.VAULT_TOKEN, undefined);
|
|
24
|
+
return { status: 0, stdout: "", stderr: "" };
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
const metadata = await wrapper.run(["describe", "-o", "json"]);
|
|
28
|
+
assert.equal(metadata.usedCache, false);
|
|
29
|
+
assert.match(path.basename(calls[0][0]), /^secret-manager\.sh\.[a-f0-9]{64}$/);
|
|
30
|
+
assert.equal(await readFile(calls[0][0], "utf8"), script);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
await rm(cacheDir, { recursive: true, force: true });
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
test("uses a validated cached wrapper when refresh fails", async () => {
|
|
37
|
+
const cacheDir = await mkdtemp(path.join(os.tmpdir(), "gsm-wrapper-test-"));
|
|
38
|
+
const warnings = [];
|
|
39
|
+
try {
|
|
40
|
+
const first = new GsmWrapper({
|
|
41
|
+
cacheDir,
|
|
42
|
+
fetchScript: async () => script,
|
|
43
|
+
commandRunner: async () => ({ status: 0, stdout: "", stderr: "" }),
|
|
44
|
+
});
|
|
45
|
+
await first.run(["list"]);
|
|
46
|
+
const second = new GsmWrapper({
|
|
47
|
+
cacheDir,
|
|
48
|
+
fetchScript: async () => {
|
|
49
|
+
throw new Error("offline");
|
|
50
|
+
},
|
|
51
|
+
commandRunner: async () => ({ status: 0, stdout: "", stderr: "" }),
|
|
52
|
+
warning: (message) => warnings.push(message),
|
|
53
|
+
});
|
|
54
|
+
const result = await second.run(["list"]);
|
|
55
|
+
assert.equal(result.usedCache, true);
|
|
56
|
+
assert.match(warnings[0] ?? "", /cached GSM wrapper/i);
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await rm(cacheDir, { recursive: true, force: true });
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
test("rejects an untrusted downloaded wrapper", async () => {
|
|
63
|
+
const cacheDir = await mkdtemp(path.join(os.tmpdir(), "gsm-wrapper-test-"));
|
|
64
|
+
try {
|
|
65
|
+
const wrapper = new GsmWrapper({
|
|
66
|
+
cacheDir,
|
|
67
|
+
fetchScript: async () => "#!/bin/sh\necho untrusted\n",
|
|
68
|
+
commandRunner: async () => ({ status: 0, stdout: "", stderr: "" }),
|
|
69
|
+
});
|
|
70
|
+
await assert.rejects(() => wrapper.run(["list"]), /no validated cache/i);
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
await rm(cacheDir, { recursive: true, force: true });
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
test("rejects a wrapper that selects an image outside the trusted repository", async () => {
|
|
77
|
+
const cacheDir = await mkdtemp(path.join(os.tmpdir(), "gsm-wrapper-test-"));
|
|
78
|
+
try {
|
|
79
|
+
const wrapper = new GsmWrapper({
|
|
80
|
+
cacheDir,
|
|
81
|
+
fetchScript: async () => script.replace("quay.io/openshift/ci-public:ci_secret-manager_latest", "docker.io/example/secret-manager:latest"),
|
|
82
|
+
commandRunner: async () => ({ status: 0, stdout: "", stderr: "" }),
|
|
83
|
+
});
|
|
84
|
+
await assert.rejects(() => wrapper.run(["list"]), /trusted image/i);
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
await rm(cacheDir, { recursive: true, force: true });
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
test("rejects an image override outside the trusted repository", () => {
|
|
91
|
+
assert.throws(() => new GsmWrapper({
|
|
92
|
+
env: {
|
|
93
|
+
SECRET_MANAGER_IMAGE: "docker.io/example/secret-manager:latest",
|
|
94
|
+
},
|
|
95
|
+
}), /trusted image/i);
|
|
96
|
+
});
|
|
97
|
+
test("passes interactive GSM commands through the terminal", async () => {
|
|
98
|
+
const cacheDir = await mkdtemp(path.join(os.tmpdir(), "gsm-wrapper-test-"));
|
|
99
|
+
let received;
|
|
100
|
+
try {
|
|
101
|
+
const wrapper = new GsmWrapper({
|
|
102
|
+
cacheDir,
|
|
103
|
+
fetchScript: async () => script,
|
|
104
|
+
commandRunner: async (_command, _args, options) => {
|
|
105
|
+
received = options;
|
|
106
|
+
return { status: 0, stdout: "", stderr: "" };
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
await wrapper.run(["create"], undefined, {
|
|
110
|
+
stdio: "inherit",
|
|
111
|
+
tty: true,
|
|
112
|
+
});
|
|
113
|
+
assert.deepEqual({ stdio: received?.stdio, tty: received?.tty }, { stdio: "inherit", tty: true });
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
await rm(cacheDir, { recursive: true, force: true });
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
test("cleans the local GSM authentication directory without the wrapper", async () => {
|
|
120
|
+
const cacheDir = await mkdtemp(path.join(os.tmpdir(), "gsm-wrapper-test-"));
|
|
121
|
+
const authDir = path.join(cacheDir, "gcp-secret-manager", ".secret-manager-gcloud");
|
|
122
|
+
let fetched = false;
|
|
123
|
+
let executed = false;
|
|
124
|
+
try {
|
|
125
|
+
await mkdir(authDir, { recursive: true });
|
|
126
|
+
await writeFile(path.join(authDir, "credentials.db"), "synthetic");
|
|
127
|
+
const wrapper = new GsmWrapper({
|
|
128
|
+
cacheDir,
|
|
129
|
+
fetchScript: async () => {
|
|
130
|
+
fetched = true;
|
|
131
|
+
throw new Error("offline");
|
|
132
|
+
},
|
|
133
|
+
commandRunner: async () => {
|
|
134
|
+
executed = true;
|
|
135
|
+
throw new Error("wrapper must not execute");
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
await wrapper.clean();
|
|
139
|
+
await assert.rejects(() => access(authDir), /ENOENT/);
|
|
140
|
+
assert.equal(fetched, false);
|
|
141
|
+
assert.equal(executed, false);
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
await rm(cacheDir, { recursive: true, force: true });
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
test("shares one wrapper initialization across concurrent runs", async () => {
|
|
148
|
+
const cacheDir = await mkdtemp(path.join(os.tmpdir(), "gsm-wrapper-test-"));
|
|
149
|
+
let fetches = 0;
|
|
150
|
+
try {
|
|
151
|
+
const wrapper = new GsmWrapper({
|
|
152
|
+
cacheDir,
|
|
153
|
+
fetchScript: async () => {
|
|
154
|
+
fetches++;
|
|
155
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
156
|
+
return script;
|
|
157
|
+
},
|
|
158
|
+
commandRunner: async () => ({ status: 0, stdout: "", stderr: "" }),
|
|
159
|
+
});
|
|
160
|
+
await Promise.all([wrapper.run(["list"]), wrapper.run(["list"])]);
|
|
161
|
+
assert.equal(fetches, 1);
|
|
162
|
+
}
|
|
163
|
+
finally {
|
|
164
|
+
await rm(cacheDir, { recursive: true, force: true });
|
|
165
|
+
}
|
|
166
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gsm.test.d.ts","sourceRoot":"","sources":["../../../src/secrets/tests/gsm.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/naming-convention, playwright/expect-expect, playwright/no-conditional-in-test -- node:test assertions */
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import test from "node:test";
|
|
4
|
+
import { GsmClient } from "../gsm.js";
|
|
5
|
+
function result(stdout = "", status = 0, timedOut = false, signal) {
|
|
6
|
+
return {
|
|
7
|
+
status,
|
|
8
|
+
stdout,
|
|
9
|
+
stderr: "synthetic",
|
|
10
|
+
timedOut,
|
|
11
|
+
...(signal === undefined ? {} : { signal }),
|
|
12
|
+
usedCache: false,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
test("describes GSM metadata without exposing provider output", async () => {
|
|
16
|
+
const calls = [];
|
|
17
|
+
const runner = {
|
|
18
|
+
run: async (args) => {
|
|
19
|
+
calls.push([...args]);
|
|
20
|
+
return result([
|
|
21
|
+
"Created: synthetic",
|
|
22
|
+
"JIRA project: (not set)",
|
|
23
|
+
"Rotation instructions: (not set)",
|
|
24
|
+
"Request information: (not set)",
|
|
25
|
+
].join("\n"));
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
const metadata = await new GsmClient({ runner }).describe("rhdh-qe", "rhdh/test");
|
|
29
|
+
assert.deepEqual(metadata, {
|
|
30
|
+
"create-time": "synthetic",
|
|
31
|
+
"jira-project": "(not set)",
|
|
32
|
+
"rotation-instructions": "(not set)",
|
|
33
|
+
"request-information": "(not set)",
|
|
34
|
+
});
|
|
35
|
+
assert.deepEqual(calls[0], ["describe", "-c", "rhdh-qe", "rhdh/test"]);
|
|
36
|
+
});
|
|
37
|
+
test("whitelists JSON metadata fields before returning them", async () => {
|
|
38
|
+
const runner = {
|
|
39
|
+
run: async () => result(JSON.stringify({
|
|
40
|
+
"create-time": "synthetic",
|
|
41
|
+
value: "must-not-leak",
|
|
42
|
+
payload: "must-not-leak",
|
|
43
|
+
unexpected: "ignored",
|
|
44
|
+
})),
|
|
45
|
+
};
|
|
46
|
+
assert.deepEqual(await new GsmClient({ runner }).describe("rhdh-qe", "rhdh/test"), { "create-time": "synthetic" });
|
|
47
|
+
});
|
|
48
|
+
test("updates GSM using the private snapshot and reports timeout as indeterminate", async () => {
|
|
49
|
+
const calls = [];
|
|
50
|
+
const runner = {
|
|
51
|
+
run: async (args, timeout) => {
|
|
52
|
+
calls.push({ args: [...args], timeout });
|
|
53
|
+
return result("", 0);
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
await new GsmClient({ runner }).update("rhdh-qe", "rhdh/test", "/private/snapshot", 123);
|
|
57
|
+
assert.deepEqual(calls[0], {
|
|
58
|
+
args: [
|
|
59
|
+
"update",
|
|
60
|
+
"-c",
|
|
61
|
+
"rhdh-qe",
|
|
62
|
+
"rhdh/test",
|
|
63
|
+
"--from-file",
|
|
64
|
+
"/private/snapshot",
|
|
65
|
+
],
|
|
66
|
+
timeout: 123,
|
|
67
|
+
});
|
|
68
|
+
const timeoutRunner = {
|
|
69
|
+
run: async () => result("", null, true),
|
|
70
|
+
};
|
|
71
|
+
await assert.rejects(() => new GsmClient({ runner: timeoutRunner }).update("rhdh-qe", "rhdh/test", "/private/snapshot", 123), (error) => error instanceof Error &&
|
|
72
|
+
error.message.includes("indeterminate") &&
|
|
73
|
+
error.indeterminate === true);
|
|
74
|
+
});
|
|
75
|
+
test("reports a signal-terminated GSM create as indeterminate", async () => {
|
|
76
|
+
const runner = {
|
|
77
|
+
run: async () => result("", null, false, "SIGTERM"),
|
|
78
|
+
};
|
|
79
|
+
await assert.rejects(() => new GsmClient({ runner }).create("rhdh-qe", "rhdh/test", "/private/snapshot", 123), (error) => error instanceof Error &&
|
|
80
|
+
error.message.includes("indeterminate") &&
|
|
81
|
+
error.message.includes("SIGTERM") &&
|
|
82
|
+
error.indeterminate === true);
|
|
83
|
+
});
|
|
84
|
+
test("reports a signal-terminated GSM update as indeterminate", async () => {
|
|
85
|
+
const runner = {
|
|
86
|
+
run: async () => result("", null, false, "SIGINT"),
|
|
87
|
+
};
|
|
88
|
+
await assert.rejects(() => new GsmClient({ runner }).update("rhdh-qe", "rhdh/test", "/private/snapshot", 123), (error) => error instanceof Error &&
|
|
89
|
+
error.message.includes("indeterminate") &&
|
|
90
|
+
error.message.includes("SIGINT") &&
|
|
91
|
+
error.indeterminate === true);
|
|
92
|
+
});
|
|
93
|
+
test("reports a signal-terminated GSM delete as indeterminate", async () => {
|
|
94
|
+
const runner = {
|
|
95
|
+
run: async () => result("", null, false, "SIGTERM"),
|
|
96
|
+
};
|
|
97
|
+
await assert.rejects(() => new GsmClient({ runner }).delete("rhdh-qe", "rhdh/test", 123), (error) => error instanceof Error &&
|
|
98
|
+
error.message.includes("indeterminate") &&
|
|
99
|
+
error.indeterminate === true);
|
|
100
|
+
});
|
|
101
|
+
test("distinguishes a missing GSM secret from other describe failures", async () => {
|
|
102
|
+
const missing = {
|
|
103
|
+
run: async () => result("", 1, false),
|
|
104
|
+
};
|
|
105
|
+
const missingClient = new GsmClient({
|
|
106
|
+
runner: {
|
|
107
|
+
run: async () => ({
|
|
108
|
+
...result("Secret 'rhdh/test' does not exist", 1),
|
|
109
|
+
stderr: "",
|
|
110
|
+
}),
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
assert.equal(await missingClient.exists("rhdh-qe", "rhdh/test"), false);
|
|
114
|
+
await assert.rejects(() => new GsmClient({ runner: missing }).exists("rhdh-qe", "rhdh/test"), /does not exist or is inaccessible/i);
|
|
115
|
+
});
|
|
116
|
+
test("does not classify missing application credentials as a missing secret", async () => {
|
|
117
|
+
const runner = {
|
|
118
|
+
run: async () => result("", 1, false),
|
|
119
|
+
};
|
|
120
|
+
const authenticationRunner = {
|
|
121
|
+
run: async () => ({
|
|
122
|
+
...result("", 1),
|
|
123
|
+
stderr: "google.auth.exceptions.DefaultCredentialsError: default credentials were not found",
|
|
124
|
+
}),
|
|
125
|
+
};
|
|
126
|
+
await assert.rejects(() => new GsmClient({ runner }).exists("rhdh-qe", "rhdh/test"), /does not exist or is inaccessible/i);
|
|
127
|
+
await assert.rejects(() => new GsmClient({ runner: authenticationRunner }).exists("rhdh-qe", "rhdh/test"), /gsm-login/i);
|
|
128
|
+
});
|
|
129
|
+
test("gives login guidance when GSM list authentication fails", async () => {
|
|
130
|
+
const runner = {
|
|
131
|
+
run: async () => ({
|
|
132
|
+
...result("", 1),
|
|
133
|
+
stderr: "DefaultCredentialsError: default credentials were not found",
|
|
134
|
+
}),
|
|
135
|
+
};
|
|
136
|
+
await assert.rejects(() => new GsmClient({ runner }).list("rhdh-qe"), /gsm-login/i);
|
|
137
|
+
});
|
|
138
|
+
test("rejects metadata timeouts that Node timers cannot represent", () => {
|
|
139
|
+
assert.throws(() => new GsmClient({ metadataTimeoutMs: 2_147_483_648 }), /maximum|positive integer/i);
|
|
140
|
+
});
|
|
141
|
+
test("lists GSM paths and creates with an interactive terminal", async () => {
|
|
142
|
+
const calls = [];
|
|
143
|
+
const runner = {
|
|
144
|
+
run: async (args, timeout, options) => {
|
|
145
|
+
calls.push({ args: [...args], timeout, options });
|
|
146
|
+
if (args[0] === "list")
|
|
147
|
+
return result('["rhdh/test", "rhdh/other"]');
|
|
148
|
+
return result();
|
|
149
|
+
},
|
|
150
|
+
ensureInteractive: async () => undefined,
|
|
151
|
+
};
|
|
152
|
+
const client = new GsmClient({ runner });
|
|
153
|
+
assert.deepEqual(await client.list("rhdh-qe"), ["rhdh/test", "rhdh/other"]);
|
|
154
|
+
await client.ensureInteractive();
|
|
155
|
+
await client.create("rhdh-qe", "rhdh/new", "/private/snapshot", 123);
|
|
156
|
+
await client.delete("rhdh-qe", "rhdh/new", 456);
|
|
157
|
+
assert.deepEqual(calls, [
|
|
158
|
+
{
|
|
159
|
+
args: ["list", "-c", "rhdh-qe", "-o", "json"],
|
|
160
|
+
timeout: 60_000,
|
|
161
|
+
options: undefined,
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
args: [
|
|
165
|
+
"create",
|
|
166
|
+
"-c",
|
|
167
|
+
"rhdh-qe",
|
|
168
|
+
"rhdh/new",
|
|
169
|
+
"--from-file",
|
|
170
|
+
"/private/snapshot",
|
|
171
|
+
],
|
|
172
|
+
timeout: 123,
|
|
173
|
+
options: { stdio: "inherit", tty: true },
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
args: ["delete", "-c", "rhdh-qe", "rhdh/new"],
|
|
177
|
+
timeout: 456,
|
|
178
|
+
options: undefined,
|
|
179
|
+
},
|
|
180
|
+
]);
|
|
181
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutation.test.d.ts","sourceRoot":"","sources":["../../../src/secrets/tests/mutation.test.ts"],"names":[],"mappings":""}
|