From d4736182270c122508b2fee1f517a651d2aad414 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Thu, 14 Mar 2024 08:02:06 +0000 Subject: [PATCH] tests --- packages/server/src/integrations/rest.ts | 7 +- .../src/integrations/tests/rest.spec.ts | 75 ++++++++++++++++++- 2 files changed, 75 insertions(+), 7 deletions(-) diff --git a/packages/server/src/integrations/rest.ts b/packages/server/src/integrations/rest.ts index 4e40687482..ae3f7fe6b0 100644 --- a/packages/server/src/integrations/rest.ts +++ b/packages/server/src/integrations/rest.ts @@ -22,6 +22,7 @@ import FormData from "form-data" import { URLSearchParams } from "url" import { blacklist, context, objectStore } from "@budibase/backend-core" import { v4 } from "uuid" + const BodyTypes = { NONE: "none", FORM_DATA: "form", @@ -170,12 +171,6 @@ class RestIntegration implements IntegrationBase { size: formatBytes(responseBuffer.byteLength), time: `${Math.round(performance.now() - this.startTimeMs)}ms`, }, - extra: { - headers: response.headers.raw(), - }, - pagination: { - cursor: null, - }, } } else { if (response.status === 204) { diff --git a/packages/server/src/integrations/tests/rest.spec.ts b/packages/server/src/integrations/tests/rest.spec.ts index bc0c0cac2f..c7fc55d910 100644 --- a/packages/server/src/integrations/tests/rest.spec.ts +++ b/packages/server/src/integrations/tests/rest.spec.ts @@ -13,9 +13,30 @@ jest.mock("node-fetch", () => { })) }) -import fetch from "node-fetch" +jest.mock("@budibase/backend-core", () => { + const core = jest.requireActual("@budibase/backend-core") + return { + ...core, + objectStore: { + ...core.objectStore, + ObjectStoreBuckets: { + APPS: "apps", + }, + upload: jest.fn(), + getPresignedUrl: jest.fn(() => "https://presigned-url.com"), + }, + context: { + ...core.context, + getProdAppId: jest.fn(() => "app-id"), + }, + } +}) +jest.mock("uuid", () => ({ v4: () => "00000000-0000-0000-0000-000000000000" })) + import { default as RestIntegration } from "../rest" import { RestAuthType } from "@budibase/types" +import { objectStore } from "@budibase/backend-core" +import fetch from "node-fetch" const FormData = require("form-data") const { URLSearchParams } = require("url") @@ -611,4 +632,56 @@ describe("REST Integration", () => { expect(calledConfig.headers).toEqual({}) expect(calledConfig.agent.options.rejectUnauthorized).toBe(false) }) + + it("uploads file to object store and returns signed URL", async () => { + const responseData = Buffer.from("test file content") + const filename = "test.tar.gz" + const contentType = "application/gzip" + + ;(fetch as unknown as jest.Mock).mockImplementationOnce(() => + Promise.resolve({ + headers: { + raw: () => ({ + "content-type": [contentType], + "content-disposition": [`attachment; filename="${filename}"`], + }), + get: (header: any) => { + if (header === "content-type") return contentType + if (header === "content-disposition") + return `attachment; filename="${filename}"` + }, + }, + arrayBuffer: jest.fn(() => Promise.resolve(responseData)), + }) + ) + + const query = { + path: "api", + } + + const response = await config.integration.read(query) + + expect(objectStore.upload).toHaveBeenCalledWith({ + bucket: objectStore.ObjectStoreBuckets.APPS, + filename: expect.stringContaining( + "app-id/attachments/00000000-0000-0000-0000-000000000000.tar.gz" + ), + ttl: 1800, + body: responseData, + }) + + expect(objectStore.getPresignedUrl).toHaveBeenCalledWith( + "test", + expect.stringContaining(`app-id/attachments/`), + 600 + ) + + expect(response.data).toEqual({ + size: responseData.byteLength, + name: expect.stringContaining(".tar.gz"), + url: "https://presigned-url.com", + extension: "tar.gz", + key: expect.stringContaining(`app-id/attachments/`), + }) + }) })