feat: secret variables in environments (#3779)

Co-authored-by: jamesgeorge007 <jamesgeorge998001@gmail.com>
This commit is contained in:
Nivedin
2024-02-08 21:58:42 +05:30
committed by GitHub
parent 16803acb26
commit 00862eb192
55 changed files with 2141 additions and 439 deletions

View File

@@ -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 }],
})
})
})

View File

@@ -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 }],
},
},
}

View File

@@ -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,
},
],
}

View File

@@ -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,
},
],
}

View File

@@ -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,
},
],
}

View File

@@ -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,
},
],
})

View File

@@ -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,
},
],
}

View File

@@ -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[]
}
}

View File

@@ -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)),