budibase/packages/core/test/apiWrapper.spec.js

170 lines
4.4 KiB
JavaScript

import { apiWrapper, apiWrapperSync } from "../src/common/apiWrapper"
import { filter } from "lodash/fp"
import { events } from "../src/common"
const getApp = () => {
var events = []
return {
publish: (name, context) => events.push({ name, context }),
events,
getEvents: n => filter(e => e.name === n)(events),
}
}
describe("apiWrapper", () => {
const testNamespace = {
onBegin: "testArea:testMethod:onBegin",
onComplete: "testArea:testMethod:onComplete",
onError: "testArea:testMethod:onError",
}
const getCompleteEvents = app => app.getEvents(testNamespace.onComplete)
const getBeginEvents = app => app.getEvents(testNamespace.onBegin)
const getErrorEvents = app => app.getEvents(testNamespace.onError)
const runThrowEx = (arg1, arg2) => {
const throwEx = () => {
throw new Error("test error")
}
const app = getApp()
try {
apiWrapperSync(
app,
testNamespace,
() => true,
{ prop: "hello" },
throwEx,
arg1,
arg2
)
} catch (error) {
return { app, error }
}
return { app, error: "error was not thrown" }
}
const runThrowExAsync = async (arg1, arg2) => {
const throwEx = async () => {
throw new Error("test error")
}
const app = getApp()
try {
await apiWrapper(
app,
testNamespace,
() => true,
{ prop: "hello" },
throwEx,
arg1,
arg2
)
} catch (error) {
return { app, error }
}
return { app, error: "error was not thrown" }
}
const runAdd = (arg1, arg2, isAuthorized = true) => {
const add = (x, y) => x + y
const app = getApp()
const result = apiWrapperSync(
app,
testNamespace,
() => isAuthorized,
{ prop: "hello" },
add,
arg1,
arg2
)
return { app, result }
}
const runAddAsync = async (arg1, arg2, isAuthorized = true) => {
const add = async (x, y) => x + y
const app = getApp()
const result = await apiWrapper(
app,
testNamespace,
() => isAuthorized,
{ prop: "hello" },
add,
arg1,
arg2
)
return { app, result }
}
it("should return result of inner function", () => {
expect(runAdd(1, 2).result).toBe(3)
})
it("should throw error when unauthorized", () => {
expect(() => runAdd(1, 2, false)).toThrow(/Unauthorized/)
})
it("should async throw error when unauthorized", async () => {
let foundE = null
try {
await runAddAsync(1, 2, false)
} catch (ex) {
foundE = ex
}
expect(foundE).not.toBeNull()
})
it("should return result of inner function when async", async () => {
expect((await runAddAsync(1, 2)).result).toBe(3)
})
it("should publish begin and complete events", () => {
const { app } = runAdd(1, 2)
const onCompleteEvents = getCompleteEvents(app)
const onBeginEvents = getBeginEvents(app)
expect(onCompleteEvents.length).toBe(1)
expect(onCompleteEvents[0].context.prop).toBe("hello")
expect(onBeginEvents.length).toBe(1)
expect(onBeginEvents[0].context.prop).toBe("hello")
})
it("should throw exception when inner function happens", () => {
const { error } = runThrowEx(1, 2)
expect(error).toBeDefined()
expect(error.message).toBe("test error")
})
it("should publish error event when inner exception", () => {
const { app } = runThrowEx(1, 2)
const errorEvents = getErrorEvents(app)
expect(errorEvents.length).toBe(1)
expect(errorEvents[0].context.error.message).toBe("test error")
})
it("should throw exception when inner function happens, on async", async () => {
const { error } = await runThrowExAsync(1, 2)
expect(error).toBeDefined()
expect(error.message).toBe("test error")
})
it("should publish error event when inner exception, on async", async () => {
const { app } = await runThrowExAsync(1, 2)
const errorEvents = getErrorEvents(app)
expect(errorEvents.length).toBe(1)
expect(errorEvents[0].context.error.message).toBe("test error")
})
})
describe("events", () => {
it("should return contain various spot checked events", () => {
expect(events.recordApi.save.onComplete).toBe("recordApi:save:onComplete")
expect(events.indexApi.buildIndex.onBegin).toBe(
"indexApi:buildIndex:onBegin"
)
expect(events.collectionApi.initialise.onError).toBe(
"collectionApi:initialise:onError"
)
})
})