Adding basic tests for public API app export/import.
This commit is contained in:
parent
fe5cc6878b
commit
c0a2940d8b
|
@ -1 +1 @@
|
||||||
Subproject commit 6c193aa50bc5eca7757db886c8457f516dafc1b8
|
Subproject commit 874321ba70cfe6ae3d7515b3b7d66185c4fe03cc
|
|
@ -0,0 +1,81 @@
|
||||||
|
import * as setup from "../../tests/utilities"
|
||||||
|
import {
|
||||||
|
generateMakeRequest,
|
||||||
|
generateMakeRequestWithFormData,
|
||||||
|
MakeRequestResponse,
|
||||||
|
MakeRequestWithFormDataResponse,
|
||||||
|
} from "./utils"
|
||||||
|
import { User } from "@budibase/types"
|
||||||
|
import { join } from "path"
|
||||||
|
import { mocks } from "@budibase/backend-core/tests"
|
||||||
|
|
||||||
|
const PASSWORD = "testtest"
|
||||||
|
const NO_LICENSE_MSG = "Endpoint unavailable, license required."
|
||||||
|
|
||||||
|
let config = setup.getConfig()
|
||||||
|
let apiKey: string,
|
||||||
|
globalUser: User,
|
||||||
|
makeRequest: MakeRequestResponse,
|
||||||
|
makeRequestFormData: MakeRequestWithFormDataResponse
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await config.init()
|
||||||
|
globalUser = await config.globalUser()
|
||||||
|
apiKey = await config.generateApiKey(globalUser._id)
|
||||||
|
makeRequest = generateMakeRequest(apiKey)
|
||||||
|
makeRequestFormData = generateMakeRequestWithFormData(apiKey)
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(setup.afterAll)
|
||||||
|
|
||||||
|
describe("check export/import", () => {
|
||||||
|
async function runExport() {
|
||||||
|
return await makeRequest("post", `/applications/${config.appId}/export`, {
|
||||||
|
encryptionPassword: PASSWORD,
|
||||||
|
excludeRows: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async function runImport() {
|
||||||
|
const pathToExport = join(
|
||||||
|
__dirname,
|
||||||
|
"..",
|
||||||
|
"..",
|
||||||
|
"tests",
|
||||||
|
"assets",
|
||||||
|
"export.tar.gz"
|
||||||
|
)
|
||||||
|
return await makeRequestFormData(
|
||||||
|
"post",
|
||||||
|
`/applications/${config.appId}/import`,
|
||||||
|
{
|
||||||
|
encryptionPassword: PASSWORD,
|
||||||
|
appExport: { path: pathToExport },
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
it("check licensing for export", async () => {
|
||||||
|
const res = await runExport()
|
||||||
|
expect(res.status).toBe(403)
|
||||||
|
expect(res.body.message).toBe(NO_LICENSE_MSG)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("check licensing for import", async () => {
|
||||||
|
const res = await runImport()
|
||||||
|
expect(res.status).toBe(403)
|
||||||
|
expect(res.body.message).toBe(NO_LICENSE_MSG)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should be able to export app", async () => {
|
||||||
|
mocks.licenses.useExpandedPublicApi()
|
||||||
|
const res = await runExport()
|
||||||
|
expect(res.status).toBe(200)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should be able to import app", async () => {
|
||||||
|
mocks.licenses.useExpandedPublicApi()
|
||||||
|
const res = await runImport()
|
||||||
|
expect(res.status).toBe(204)
|
||||||
|
})
|
||||||
|
})
|
|
@ -11,6 +11,32 @@ export type MakeRequestResponse = (
|
||||||
intAppId?: string
|
intAppId?: string
|
||||||
) => Promise<supertest.Response>
|
) => Promise<supertest.Response>
|
||||||
|
|
||||||
|
export type MakeRequestWithFormDataResponse = (
|
||||||
|
method: HttpMethod,
|
||||||
|
endpoint: string,
|
||||||
|
fields: Record<string, string | { path: string }>,
|
||||||
|
intAppId?: string
|
||||||
|
) => Promise<supertest.Response>
|
||||||
|
|
||||||
|
function base(
|
||||||
|
apiKey: string,
|
||||||
|
endpoint: string,
|
||||||
|
intAppId: string | null,
|
||||||
|
isInternal: boolean
|
||||||
|
) {
|
||||||
|
const extraHeaders: any = {
|
||||||
|
"x-budibase-api-key": apiKey,
|
||||||
|
}
|
||||||
|
if (intAppId) {
|
||||||
|
extraHeaders["x-budibase-app-id"] = intAppId
|
||||||
|
}
|
||||||
|
|
||||||
|
const url = isInternal
|
||||||
|
? endpoint
|
||||||
|
: checkSlashesInUrl(`/api/public/v1/${endpoint}`)
|
||||||
|
return { headers: extraHeaders, url }
|
||||||
|
}
|
||||||
|
|
||||||
export function generateMakeRequest(
|
export function generateMakeRequest(
|
||||||
apiKey: string,
|
apiKey: string,
|
||||||
isInternal = false
|
isInternal = false
|
||||||
|
@ -23,18 +49,8 @@ export function generateMakeRequest(
|
||||||
body?: any,
|
body?: any,
|
||||||
intAppId: string | null = config.getAppId()
|
intAppId: string | null = config.getAppId()
|
||||||
) => {
|
) => {
|
||||||
const extraHeaders: any = {
|
const { headers, url } = base(apiKey, endpoint, intAppId, isInternal)
|
||||||
"x-budibase-api-key": apiKey,
|
const req = request[method](url).set(config.defaultHeaders(headers))
|
||||||
}
|
|
||||||
if (intAppId) {
|
|
||||||
extraHeaders["x-budibase-app-id"] = intAppId
|
|
||||||
}
|
|
||||||
|
|
||||||
const url = isInternal
|
|
||||||
? endpoint
|
|
||||||
: checkSlashesInUrl(`/api/public/v1/${endpoint}`)
|
|
||||||
|
|
||||||
const req = request[method](url).set(config.defaultHeaders(extraHeaders))
|
|
||||||
if (body) {
|
if (body) {
|
||||||
req.send(body)
|
req.send(body)
|
||||||
}
|
}
|
||||||
|
@ -43,3 +59,30 @@ export function generateMakeRequest(
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function generateMakeRequestWithFormData(
|
||||||
|
apiKey: string,
|
||||||
|
isInternal = false
|
||||||
|
): MakeRequestWithFormDataResponse {
|
||||||
|
const request = setup.getRequest()!
|
||||||
|
const config = setup.getConfig()!
|
||||||
|
return async (
|
||||||
|
method: HttpMethod,
|
||||||
|
endpoint: string,
|
||||||
|
fields: Record<string, string | { path: string }>,
|
||||||
|
intAppId: string | null = config.getAppId()
|
||||||
|
) => {
|
||||||
|
const { headers, url } = base(apiKey, endpoint, intAppId, isInternal)
|
||||||
|
const req = request[method](url).set(config.defaultHeaders(headers))
|
||||||
|
for (let [field, value] of Object.entries(fields)) {
|
||||||
|
if (typeof value === "string") {
|
||||||
|
req.field(field, value)
|
||||||
|
} else {
|
||||||
|
req.attach(field, value.path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const res = await req
|
||||||
|
expect(res.body).toBeDefined()
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue