Testing some of the automation actions (still a few to complete) and adding quick test case for the self host stuff.
This commit is contained in:
parent
f71b92e54f
commit
189a673c9c
|
@ -55,9 +55,8 @@
|
|||
"!src/db/views/*.js",
|
||||
"!src/api/routes/tests/**/*.js",
|
||||
"!src/api/controllers/deploy/**/*.js",
|
||||
"!src/api/controllers/static/templates/**/*",
|
||||
"!src/api/controllers/static/selfhost/**/*",
|
||||
"!src/*.js"
|
||||
"!src/*.js",
|
||||
"!src/api/controllers/static/**/*"
|
||||
],
|
||||
"coverageReporters": [
|
||||
"lcov",
|
||||
|
|
|
@ -3,8 +3,8 @@ const {
|
|||
getAllTableRows,
|
||||
clearAllAutomations,
|
||||
} = require("./utilities/TestFunctions")
|
||||
const { basicAutomation } = require("./utilities/structures")
|
||||
const setup = require("./utilities")
|
||||
const { basicAutomation } = setup.structures
|
||||
|
||||
const MAX_RETRIES = 4
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
let {basicDatasource} = require("./utilities/structures")
|
||||
let {checkBuilderEndpoint} = require("./utilities/TestFunctions")
|
||||
let setup = require("./utilities")
|
||||
let { basicDatasource } = setup.structures
|
||||
let { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
||||
|
||||
describe("/datasources", () => {
|
||||
let request = setup.getRequest()
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
||||
const setup = require("./utilities")
|
||||
const { basicLayout } = require("./utilities/structures")
|
||||
const { basicLayout } = setup.structures
|
||||
|
||||
describe("/layouts", () => {
|
||||
let request = setup.getRequest()
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
const { BUILTIN_ROLE_IDS } = require("../../../utilities/security/roles")
|
||||
const setup = require("./utilities")
|
||||
const { basicRow } = require("./utilities/structures")
|
||||
const { basicRow } = setup.structures
|
||||
|
||||
const HIGHER_ROLE_ID = BUILTIN_ROLE_IDS.BASIC
|
||||
const STD_ROLE_ID = BUILTIN_ROLE_IDS.PUBLIC
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
// mock out postgres for this
|
||||
jest.mock("pg")
|
||||
|
||||
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
||||
const { basicQuery, basicDatasource } = require("./utilities/structures")
|
||||
const setup = require("./utilities")
|
||||
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
||||
const { basicQuery, basicDatasource } = setup.structures
|
||||
|
||||
describe("/queries", () => {
|
||||
let request = setup.getRequest()
|
||||
|
|
|
@ -2,8 +2,8 @@ const { BUILTIN_ROLE_IDS } = require("../../../utilities/security/roles")
|
|||
const {
|
||||
BUILTIN_PERMISSION_IDS,
|
||||
} = require("../../../utilities/security/permissions")
|
||||
const { basicRole } = require("./utilities/structures")
|
||||
const setup = require("./utilities")
|
||||
const { basicRole } = setup.structures
|
||||
|
||||
describe("/roles", () => {
|
||||
let request = setup.getRequest()
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
const setup = require("./utilities")
|
||||
const { basicScreen } = require("./utilities/structures")
|
||||
const { basicScreen } = setup.structures
|
||||
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
||||
const { BUILTIN_ROLE_IDS } = require("../../../utilities/security/roles")
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
const { outputProcessing } = require("../../../utilities/rowProcessor")
|
||||
const env = require("../../../environment")
|
||||
const { basicRow } = require("./utilities/structures")
|
||||
const setup = require("./utilities")
|
||||
const { basicRow } = setup.structures
|
||||
|
||||
describe("/rows", () => {
|
||||
let request = setup.getRequest()
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
||||
const setup = require("./utilities")
|
||||
const { basicScreen } = require("./utilities/structures")
|
||||
const { basicScreen } = setup.structures
|
||||
|
||||
describe("/screens", () => {
|
||||
let request = setup.getRequest()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
const { BUILTIN_ROLE_IDS } = require("../../../utilities/security/roles")
|
||||
const { checkPermissionsEndpoint } = require("./utilities/TestFunctions")
|
||||
const { basicUser } = require("./utilities/structures")
|
||||
const setup = require("./utilities")
|
||||
const { basicUser } = setup.structures
|
||||
|
||||
describe("/users", () => {
|
||||
let request = setup.getRequest()
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
module.exports = {
|
||||
table: require("../../../controllers/table"),
|
||||
row: require("../../../controllers/row"),
|
||||
role: require("../../../controllers/role"),
|
||||
perms: require("../../../controllers/permission"),
|
||||
view: require("../../../controllers/view"),
|
||||
app: require("../../../controllers/application"),
|
||||
user: require("../../../controllers/user"),
|
||||
automation: require("../../../controllers/automation"),
|
||||
datasource: require("../../../controllers/datasource"),
|
||||
query: require("../../../controllers/query"),
|
||||
screen: require("../../../controllers/screen"),
|
||||
webhook: require("../../../controllers/webhook"),
|
||||
layout: require("../../../controllers/layout"),
|
||||
}
|
|
@ -1,4 +1,5 @@
|
|||
const TestConfig = require("./TestConfiguration")
|
||||
const TestConfig = require("../../../../tests/utilities/TestConfiguration")
|
||||
const structures = require("../../../../tests/utilities/structures")
|
||||
const env = require("../../../../environment")
|
||||
|
||||
exports.delay = ms => new Promise(resolve => setTimeout(resolve, ms))
|
||||
|
@ -51,3 +52,5 @@ exports.switchToCloudForFunction = async func => {
|
|||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
exports.structures = structures
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
const setup = require("./utilities")
|
||||
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
||||
const { basicWebhook, basicAutomation } = require("./utilities/structures")
|
||||
const { basicWebhook, basicAutomation } = setup.structures
|
||||
|
||||
describe("/webhooks", () => {
|
||||
let request = setup.getRequest()
|
||||
|
|
|
@ -37,10 +37,12 @@ let AUTOMATION_BUCKET = env.AUTOMATION_BUCKET
|
|||
let AUTOMATION_DIRECTORY = env.AUTOMATION_DIRECTORY
|
||||
let MANIFEST = null
|
||||
|
||||
/* instanbul ignore next */
|
||||
function buildBundleName(pkgName, version) {
|
||||
return `${pkgName}@${version}.min.js`
|
||||
}
|
||||
|
||||
/* instanbul ignore next */
|
||||
async function downloadPackage(name, version, bundleName) {
|
||||
await download(
|
||||
`${AUTOMATION_BUCKET}/${name}/${version}/${bundleName}`,
|
||||
|
@ -96,5 +98,6 @@ module.exports.init = async function() {
|
|||
return MANIFEST
|
||||
}
|
||||
|
||||
// definitions will have downloaded ones added to it, while builtin won't
|
||||
module.exports.DEFINITIONS = BUILTIN_DEFINITIONS
|
||||
module.exports.BUILTIN_DEFINITIONS = BUILTIN_DEFINITIONS
|
||||
|
|
|
@ -59,15 +59,14 @@ module.exports.definition = {
|
|||
}
|
||||
|
||||
module.exports.run = async function({ inputs, appId, apiKey, emitter }) {
|
||||
// TODO: better logging of when actions are missed due to missing parameters
|
||||
if (inputs.row == null || inputs.row.tableId == null) {
|
||||
return
|
||||
return {
|
||||
success: false,
|
||||
response: {
|
||||
message: "Invalid inputs",
|
||||
},
|
||||
}
|
||||
}
|
||||
inputs.row = await automationUtils.cleanUpRow(
|
||||
appId,
|
||||
inputs.row.tableId,
|
||||
inputs.row
|
||||
)
|
||||
// have to clean up the row, remove the table from it
|
||||
const ctx = {
|
||||
params: {
|
||||
|
@ -81,6 +80,11 @@ module.exports.run = async function({ inputs, appId, apiKey, emitter }) {
|
|||
}
|
||||
|
||||
try {
|
||||
inputs.row = await automationUtils.cleanUpRow(
|
||||
appId,
|
||||
inputs.row.tableId,
|
||||
inputs.row
|
||||
)
|
||||
if (env.CLOUD) {
|
||||
await usage.update(apiKey, usage.Properties.ROW, 1)
|
||||
}
|
||||
|
|
|
@ -12,6 +12,9 @@ const PrettyLogicConditions = {
|
|||
[LogicConditions.LESS_THAN]: "Less than",
|
||||
}
|
||||
|
||||
module.exports.LogicConditions = LogicConditions
|
||||
module.exports.PrettyLogicConditions = PrettyLogicConditions
|
||||
|
||||
module.exports.definition = {
|
||||
name: "Filter",
|
||||
tagline: "{{inputs.field}} {{inputs.condition}} {{inputs.value}}",
|
||||
|
@ -64,7 +67,7 @@ module.exports.run = async function filter({ inputs }) {
|
|||
value = Date.parse(value)
|
||||
field = Date.parse(field)
|
||||
}
|
||||
let success
|
||||
let success = false
|
||||
if (typeof field !== "object" && typeof value !== "object") {
|
||||
switch (condition) {
|
||||
case LogicConditions.EQUAL:
|
||||
|
@ -79,8 +82,6 @@ module.exports.run = async function filter({ inputs }) {
|
|||
case LogicConditions.LESS_THAN:
|
||||
success = field < value
|
||||
break
|
||||
default:
|
||||
return
|
||||
}
|
||||
} else {
|
||||
success = false
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
const usageQuota = require("../../utilities/usageQuota")
|
||||
const env = require("../../environment")
|
||||
const setup = require("./utilities")
|
||||
|
||||
jest.mock("../../utilities/usageQuota")
|
||||
|
||||
describe("test the create row action", () => {
|
||||
let table, row
|
||||
let config = setup.getConfig()
|
||||
|
||||
beforeEach(async () => {
|
||||
await config.init()
|
||||
table = await config.createTable()
|
||||
row = {
|
||||
tableId: table._id,
|
||||
name: "test",
|
||||
description: "test",
|
||||
}
|
||||
})
|
||||
|
||||
afterAll(setup.afterAll)
|
||||
|
||||
it("should be able to run the action", async () => {
|
||||
const res = await setup.runStep(setup.actions.CREATE_ROW.stepId, {
|
||||
row,
|
||||
})
|
||||
expect(res.id).toBeDefined()
|
||||
expect(res.revision).toBeDefined()
|
||||
const gottenRow = await config.getRow(table._id, res.id)
|
||||
expect(gottenRow.name).toEqual("test")
|
||||
expect(gottenRow.description).toEqual("test")
|
||||
})
|
||||
|
||||
it("should return an error (not throw) when bad info provided", async () => {
|
||||
const res = await setup.runStep(setup.actions.CREATE_ROW.stepId, {
|
||||
row: {
|
||||
tableId: "invalid",
|
||||
invalid: "invalid",
|
||||
}
|
||||
})
|
||||
expect(res.success).toEqual(false)
|
||||
})
|
||||
|
||||
it("check usage quota attempts", async () => {
|
||||
env.CLOUD = true
|
||||
await setup.runStep(setup.actions.CREATE_ROW.stepId, {
|
||||
row
|
||||
})
|
||||
expect(usageQuota.update).toHaveBeenCalledWith(setup.apiKey, "rows", 1)
|
||||
env.CLOUD = false
|
||||
})
|
||||
|
||||
it("should check invalid inputs return an error", async () => {
|
||||
const res = await setup.runStep(setup.actions.CREATE_ROW.stepId, {})
|
||||
expect(res.success).toEqual(false)
|
||||
})
|
||||
})
|
|
@ -0,0 +1,43 @@
|
|||
const usageQuota = require("../../utilities/usageQuota")
|
||||
const env = require("../../environment")
|
||||
const setup = require("./utilities")
|
||||
const { BUILTIN_ROLE_IDS } = require("../../utilities/security/roles")
|
||||
const { ViewNames } = require("../../db/utils")
|
||||
|
||||
jest.mock("../../utilities/usageQuota")
|
||||
|
||||
describe("test the create user action", () => {
|
||||
let config = setup.getConfig()
|
||||
let user
|
||||
|
||||
beforeEach(async () => {
|
||||
await config.init()
|
||||
user = {
|
||||
email: "test@test.com",
|
||||
password: "password",
|
||||
roleId: BUILTIN_ROLE_IDS.POWER
|
||||
}
|
||||
})
|
||||
|
||||
afterAll(setup.afterAll)
|
||||
|
||||
it("should be able to run the action", async () => {
|
||||
const res = await setup.runStep(setup.actions.CREATE_USER.stepId, user)
|
||||
expect(res.id).toBeDefined()
|
||||
expect(res.revision).toBeDefined()
|
||||
const userDoc = await config.getRow(ViewNames.USERS, res.id)
|
||||
expect(userDoc.email).toEqual(user.email)
|
||||
})
|
||||
|
||||
it("should return an error if no inputs provided", async () => {
|
||||
const res = await setup.runStep(setup.actions.CREATE_USER.stepId, {})
|
||||
expect(res.success).toEqual(false)
|
||||
})
|
||||
|
||||
it("check usage quota attempts", async () => {
|
||||
env.CLOUD = true
|
||||
await setup.runStep(setup.actions.CREATE_USER.stepId, user)
|
||||
expect(usageQuota.update).toHaveBeenCalledWith(setup.apiKey, "users", 1)
|
||||
env.CLOUD = false
|
||||
})
|
||||
})
|
|
@ -0,0 +1,12 @@
|
|||
const setup = require("./utilities")
|
||||
|
||||
describe("test the delay action", () => {
|
||||
it("should be able to run the delay", async () => {
|
||||
const time = 100
|
||||
const before = Date.now()
|
||||
await setup.runStep(setup.logic.DELAY.stepId, { time: time })
|
||||
const now = Date.now()
|
||||
// divide by two just so that test will always pass as long as there was some sort of delay
|
||||
expect(now - before).toBeGreaterThanOrEqual(time / 2)
|
||||
})
|
||||
})
|
|
@ -0,0 +1,48 @@
|
|||
const setup = require("./utilities")
|
||||
const { LogicConditions } = require("../steps/filter")
|
||||
|
||||
describe("test the delay action", () => {
|
||||
async function checkFilter(field, condition, value, pass = true) {
|
||||
let res = await setup.runStep(setup.logic.FILTER.stepId,
|
||||
{ field, condition, value }
|
||||
)
|
||||
expect(res.success).toEqual(pass)
|
||||
}
|
||||
|
||||
it("should be able test equality", async () => {
|
||||
await checkFilter("hello", LogicConditions.EQUAL, "hello", true)
|
||||
await checkFilter("hello", LogicConditions.EQUAL, "no", false)
|
||||
})
|
||||
|
||||
it("should be able to test greater than", async () => {
|
||||
await checkFilter(10, LogicConditions.GREATER_THAN, 5, true)
|
||||
await checkFilter(10, LogicConditions.GREATER_THAN, 15, false)
|
||||
})
|
||||
|
||||
it("should be able to test less than", async () => {
|
||||
await checkFilter(5, LogicConditions.LESS_THAN, 10, true)
|
||||
await checkFilter(15, LogicConditions.LESS_THAN, 10, false)
|
||||
})
|
||||
|
||||
it("should be able to in-equality", async () => {
|
||||
await checkFilter("hello", LogicConditions.NOT_EQUAL, "no", true)
|
||||
await checkFilter(10, LogicConditions.NOT_EQUAL, 10, false)
|
||||
})
|
||||
|
||||
it("check number coercion", async () => {
|
||||
await checkFilter("10", LogicConditions.GREATER_THAN, "5", true)
|
||||
})
|
||||
|
||||
it("check date coercion", async () => {
|
||||
await checkFilter(
|
||||
(new Date()).toISOString(),
|
||||
LogicConditions.GREATER_THAN,
|
||||
(new Date(-10000)).toISOString(),
|
||||
true
|
||||
)
|
||||
})
|
||||
|
||||
it("check objects always false", async () => {
|
||||
await checkFilter({}, LogicConditions.EQUAL, {}, false)
|
||||
})
|
||||
})
|
|
@ -0,0 +1,43 @@
|
|||
const TestConfig = require("../../../tests/utilities/TestConfiguration")
|
||||
const actions = require("../../actions")
|
||||
const logic = require("../../logic")
|
||||
const emitter = require("../../../events/index")
|
||||
|
||||
let config
|
||||
|
||||
exports.getConfig = () => {
|
||||
if (!config) {
|
||||
config = new TestConfig(false)
|
||||
}
|
||||
return config
|
||||
}
|
||||
|
||||
exports.afterAll = () => {
|
||||
config.end()
|
||||
}
|
||||
|
||||
exports.runStep = async function runStep(stepId, inputs) {
|
||||
let step
|
||||
if (
|
||||
Object.values(exports.actions)
|
||||
.map(action => action.stepId)
|
||||
.includes(stepId)
|
||||
) {
|
||||
step = await actions.getAction(stepId)
|
||||
} else {
|
||||
step = logic.getLogic(stepId)
|
||||
}
|
||||
expect(step).toBeDefined()
|
||||
return step({
|
||||
inputs,
|
||||
appId: config ? config.getAppId() : null,
|
||||
// don't really need an API key, mocked out usage quota, not being tested here
|
||||
apiKey: exports.apiKey,
|
||||
emitter,
|
||||
})
|
||||
}
|
||||
|
||||
exports.apiKey = "test"
|
||||
|
||||
exports.actions = actions.BUILTIN_DEFINITIONS
|
||||
exports.logic = logic.BUILTIN_DEFINITIONS
|
|
@ -3,7 +3,7 @@ const usageQuota = require("../../utilities/usageQuota")
|
|||
const CouchDB = require("../../db")
|
||||
const env = require("../../environment")
|
||||
|
||||
jest.mock("../../db");
|
||||
jest.mock("../../db")
|
||||
jest.mock("../../utilities/usageQuota")
|
||||
jest.mock("../../environment")
|
||||
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
const selfhost = require("..")
|
||||
const env = require("../../environment")
|
||||
|
||||
describe("test the setup process", () => {
|
||||
beforeAll(() => {
|
||||
env.SELF_HOSTED = true
|
||||
})
|
||||
|
||||
beforeEach(async () => {
|
||||
await selfhost.init()
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
env.SELF_HOSTED = false
|
||||
})
|
||||
|
||||
it("getSelfHostInfo", async () => {
|
||||
let info = await selfhost.getSelfHostInfo()
|
||||
expect(info._id).toEqual("self-host-info")
|
||||
})
|
||||
|
||||
it("getSelfHostAPIKey", async () => {
|
||||
let apiKey = await selfhost.getSelfHostAPIKey()
|
||||
expect(typeof apiKey).toEqual("string")
|
||||
})
|
||||
})
|
|
@ -1,6 +1,6 @@
|
|||
const { BUILTIN_ROLE_IDS } = require("../../../../utilities/security/roles")
|
||||
const { BUILTIN_ROLE_IDS } = require("../../utilities/security/roles")
|
||||
const jwt = require("jsonwebtoken")
|
||||
const env = require("../../../../environment")
|
||||
const env = require("../../environment")
|
||||
const {
|
||||
basicTable,
|
||||
basicRow,
|
||||
|
@ -15,18 +15,20 @@ const {
|
|||
const controllers = require("./controllers")
|
||||
const supertest = require("supertest")
|
||||
const fs = require("fs")
|
||||
const { budibaseAppsDir } = require("../../../../utilities/budibaseDir")
|
||||
const { budibaseAppsDir } = require("../../utilities/budibaseDir")
|
||||
const { join } = require("path")
|
||||
|
||||
const EMAIL = "babs@babs.com"
|
||||
const PASSWORD = "babs_password"
|
||||
|
||||
class TestConfiguration {
|
||||
constructor() {
|
||||
constructor(openServer = true) {
|
||||
if (openServer) {
|
||||
env.PORT = 4002
|
||||
this.server = require("../../../../app")
|
||||
this.server = require("../../app")
|
||||
// we need the request for logging in, involves cookies, hard to fake
|
||||
this.request = supertest(this.server)
|
||||
}
|
||||
this.appId = null
|
||||
this.allApps = []
|
||||
}
|
||||
|
@ -61,7 +63,9 @@ class TestConfiguration {
|
|||
}
|
||||
|
||||
end() {
|
||||
if (this.server) {
|
||||
this.server.close()
|
||||
}
|
||||
const appDir = budibaseAppsDir()
|
||||
const files = fs.readdirSync(appDir)
|
||||
for (let file of files) {
|
||||
|
@ -163,6 +167,10 @@ class TestConfiguration {
|
|||
return this._req(config, { tableId: this.table._id }, controllers.row.save)
|
||||
}
|
||||
|
||||
async getRow(tableId, rowId) {
|
||||
return this._req(null, { tableId, rowId }, controllers.row.find)
|
||||
}
|
||||
|
||||
async createRole(config = null) {
|
||||
config = config || basicRole()
|
||||
return this._req(config, null, controllers.role.save)
|
||||
|
@ -285,6 +293,9 @@ class TestConfiguration {
|
|||
}
|
||||
|
||||
async login(email, password) {
|
||||
if (!this.request) {
|
||||
throw "Server has not been opened, cannot login."
|
||||
}
|
||||
if (!email || !password) {
|
||||
await this.createUser()
|
||||
email = EMAIL
|
|
@ -0,0 +1,15 @@
|
|||
module.exports = {
|
||||
table: require("../../api/controllers/table"),
|
||||
row: require("../../api/controllers/row"),
|
||||
role: require("../../api/controllers/role"),
|
||||
perms: require("../../api/controllers/permission"),
|
||||
view: require("../../api/controllers/view"),
|
||||
app: require("../../api/controllers/application"),
|
||||
user: require("../../api/controllers/user"),
|
||||
automation: require("../../api/controllers/automation"),
|
||||
datasource: require("../../api/controllers/datasource"),
|
||||
query: require("../../api/controllers/query"),
|
||||
screen: require("../../api/controllers/screen"),
|
||||
webhook: require("../../api/controllers/webhook"),
|
||||
layout: require("../../api/controllers/layout"),
|
||||
}
|
|
@ -1,9 +1,9 @@
|
|||
const { BUILTIN_ROLE_IDS } = require("../../../../utilities/security/roles")
|
||||
const { BUILTIN_ROLE_IDS } = require("../../utilities/security/roles")
|
||||
const {
|
||||
BUILTIN_PERMISSION_IDS,
|
||||
} = require("../../../../utilities/security/permissions")
|
||||
const { createHomeScreen } = require("../../../../constants/screens")
|
||||
const { EMPTY_LAYOUT } = require("../../../../constants/layouts")
|
||||
} = require("../../utilities/security/permissions")
|
||||
const { createHomeScreen } = require("../../constants/screens")
|
||||
const { EMPTY_LAYOUT } = require("../../constants/layouts")
|
||||
const { cloneDeep } = require("lodash/fp")
|
||||
|
||||
exports.basicTable = () => {
|
Loading…
Reference in New Issue