Updating query test to include mocked preview/execute and adding layout tests.
This commit is contained in:
parent
f1abb9194f
commit
0c51bb7275
|
@ -0,0 +1,21 @@
|
||||||
|
const pg = {}
|
||||||
|
|
||||||
|
// constructor
|
||||||
|
function Client() {}
|
||||||
|
|
||||||
|
Client.prototype.query = async function() {
|
||||||
|
return {
|
||||||
|
rows: [
|
||||||
|
{
|
||||||
|
a: "string",
|
||||||
|
b: 1,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Client.prototype.connect = async function() {}
|
||||||
|
|
||||||
|
pg.Client = Client
|
||||||
|
|
||||||
|
module.exports = pg
|
|
@ -38,6 +38,6 @@ exports.destroy = async function(ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
await db.remove(layoutId, layoutRev)
|
await db.remove(layoutId, layoutRev)
|
||||||
ctx.message = "Layout deleted successfully"
|
ctx.body = { message: "Layout deleted successfully" }
|
||||||
ctx.status = 200
|
ctx.status = 200
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,7 +108,6 @@ exports.preview = async function(ctx) {
|
||||||
|
|
||||||
if (!Integration) {
|
if (!Integration) {
|
||||||
ctx.throw(400, "Integration type does not exist.")
|
ctx.throw(400, "Integration type does not exist.")
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const { fields, parameters, queryVerb } = ctx.request.body
|
const { fields, parameters, queryVerb } = ctx.request.body
|
||||||
|
@ -138,7 +137,6 @@ exports.execute = async function(ctx) {
|
||||||
|
|
||||||
if (!Integration) {
|
if (!Integration) {
|
||||||
ctx.throw(400, "Integration type does not exist.")
|
ctx.throw(400, "Integration type does not exist.")
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const enrichedQuery = await enrichQueryFields(
|
const enrichedQuery = await enrichQueryFields(
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
||||||
|
const setup = require("./utilities")
|
||||||
|
const { basicLayout } = require("./utilities/structures")
|
||||||
|
|
||||||
|
describe("/queries", () => {
|
||||||
|
let request = setup.getRequest()
|
||||||
|
let config = setup.getConfig()
|
||||||
|
let layout
|
||||||
|
|
||||||
|
afterAll(setup.afterAll)
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await config.init()
|
||||||
|
layout = await config.createLayout()
|
||||||
|
})
|
||||||
|
|
||||||
|
describe("save", () => {
|
||||||
|
it("should be able to create a layout", async () => {
|
||||||
|
const res = await request
|
||||||
|
.post(`/api/layouts`)
|
||||||
|
.send(basicLayout())
|
||||||
|
.set(config.defaultHeaders())
|
||||||
|
.expect("Content-Type", /json/)
|
||||||
|
.expect(200)
|
||||||
|
expect(res.body._rev).toBeDefined()
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should apply authorization to endpoint", async () => {
|
||||||
|
await checkBuilderEndpoint({
|
||||||
|
config,
|
||||||
|
method: "POST",
|
||||||
|
url: `/api/layouts`,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
describe("destroy", () => {
|
||||||
|
it("should be able to delete the layout", async () => {
|
||||||
|
const res = await request
|
||||||
|
.delete(`/api/layouts/${layout._id}/${layout._rev}`)
|
||||||
|
.set(config.defaultHeaders())
|
||||||
|
.expect("Content-Type", /json/)
|
||||||
|
.expect(200)
|
||||||
|
expect(res.body.message).toBeDefined()
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should apply authorization to endpoint", async () => {
|
||||||
|
await checkBuilderEndpoint({
|
||||||
|
config,
|
||||||
|
method: "DELETE",
|
||||||
|
url: `/api/layouts/${layout._id}/${layout._rev}`,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
|
@ -1,20 +1,32 @@
|
||||||
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
// mock out postgres for this
|
||||||
const { basicQuery } = require("./utilities/structures")
|
jest.mock("pg")
|
||||||
const setup = require("./utilities")
|
|
||||||
|
|
||||||
|
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
|
||||||
|
const { basicQuery, basicDatasource } = require("./utilities/structures")
|
||||||
|
const setup = require("./utilities")
|
||||||
|
|
||||||
describe("/queries", () => {
|
describe("/queries", () => {
|
||||||
let request = setup.getRequest()
|
let request = setup.getRequest()
|
||||||
let config = setup.getConfig()
|
let config = setup.getConfig()
|
||||||
let datasource
|
let datasource, query
|
||||||
|
|
||||||
afterAll(setup.afterAll)
|
afterAll(setup.afterAll)
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await config.init()
|
await config.init()
|
||||||
datasource = await config.createDatasource()
|
datasource = await config.createDatasource()
|
||||||
|
query = await config.createQuery()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
async function createInvalidIntegration() {
|
||||||
|
const datasource = await config.createDatasource({
|
||||||
|
...basicDatasource(),
|
||||||
|
source: "INVALID_INTEGRATION",
|
||||||
|
})
|
||||||
|
const query = await config.createQuery()
|
||||||
|
return { datasource, query }
|
||||||
|
}
|
||||||
|
|
||||||
describe("create", () => {
|
describe("create", () => {
|
||||||
it("should create a new query", async () => {
|
it("should create a new query", async () => {
|
||||||
const { _id } = await config.createDatasource()
|
const { _id } = await config.createDatasource()
|
||||||
|
@ -39,7 +51,6 @@ describe("/queries", () => {
|
||||||
|
|
||||||
describe("fetch", () => {
|
describe("fetch", () => {
|
||||||
it("returns all the queries from the server", async () => {
|
it("returns all the queries from the server", async () => {
|
||||||
const query = await config.createQuery()
|
|
||||||
const res = await request
|
const res = await request
|
||||||
.get(`/api/queries`)
|
.get(`/api/queries`)
|
||||||
.set(config.defaultHeaders())
|
.set(config.defaultHeaders())
|
||||||
|
@ -94,8 +105,6 @@ describe("/queries", () => {
|
||||||
|
|
||||||
describe("destroy", () => {
|
describe("destroy", () => {
|
||||||
it("deletes a query and returns a success message", async () => {
|
it("deletes a query and returns a success message", async () => {
|
||||||
const query = await config.createQuery()
|
|
||||||
|
|
||||||
await request
|
await request
|
||||||
.delete(`/api/queries/${query._id}/${query._rev}`)
|
.delete(`/api/queries/${query._id}/${query._rev}`)
|
||||||
.set(config.defaultHeaders())
|
.set(config.defaultHeaders())
|
||||||
|
@ -114,16 +123,74 @@ describe("/queries", () => {
|
||||||
await checkBuilderEndpoint({
|
await checkBuilderEndpoint({
|
||||||
config,
|
config,
|
||||||
method: "DELETE",
|
method: "DELETE",
|
||||||
url: `/api/datasources/${datasource._id}/${datasource._rev}`,
|
url: `/api/queries/${config._id}/${config._rev}`,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("preview", () => {
|
describe("preview", () => {
|
||||||
// TODO: need to mock out an integration with a test one and try this
|
it("should be able to preview the query", async () => {
|
||||||
|
const res = await request
|
||||||
|
.post(`/api/queries/preview`)
|
||||||
|
.send({
|
||||||
|
datasourceId: datasource._id,
|
||||||
|
parameters: {},
|
||||||
|
fields: {},
|
||||||
|
queryVerb: "read",
|
||||||
|
})
|
||||||
|
.set(config.defaultHeaders())
|
||||||
|
.expect("Content-Type", /json/)
|
||||||
|
.expect(200)
|
||||||
|
// these responses come from the mock
|
||||||
|
expect(res.body.schemaFields).toEqual(["a", "b"])
|
||||||
|
expect(res.body.rows.length).toEqual(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should apply authorization to endpoint", async () => {
|
||||||
|
await checkBuilderEndpoint({
|
||||||
|
config,
|
||||||
|
method: "POST",
|
||||||
|
url: `/api/queries/preview`,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should fail with invalid integration type", async () => {
|
||||||
|
const { datasource } = await createInvalidIntegration()
|
||||||
|
await request
|
||||||
|
.post(`/api/queries/preview`)
|
||||||
|
.send({
|
||||||
|
datasourceId: datasource._id,
|
||||||
|
parameters: {},
|
||||||
|
fields: {},
|
||||||
|
queryVerb: "read",
|
||||||
|
})
|
||||||
|
.set(config.defaultHeaders())
|
||||||
|
.expect(400)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("execute", () => {
|
describe("execute", () => {
|
||||||
// TODO: need to mock out an integration with a test one and try this
|
it("should be able to execute the query", async () => {
|
||||||
|
const res = await request
|
||||||
|
.post(`/api/queries/${query._id}`)
|
||||||
|
.send({
|
||||||
|
parameters: {},
|
||||||
|
})
|
||||||
|
.set(config.defaultHeaders())
|
||||||
|
.expect("Content-Type", /json/)
|
||||||
|
.expect(200)
|
||||||
|
expect(res.body.length).toEqual(1)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should fail with invalid integration type", async () => {
|
||||||
|
const { query } = await createInvalidIntegration()
|
||||||
|
await request
|
||||||
|
.post(`/api/queries/${query._id}`)
|
||||||
|
.send({
|
||||||
|
parameters: {},
|
||||||
|
})
|
||||||
|
.set(config.defaultHeaders())
|
||||||
|
.expect(400)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -9,6 +9,7 @@ const {
|
||||||
basicDatasource,
|
basicDatasource,
|
||||||
basicQuery,
|
basicQuery,
|
||||||
basicScreen,
|
basicScreen,
|
||||||
|
basicLayout,
|
||||||
basicWebhook,
|
basicWebhook,
|
||||||
} = require("./structures")
|
} = require("./structures")
|
||||||
const controllers = require("./controllers")
|
const controllers = require("./controllers")
|
||||||
|
@ -232,6 +233,11 @@ class TestConfiguration {
|
||||||
return (await this._req(config, null, controllers.webhook.save)).webhook
|
return (await this._req(config, null, controllers.webhook.save)).webhook
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async createLayout(config = null) {
|
||||||
|
config = config || basicLayout()
|
||||||
|
return await this._req(config, null, controllers.layout.save)
|
||||||
|
}
|
||||||
|
|
||||||
async createUser(
|
async createUser(
|
||||||
email = EMAIL,
|
email = EMAIL,
|
||||||
password = PASSWORD,
|
password = PASSWORD,
|
||||||
|
|
|
@ -11,4 +11,5 @@ module.exports = {
|
||||||
query: require("../../../controllers/query"),
|
query: require("../../../controllers/query"),
|
||||||
screen: require("../../../controllers/screen"),
|
screen: require("../../../controllers/screen"),
|
||||||
webhook: require("../../../controllers/webhook"),
|
webhook: require("../../../controllers/webhook"),
|
||||||
|
layout: require("../../../controllers/layout"),
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,8 @@ const {
|
||||||
BUILTIN_PERMISSION_IDS,
|
BUILTIN_PERMISSION_IDS,
|
||||||
} = require("../../../../utilities/security/permissions")
|
} = require("../../../../utilities/security/permissions")
|
||||||
const { createHomeScreen } = require("../../../../constants/screens")
|
const { createHomeScreen } = require("../../../../constants/screens")
|
||||||
|
const { EMPTY_LAYOUT } = require("../../../../constants/layouts")
|
||||||
|
const { cloneDeep } = require("lodash/fp")
|
||||||
|
|
||||||
exports.basicTable = () => {
|
exports.basicTable = () => {
|
||||||
return {
|
return {
|
||||||
|
@ -91,6 +93,10 @@ exports.basicScreen = () => {
|
||||||
return createHomeScreen()
|
return createHomeScreen()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
exports.basicLayout = () => {
|
||||||
|
return cloneDeep(EMPTY_LAYOUT)
|
||||||
|
}
|
||||||
|
|
||||||
exports.basicWebhook = automationId => {
|
exports.basicWebhook = automationId => {
|
||||||
return {
|
return {
|
||||||
live: true,
|
live: true,
|
||||||
|
|
Loading…
Reference in New Issue