From 263d58819156765a0b5b472813a76a9141e94020 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 31 Jan 2023 15:27:16 +0000 Subject: [PATCH 1/8] Environment variable test base. --- .../tests/utilities/mocks/licenses.ts | 4 + .../routes/tests/environmentVariables.spec.ts | 79 +++++++++++++++++++ .../server/src/tests/utilities/structures.ts | 12 +++ 3 files changed, 95 insertions(+) create mode 100644 packages/server/src/api/routes/tests/environmentVariables.spec.ts diff --git a/packages/backend-core/tests/utilities/mocks/licenses.ts b/packages/backend-core/tests/utilities/mocks/licenses.ts index 1fbda5655e..e374612f5f 100644 --- a/packages/backend-core/tests/utilities/mocks/licenses.ts +++ b/packages/backend-core/tests/utilities/mocks/licenses.ts @@ -74,6 +74,10 @@ export const useGroups = () => { return useFeature(Feature.USER_GROUPS) } +export const useEnvironmentVariables = () => { + return useFeature(Feature.ENVIRONMENT_VARIABLES) +} + // QUOTAS export const setAutomationLogsQuota = (value: number) => { diff --git a/packages/server/src/api/routes/tests/environmentVariables.spec.ts b/packages/server/src/api/routes/tests/environmentVariables.spec.ts new file mode 100644 index 0000000000..86ff8367da --- /dev/null +++ b/packages/server/src/api/routes/tests/environmentVariables.spec.ts @@ -0,0 +1,79 @@ +jest.mock("../../../integrations/postgres") +import * as setup from "./utilities" +import postgres from "../../../integrations/postgres" +import { mocks } from "@budibase/backend-core/tests" +import { env } from "@budibase/backend-core" +const structures = setup.structures + +env._set("ENCRYPTION_KEY", "budibase") +mocks.licenses.useEnvironmentVariables() + +describe("/api/env/variables", () => { + let request = setup.getRequest() + let config = setup.getConfig() + + afterAll(setup.afterAll) + + beforeEach(async () => { + await config.init() + }) + + it("should be able check the status of env var API", async () => { + const res = await request + .get(`/api/env/variables/status`) + .set(config.defaultHeaders()) + .expect("Content-Type", /json/) + .expect(200) + + expect(res.body.encryptionKeyAvailable).toEqual(true) + }) + + it("should be able to create an environment variable", async () => { + await request + .post(`/api/env/variables`) + .send(structures.basicEnvironmentVariable("test", "test")) + .set(config.defaultHeaders()) + .expect(200) + }) + + it("should be able to fetch the 'test' variable name", async () => { + const res = await request + .get(`/api/env/variables`) + .set(config.defaultHeaders()) + .expect("Content-Type", /json/) + .expect(200) + expect(res.body.variables.length).toEqual(1) + expect(res.body.variables[0]).toEqual("test") + }) + + it("should be able to update the environment variable 'test'", async () => {}) + + it("should be able to delete the environment variable 'test'", async () => {}) + + it("should be able to create an environment variable", async () => {}) + + it("should create a datasource (using the environment variable) and query", async () => { + const datasourceBase = structures.basicDatasource() + // TODO: we need to use an environment variable in the datasource configuration + const datasource = await request + .post(`/api/datasources`) + .send(datasourceBase) + .set(config.defaultHeaders()) + .expect("Content-Type", /json/) + .expect(200) + expect(datasource._id).toBeDefined() + + const query = await request + .post(`/api/queries`) + .send(structures.basicQuery(datasource._id)) + .set(config.defaultHeaders()) + .expect("Content-Type", /json/) + .expect(200) + expect(query._id).toBeDefined() + }) + + it("should run a query preview and check the mocked results", async () => { + // TODO: use the preview API + expect(postgres.integration).toHaveBeenCalledWith() + }) +}) diff --git a/packages/server/src/tests/utilities/structures.ts b/packages/server/src/tests/utilities/structures.ts index 9d66fecc5e..4a5cd2ed20 100644 --- a/packages/server/src/tests/utilities/structures.ts +++ b/packages/server/src/tests/utilities/structures.ts @@ -255,3 +255,15 @@ export function basicWebhook(automationId: string) { }, } } + +export function basicEnvironmentVariable( + name: string, + prod: string, + dev?: string +) { + return { + name, + production: prod, + development: dev || prod, + } +} From b2d18d13f53b3d63048b1b82dceb28c970bb5c77 Mon Sep 17 00:00:00 2001 From: Mateus Badan de Pieri Date: Thu, 2 Feb 2023 14:39:33 +0000 Subject: [PATCH 2/8] updated tests --- .../routes/tests/environmentVariables.spec.ts | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/packages/server/src/api/routes/tests/environmentVariables.spec.ts b/packages/server/src/api/routes/tests/environmentVariables.spec.ts index 86ff8367da..b2467407ae 100644 --- a/packages/server/src/api/routes/tests/environmentVariables.spec.ts +++ b/packages/server/src/api/routes/tests/environmentVariables.spec.ts @@ -2,7 +2,7 @@ jest.mock("../../../integrations/postgres") import * as setup from "./utilities" import postgres from "../../../integrations/postgres" import { mocks } from "@budibase/backend-core/tests" -import { env } from "@budibase/backend-core" +import { env, events } from "@budibase/backend-core" const structures = setup.structures env._set("ENCRYPTION_KEY", "budibase") @@ -46,30 +46,48 @@ describe("/api/env/variables", () => { expect(res.body.variables[0]).toEqual("test") }) - it("should be able to update the environment variable 'test'", async () => {}) + it("should be able to update the environment variable 'test'", async () => { + const varName = "test" + await request + .patch(`/api/env/variables/${varName}`) + .send(structures.basicEnvironmentVariable("test", "test1")) + .set(config.defaultHeaders()) + .expect(200) + }) - it("should be able to delete the environment variable 'test'", async () => {}) - - it("should be able to create an environment variable", async () => {}) + it("should be able to delete the environment variable 'test'", async () => { + const varName = "test" + await request + .delete(`/api/env/variables/${varName}`) + .set(config.defaultHeaders()) + .expect(200) + }) it("should create a datasource (using the environment variable) and query", async () => { const datasourceBase = structures.basicDatasource() - // TODO: we need to use an environment variable in the datasource configuration - const datasource = await request + await request + .post(`/api/env/variables`) + .send(structures.basicEnvironmentVariable("test", "test")) + .set(config.defaultHeaders()) + + datasourceBase.datasource.config = { + password: "{{ env.test }}", + } + const response = await request .post(`/api/datasources`) .send(datasourceBase) .set(config.defaultHeaders()) .expect("Content-Type", /json/) .expect(200) - expect(datasource._id).toBeDefined() + expect(response.body.datasource._id).toBeDefined() - const query = await request + const response2 = await request .post(`/api/queries`) - .send(structures.basicQuery(datasource._id)) + .send(structures.basicQuery(response.body.datasource._id)) .set(config.defaultHeaders()) .expect("Content-Type", /json/) .expect(200) - expect(query._id).toBeDefined() + expect(response2.body._id).toBeDefined() }) it("should run a query preview and check the mocked results", async () => { From 126b475c328f8931759a08687b9c5912ba75c08c Mon Sep 17 00:00:00 2001 From: Mateus Badan de Pieri Date: Thu, 2 Feb 2023 15:14:54 +0000 Subject: [PATCH 3/8] updated --- .../routes/tests/environmentVariables.spec.ts | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/routes/tests/environmentVariables.spec.ts b/packages/server/src/api/routes/tests/environmentVariables.spec.ts index b2467407ae..53228ee9f7 100644 --- a/packages/server/src/api/routes/tests/environmentVariables.spec.ts +++ b/packages/server/src/api/routes/tests/environmentVariables.spec.ts @@ -92,6 +92,48 @@ describe("/api/env/variables", () => { it("should run a query preview and check the mocked results", async () => { // TODO: use the preview API - expect(postgres.integration).toHaveBeenCalledWith() + const datasourceBase = structures.basicDatasource() + await request + .post(`/api/env/variables`) + .send(structures.basicEnvironmentVariable("test", "test")) + .set(config.defaultHeaders()) + + datasourceBase.datasource.config = { + password: "{{ env.test }}", + } + const response = await request + .post(`/api/datasources`) + .send(datasourceBase) + .set(config.defaultHeaders()) + .expect("Content-Type", /json/) + .expect(200) + expect(response.body.datasource._id).toBeDefined() + + const query = { + datasourceId: response.body.datasource._id, + parameters: {}, + fields: {}, + queryVerb: "read", + name: response.body.datasource.name, + } + const res = await request + .post(`/api/queries/preview`) + .send(query) + .set(config.defaultHeaders()) + .expect("Content-Type", /json/) + .expect(200) + // these responses come from the mock + expect(res.body.schemaFields).toEqual({ + a: "string", + b: "number", + }) + + expect(res.body.rows.length).toEqual(1) + expect(events.query.previewed).toBeCalledTimes(1) + expect(events.query.previewed).toBeCalledWith( + response.body.datasource, + query + ) + //expect(postgres.integration).toHaveBeenCalledWith() }) }) From cdc55a0c3200e08203440380d7a6a1d61f96d0c2 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Fri, 3 Feb 2023 09:15:40 +0000 Subject: [PATCH 4/8] use correct postgres mock --- .../server/src/api/routes/tests/environmentVariables.spec.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/server/src/api/routes/tests/environmentVariables.spec.ts b/packages/server/src/api/routes/tests/environmentVariables.spec.ts index 53228ee9f7..b09d6d2365 100644 --- a/packages/server/src/api/routes/tests/environmentVariables.spec.ts +++ b/packages/server/src/api/routes/tests/environmentVariables.spec.ts @@ -1,6 +1,5 @@ -jest.mock("../../../integrations/postgres") +jest.mock("pg") import * as setup from "./utilities" -import postgres from "../../../integrations/postgres" import { mocks } from "@budibase/backend-core/tests" import { env, events } from "@budibase/backend-core" const structures = setup.structures @@ -127,7 +126,6 @@ describe("/api/env/variables", () => { a: "string", b: "number", }) - expect(res.body.rows.length).toEqual(1) expect(events.query.previewed).toBeCalledTimes(1) expect(events.query.previewed).toBeCalledWith( From 8e480ac88471c2096b62f95bb7cee633f7fb685d Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Fri, 3 Feb 2023 09:19:27 +0000 Subject: [PATCH 5/8] check postgres has been called --- .../server/src/api/routes/tests/environmentVariables.spec.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/server/src/api/routes/tests/environmentVariables.spec.ts b/packages/server/src/api/routes/tests/environmentVariables.spec.ts index b09d6d2365..50304a812e 100644 --- a/packages/server/src/api/routes/tests/environmentVariables.spec.ts +++ b/packages/server/src/api/routes/tests/environmentVariables.spec.ts @@ -1,3 +1,4 @@ +const pg = require("pg") jest.mock("pg") import * as setup from "./utilities" import { mocks } from "@budibase/backend-core/tests" @@ -126,6 +127,7 @@ describe("/api/env/variables", () => { a: "string", b: "number", }) + expect(pg.queryMock).toHaveBeenCalled() expect(res.body.rows.length).toEqual(1) expect(events.query.previewed).toBeCalledTimes(1) expect(events.query.previewed).toBeCalledWith( From 7c702cd0ac681bb4bebc3ef229d01c03adbb4f98 Mon Sep 17 00:00:00 2001 From: Mateus Badan de Pieri Date: Tue, 7 Feb 2023 15:47:11 +0000 Subject: [PATCH 6/8] update tests remove comments --- .../server/src/api/routes/tests/environmentVariables.spec.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/server/src/api/routes/tests/environmentVariables.spec.ts b/packages/server/src/api/routes/tests/environmentVariables.spec.ts index 50304a812e..190e389991 100644 --- a/packages/server/src/api/routes/tests/environmentVariables.spec.ts +++ b/packages/server/src/api/routes/tests/environmentVariables.spec.ts @@ -91,7 +91,6 @@ describe("/api/env/variables", () => { }) it("should run a query preview and check the mocked results", async () => { - // TODO: use the preview API const datasourceBase = structures.basicDatasource() await request .post(`/api/env/variables`) @@ -122,7 +121,6 @@ describe("/api/env/variables", () => { .set(config.defaultHeaders()) .expect("Content-Type", /json/) .expect(200) - // these responses come from the mock expect(res.body.schemaFields).toEqual({ a: "string", b: "number", @@ -134,6 +132,5 @@ describe("/api/env/variables", () => { response.body.datasource, query ) - //expect(postgres.integration).toHaveBeenCalledWith() }) }) From 1a52bd8a50cad1a8473c64e6f07ba4f828fd6dd8 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 7 Feb 2023 18:11:33 +0000 Subject: [PATCH 7/8] Fixes based on test runs. --- .../server/src/api/controllers/query/index.ts | 2 ++ .../routes/tests/environmentVariables.spec.ts | 24 ++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/server/src/api/controllers/query/index.ts b/packages/server/src/api/controllers/query/index.ts index fd4842ea75..91e7f01afa 100644 --- a/packages/server/src/api/controllers/query/index.ts +++ b/packages/server/src/api/controllers/query/index.ts @@ -186,6 +186,8 @@ export async function preview(ctx: any) { schemaFields[key] = fieldType } } + // remove configuration before sending event + delete datasource.config await events.query.previewed(datasource, query) ctx.body = { rows, diff --git a/packages/server/src/api/routes/tests/environmentVariables.spec.ts b/packages/server/src/api/routes/tests/environmentVariables.spec.ts index 190e389991..3f32ded816 100644 --- a/packages/server/src/api/routes/tests/environmentVariables.spec.ts +++ b/packages/server/src/api/routes/tests/environmentVariables.spec.ts @@ -1,5 +1,15 @@ const pg = require("pg") -jest.mock("pg") +jest.mock("pg", () => { + return { + Client: jest.fn().mockImplementation(() => ({ + connect: jest.fn(), + query: jest.fn().mockImplementation(() => ({ rows: [] })), + end: jest.fn().mockImplementation((fn: any) => fn()), + })), + queryMock: jest.fn().mockImplementation(() => {}), + on: jest.fn(), + } +}) import * as setup from "./utilities" import { mocks } from "@budibase/backend-core/tests" import { env, events } from "@budibase/backend-core" @@ -14,7 +24,7 @@ describe("/api/env/variables", () => { afterAll(setup.afterAll) - beforeEach(async () => { + beforeAll(async () => { await config.init() }) @@ -121,16 +131,14 @@ describe("/api/env/variables", () => { .set(config.defaultHeaders()) .expect("Content-Type", /json/) .expect(200) - expect(res.body.schemaFields).toEqual({ - a: "string", - b: "number", - }) - expect(pg.queryMock).toHaveBeenCalled() - expect(res.body.rows.length).toEqual(1) + expect(res.body.rows.length).toEqual(0) expect(events.query.previewed).toBeCalledTimes(1) + // API doesn't include config in response + delete response.body.datasource.config expect(events.query.previewed).toBeCalledWith( response.body.datasource, query ) + expect(pg.Client).toHaveBeenCalledWith({ password: "test", ssl: undefined }) }) }) From ced811fc2362ddb3fa954f1d0c30829497e2512c Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 7 Feb 2023 18:35:22 +0000 Subject: [PATCH 8/8] Another quick fix. --- packages/server/src/api/routes/tests/query.seq.spec.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/server/src/api/routes/tests/query.seq.spec.js b/packages/server/src/api/routes/tests/query.seq.spec.js index 699d95fea2..d7481fd224 100644 --- a/packages/server/src/api/routes/tests/query.seq.spec.js +++ b/packages/server/src/api/routes/tests/query.seq.spec.js @@ -242,6 +242,7 @@ describe("/queries", () => { }) expect(res.body.rows.length).toEqual(1) expect(events.query.previewed).toBeCalledTimes(1) + delete datasource.config expect(events.query.previewed).toBeCalledWith(datasource, query) })