feat: secret variables in environments (#3779)
Co-authored-by: jamesgeorge007 <jamesgeorge998001@gmail.com>
This commit is contained in:
@@ -12,16 +12,16 @@ describe("runPreRequestScript", () => {
|
||||
{
|
||||
global: [],
|
||||
selected: [
|
||||
{ key: "bob", value: "oldbob" },
|
||||
{ key: "foo", value: "bar" },
|
||||
{ key: "bob", value: "oldbob", secret: false },
|
||||
{ key: "foo", value: "bar", secret: false },
|
||||
],
|
||||
}
|
||||
)()
|
||||
).resolves.toEqualRight({
|
||||
global: [],
|
||||
selected: [
|
||||
{ key: "bob", value: "newbob" },
|
||||
{ key: "foo", value: "bar" },
|
||||
{ key: "bob", value: "newbob", secret: false },
|
||||
{ key: "foo", value: "bar", secret: false },
|
||||
],
|
||||
})
|
||||
})
|
||||
@@ -35,8 +35,8 @@ describe("runPreRequestScript", () => {
|
||||
{
|
||||
global: [],
|
||||
selected: [
|
||||
{ key: "bob", value: "oldbob" },
|
||||
{ key: "foo", value: "bar" },
|
||||
{ key: "bob", value: "oldbob", secret: false },
|
||||
{ key: "foo", value: "bar", secret: false },
|
||||
],
|
||||
}
|
||||
)()
|
||||
@@ -52,8 +52,8 @@ describe("runPreRequestScript", () => {
|
||||
{
|
||||
global: [],
|
||||
selected: [
|
||||
{ key: "bob", value: "oldbob" },
|
||||
{ key: "foo", value: "bar" },
|
||||
{ key: "bob", value: "oldbob", secret: false },
|
||||
{ key: "foo", value: "bar", secret: false },
|
||||
],
|
||||
}
|
||||
)()
|
||||
@@ -69,8 +69,8 @@ describe("runPreRequestScript", () => {
|
||||
{
|
||||
global: [],
|
||||
selected: [
|
||||
{ key: "bob", value: "oldbob" },
|
||||
{ key: "foo", value: "bar" },
|
||||
{ key: "bob", value: "oldbob", secret: false },
|
||||
{ key: "foo", value: "bar", secret: false },
|
||||
],
|
||||
}
|
||||
)()
|
||||
@@ -87,7 +87,7 @@ describe("runPreRequestScript", () => {
|
||||
)()
|
||||
).resolves.toEqualRight({
|
||||
global: [],
|
||||
selected: [{ key: "foo", value: "bar" }],
|
||||
selected: [{ key: "foo", value: "bar", secret: false }],
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -10,13 +10,13 @@ describe("Base64 helper functions", () => {
|
||||
atob: {
|
||||
script: `pw.env.set("atob", atob("SGVsbG8gV29ybGQ="))`,
|
||||
environment: {
|
||||
selected: [{ key: "atob", value: "Hello World" }],
|
||||
selected: [{ key: "atob", value: "Hello World", secret: false }],
|
||||
},
|
||||
},
|
||||
btoa: {
|
||||
script: `pw.env.set("btoa", btoa("Hello World"))`,
|
||||
environment: {
|
||||
selected: [{ key: "btoa", value: "SGVsbG8gV29ybGQ=" }],
|
||||
selected: [{ key: "btoa", value: "SGVsbG8gV29ybGQ=", secret: false }],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ describe("pw.env.get", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "b",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -59,6 +60,7 @@ describe("pw.env.get", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "b",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [],
|
||||
@@ -112,12 +114,14 @@ describe("pw.env.get", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "global val",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [
|
||||
{
|
||||
key: "a",
|
||||
value: "selected val",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -147,6 +151,7 @@ describe("pw.env.get", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "<<hello>>",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ describe("pw.env.getResolve", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "b",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -59,6 +60,7 @@ describe("pw.env.getResolve", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "b",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [],
|
||||
@@ -112,12 +114,14 @@ describe("pw.env.getResolve", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "global val",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [
|
||||
{
|
||||
key: "a",
|
||||
value: "selected val",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -147,10 +151,12 @@ describe("pw.env.getResolve", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "<<hello>>",
|
||||
secret: false,
|
||||
},
|
||||
{
|
||||
key: "hello",
|
||||
value: "there",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -180,10 +186,12 @@ describe("pw.env.getResolve", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "<<hello>>",
|
||||
secret: false,
|
||||
},
|
||||
{
|
||||
key: "hello",
|
||||
value: "<<a>>",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
@@ -43,6 +43,7 @@ describe("pw.env.resolve", () => {
|
||||
{
|
||||
key: "hello",
|
||||
value: "there",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [],
|
||||
@@ -73,6 +74,7 @@ describe("pw.env.resolve", () => {
|
||||
{
|
||||
key: "hello",
|
||||
value: "there",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -101,12 +103,14 @@ describe("pw.env.resolve", () => {
|
||||
{
|
||||
key: "hello",
|
||||
value: "yo",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [
|
||||
{
|
||||
key: "hello",
|
||||
value: "there",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -136,10 +140,12 @@ describe("pw.env.resolve", () => {
|
||||
{
|
||||
key: "hello",
|
||||
value: "<<there>>",
|
||||
secret: false,
|
||||
},
|
||||
{
|
||||
key: "there",
|
||||
value: "<<hello>>",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ describe("pw.env.set", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "b",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -45,6 +46,7 @@ describe("pw.env.set", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "c",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
})
|
||||
@@ -62,6 +64,7 @@ describe("pw.env.set", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "b",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [],
|
||||
@@ -73,6 +76,7 @@ describe("pw.env.set", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "c",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
})
|
||||
@@ -90,12 +94,14 @@ describe("pw.env.set", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "b",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [
|
||||
{
|
||||
key: "a",
|
||||
value: "d",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -106,12 +112,14 @@ describe("pw.env.set", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "b",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [
|
||||
{
|
||||
key: "a",
|
||||
value: "c",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
})
|
||||
@@ -136,6 +144,7 @@ describe("pw.env.set", () => {
|
||||
{
|
||||
key: "a",
|
||||
value: "c",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
})
|
||||
|
||||
@@ -35,6 +35,7 @@ describe("pw.env.unset", () => {
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://echo.hoppscotch.io",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -57,6 +58,7 @@ describe("pw.env.unset", () => {
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://echo.hoppscotch.io",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [],
|
||||
@@ -80,12 +82,14 @@ describe("pw.env.unset", () => {
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://httpbin.org",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://echo.hoppscotch.io",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -96,6 +100,7 @@ describe("pw.env.unset", () => {
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://httpbin.org",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [],
|
||||
@@ -114,16 +119,19 @@ describe("pw.env.unset", () => {
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://echo.hoppscotch.io",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://httpbin.org",
|
||||
secret: false,
|
||||
},
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://echo.hoppscotch.io",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
@@ -134,12 +142,14 @@ describe("pw.env.unset", () => {
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://echo.hoppscotch.io",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://echo.hoppscotch.io",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
})
|
||||
@@ -157,10 +167,12 @@ describe("pw.env.unset", () => {
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://httpbin.org/",
|
||||
secret: false,
|
||||
},
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://echo.hoppscotch.io",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [],
|
||||
@@ -172,6 +184,7 @@ describe("pw.env.unset", () => {
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://echo.hoppscotch.io",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
selected: [],
|
||||
@@ -225,6 +238,7 @@ describe("pw.env.unset", () => {
|
||||
{
|
||||
key: "baseUrl",
|
||||
value: "https://echo.hoppscotch.io",
|
||||
secret: false,
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import { Environment } from "@hoppscotch/data"
|
||||
|
||||
/**
|
||||
* The response object structure exposed to the test script
|
||||
*/
|
||||
@@ -43,6 +41,13 @@ export type TestDescriptor = {
|
||||
children: TestDescriptor[]
|
||||
}
|
||||
|
||||
// Representation of a transformed state for environment variables in the sandbox
|
||||
type TransformedEnvironmentVariable = {
|
||||
key: string
|
||||
value: string
|
||||
secret: boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines the result of a test script execution
|
||||
*/
|
||||
@@ -50,8 +55,8 @@ export type TestDescriptor = {
|
||||
export type TestResult = {
|
||||
tests: TestDescriptor[]
|
||||
envs: {
|
||||
global: Environment["variables"]
|
||||
selected: Environment["variables"]
|
||||
global: TransformedEnvironmentVariable[]
|
||||
selected: TransformedEnvironmentVariable[]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -38,13 +38,20 @@ const setEnv = (
|
||||
const indexInGlobal = findEnvIndex(envName, global)
|
||||
|
||||
if (indexInSelected >= 0) {
|
||||
selected[indexInSelected].value = envValue
|
||||
const selectedEnv = selected[indexInSelected]
|
||||
if ("value" in selectedEnv) {
|
||||
selectedEnv.value = envValue
|
||||
}
|
||||
} else if (indexInGlobal >= 0) {
|
||||
global[indexInGlobal].value = envValue
|
||||
if ("value" in global[indexInGlobal]) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-extra-semi
|
||||
;(global[indexInGlobal] as { value: string }).value = envValue
|
||||
}
|
||||
} else {
|
||||
selected.push({
|
||||
key: envName,
|
||||
value: envValue,
|
||||
secret: false,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -86,9 +93,9 @@ const getSharedMethods = (envs: TestResult["envs"]) => {
|
||||
|
||||
const result = pipe(
|
||||
getEnv(key, updatedEnvs),
|
||||
O.match(
|
||||
O.fold(
|
||||
() => undefined,
|
||||
({ value }) => String(value)
|
||||
(env) => String(env.value)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -104,14 +111,13 @@ const getSharedMethods = (envs: TestResult["envs"]) => {
|
||||
getEnv(key, updatedEnvs),
|
||||
E.fromOption(() => "INVALID_KEY" as const),
|
||||
|
||||
E.map(({ value }) =>
|
||||
E.map((e) =>
|
||||
pipe(
|
||||
parseTemplateStringE(value, [
|
||||
parseTemplateStringE(e.value, [
|
||||
...updatedEnvs.selected,
|
||||
...updatedEnvs.global,
|
||||
]),
|
||||
// If the recursive resolution failed, return the unresolved value
|
||||
E.getOrElse(() => value)
|
||||
]), // If the recursive resolution failed, return the unresolved value
|
||||
E.getOrElse(() => e.value)
|
||||
)
|
||||
),
|
||||
E.map((x) => String(x)),
|
||||
|
||||
Reference in New Issue
Block a user