forked from tsai/budibase
committed by
GitHub
63 changed files with 912 additions and 661 deletions
@ -0,0 +1,11 @@ |
|||||
|
const { tmpdir } = require("os") |
||||
|
|
||||
|
process.env.NODE_ENV = "jest" |
||||
|
process.env.JWT_SECRET = "test-jwtsecret" |
||||
|
process.env.CLIENT_ID = "test-client-id" |
||||
|
process.env.BUDIBASE_DIR = tmpdir("budibase-unittests") |
||||
|
process.env.ADMIN_SECRET = "test-admin-secret" |
||||
|
|
||||
|
// makes the output of the tests messy
|
||||
|
// but please temporarily enable for debugging :)
|
||||
|
process.env.LOGGER = "off" |
||||
@ -1,36 +1,18 @@ |
|||||
const CouchDB = require("../../db") |
const { create, destroy } = require("../../db/clientDb") |
||||
|
const env = require("../../environment") |
||||
|
|
||||
exports.getClientId = async function(ctx) { |
exports.getClientId = async function(ctx) { |
||||
ctx.body = process.env.CLIENT_ID |
ctx.body = env.CLIENT_ID |
||||
} |
} |
||||
|
|
||||
exports.create = async function(ctx) { |
exports.create = async function(ctx) { |
||||
const clientId = `client-${ctx.request.body.clientId}` |
await create(env.CLIENT_ID) |
||||
const db = new CouchDB(clientId) |
ctx.status = 200 |
||||
|
ctx.message = `Client Database ${env.CLIENT_ID} successfully provisioned.` |
||||
await db.put({ |
|
||||
_id: "_design/client", |
|
||||
views: { |
|
||||
by_type: { |
|
||||
map: function(doc) { |
|
||||
emit([doc.type], doc._id) |
|
||||
}.toString(), |
|
||||
}, |
|
||||
}, |
|
||||
}) |
|
||||
|
|
||||
ctx.body = { |
|
||||
message: `Client Database ${clientId} successfully provisioned.`, |
|
||||
} |
|
||||
} |
} |
||||
|
|
||||
exports.destroy = async function(ctx) { |
exports.destroy = async function(ctx) { |
||||
const dbId = `client-${ctx.params.clientId}` |
await destroy(env.CLIENT_ID) |
||||
|
ctx.status = 200 |
||||
await new CouchDB(dbId).destroy() |
ctx.message = `Client Database ${env.CLIENT_ID} successfully deleted.` |
||||
|
|
||||
ctx.body = { |
|
||||
status: 200, |
|
||||
message: `Client Database ${dbId} successfully deleted.`, |
|
||||
} |
|
||||
} |
} |
||||
|
|||||
@ -1,11 +1,15 @@ |
|||||
const Router = require("@koa/router") |
const Router = require("@koa/router") |
||||
const controller = require("../controllers/client") |
const controller = require("../controllers/client") |
||||
|
const env = require("../../environment") |
||||
|
|
||||
const router = Router() |
const router = Router() |
||||
|
|
||||
router |
router.get("/api/client/id", controller.getClientId) |
||||
.get("/api/client/id", controller.getClientId) |
|
||||
.post("/api/clients", controller.create) |
if (env.NODE_ENV === "jest") { |
||||
.delete("/api/clients/:clientId", controller.destroy) |
router |
||||
|
.post("/api/client", controller.create) |
||||
|
.delete("/api/client", controller.destroy) |
||||
|
} |
||||
|
|
||||
module.exports = router |
module.exports = router |
||||
|
|||||
@ -1,37 +1,58 @@ |
|||||
const supertest = require("supertest"); |
const { |
||||
const app = require("../../../app"); |
createClientDatabase, |
||||
const { createClientDatabase, destroyDatabase } = require("./couchTestUtils"); |
createApplication, |
||||
|
destroyClientDatabase, |
||||
|
supertest, |
||||
const CLIENT_DB_ID = "client-testing"; |
defaultHeaders |
||||
|
} = require("./couchTestUtils") |
||||
|
|
||||
describe("/applications", () => { |
describe("/applications", () => { |
||||
let request; |
let request |
||||
let server; |
let server |
||||
|
|
||||
beforeAll(async () => { |
beforeAll(async () => { |
||||
server = app; |
({ request, server } = await supertest()) |
||||
request = supertest(server); |
|
||||
await createClientDatabase(); |
|
||||
}); |
}); |
||||
|
|
||||
|
beforeEach(async () => { |
||||
|
await createClientDatabase(request) |
||||
|
}) |
||||
|
|
||||
|
afterEach(async () => { |
||||
|
await destroyClientDatabase(request) |
||||
|
}) |
||||
|
|
||||
afterAll(async () => { |
afterAll(async () => { |
||||
server.close(); |
server.close() |
||||
await destroyDatabase(CLIENT_DB_ID) |
|
||||
}) |
}) |
||||
|
|
||||
describe("create", () => { |
describe("create", () => { |
||||
it("returns a success message when the application is successfully created", done => { |
it("returns a success message when the application is successfully created", async () => { |
||||
request |
const res = await request |
||||
.post("/api/testing/applications") |
.post("/api/applications") |
||||
.send({ name: "My App" }) |
.send({ name: "My App" }) |
||||
.set("Accept", "application/json") |
.set(defaultHeaders) |
||||
|
.expect('Content-Type', /json/) |
||||
|
.expect(200) |
||||
|
expect(res.res.statusMessage).toEqual("Application My App created successfully") |
||||
|
expect(res.body._id).toBeDefined() |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
describe("fetch", () => { |
||||
|
it("lists all applications", async () => { |
||||
|
|
||||
|
await createApplication(request, "app1") |
||||
|
await createApplication(request, "app2") |
||||
|
|
||||
|
const res = await request |
||||
|
.get("/api/applications") |
||||
|
.set(defaultHeaders) |
||||
.expect('Content-Type', /json/) |
.expect('Content-Type', /json/) |
||||
.expect(200) |
.expect(200) |
||||
.end((err, res) => { |
|
||||
expect(res.body.message).toEqual("Application My App created successfully"); |
expect(res.body.length).toBe(2) |
||||
done(); |
}) |
||||
}); |
}) |
||||
}) |
|
||||
}); |
}) |
||||
}); |
|
||||
|
|||||
@ -1,58 +1,48 @@ |
|||||
const supertest = require("supertest"); |
const { |
||||
const app = require("../../../app"); |
createClientDatabase, |
||||
const { createClientDatabase, destroyClientDatabase } = require("./couchTestUtils") |
destroyClientDatabase, |
||||
|
supertest, |
||||
|
} = require("./couchTestUtils") |
||||
|
|
||||
|
const CLIENT_ID = "test-client-id" |
||||
const CLIENT_DB_ID = "client-testing"; |
|
||||
|
|
||||
describe("/clients", () => { |
describe("/clients", () => { |
||||
let request; |
let request; |
||||
let server; |
let server; |
||||
let db; |
|
||||
|
|
||||
beforeAll(async () => { |
beforeEach(async () => { |
||||
server = app |
({ request, server } = await supertest()) |
||||
request = supertest(server); |
|
||||
}); |
}); |
||||
|
|
||||
afterAll(async () => { |
afterEach(async () => { |
||||
server.close(); |
server.close(); |
||||
}) |
}) |
||||
|
|
||||
describe("create", () => { |
describe("create", () => { |
||||
afterEach(async () => { |
|
||||
await destroyClientDatabase(); |
|
||||
}); |
|
||||
|
|
||||
it("returns a success message when the client database is successfully created", done => { |
it("returns a success message when the client database is successfully created", async () => { |
||||
request |
const res = await request |
||||
.post("/api/clients") |
.post("/api/client") |
||||
.send({ clientId: "testing" }) |
.send({ clientId: "testing" }) |
||||
.set("Accept", "application/json") |
.set("Accept", "application/json") |
||||
.expect('Content-Type', /json/) |
|
||||
.expect(200) |
.expect(200) |
||||
.end((err, res) => { |
|
||||
expect(res.body.message).toEqual(`Client Database ${CLIENT_DB_ID} successfully provisioned.`); |
expect(res.res.statusMessage).toEqual(`Client Database ${process.env.CLIENT_ID} successfully provisioned.`); |
||||
done(); |
}) |
||||
}); |
}); |
||||
}) |
|
||||
}); |
|
||||
|
|
||||
describe("destroy", () => { |
describe("destroy", () => { |
||||
beforeEach(async () => { |
beforeEach(async () => { |
||||
db = await createClientDatabase(); |
db = await createClientDatabase(request); |
||||
}); |
}); |
||||
|
|
||||
it("returns a success message when the client database is successfully destroyed", async done => { |
it("returns a success message when the client database is successfully destroyed", async () => { |
||||
request |
const res = await request |
||||
.delete(`/api/clients/testing`) |
.delete(`/api/client`) |
||||
.set("Accept", "application/json") |
.set("Accept", "application/json") |
||||
.expect('Content-Type', /json/) |
|
||||
.expect(200) |
.expect(200) |
||||
.end((err, res) => { |
expect(res.res.statusMessage).toEqual(`Client Database ${process.env.CLIENT_ID} successfully deleted.`); |
||||
expect(res.body.message).toEqual(`Client Database ${CLIENT_DB_ID} successfully deleted.`); |
|
||||
done(); |
}) |
||||
}); |
}); |
||||
}) |
|
||||
}); |
|
||||
}); |
}); |
||||
|
|||||
@ -1,75 +1,62 @@ |
|||||
const supertest = require("supertest"); |
|
||||
const app = require("../../../app"); |
|
||||
const { |
const { |
||||
createInstanceDatabase |
createClientDatabase, |
||||
} = require("./couchTestUtils"); |
createApplication, |
||||
|
createInstance, |
||||
|
supertest, |
||||
const TEST_INSTANCE_ID = "testing-123"; |
defaultHeaders, |
||||
const TEST_USER = { |
createUser, |
||||
name: "Dave" |
} = require("./couchTestUtils") |
||||
} |
|
||||
|
|
||||
describe("/users", () => { |
describe("/users", () => { |
||||
let request; |
let request |
||||
let server; |
let server |
||||
|
let app |
||||
|
let instance |
||||
|
|
||||
beforeAll(async () => { |
beforeAll(async () => { |
||||
server = app |
({ request, server } = await supertest(server)) |
||||
request = supertest(server); |
await createClientDatabase(request) |
||||
|
app = await createApplication(request) |
||||
|
}); |
||||
|
|
||||
|
beforeEach(async () => { |
||||
|
instance = await createInstance(request, app._id) |
||||
}); |
}); |
||||
|
|
||||
afterAll(async () => { |
afterAll(async () => { |
||||
server.close(); |
server.close(); |
||||
}) |
}) |
||||
|
|
||||
describe("fetch", () => { |
describe("fetch", () => { |
||||
let db; |
|
||||
|
|
||||
beforeEach(async () => { |
it("returns a list of users from an instance db", async () => { |
||||
db = await createInstanceDatabase(TEST_INSTANCE_ID); |
await createUser(request, instance._id, "brenda", "brendas_password") |
||||
}); |
await createUser(request, instance._id, "pam", "pam_password") |
||||
|
const res = await request |
||||
afterEach(async () => { |
.get(`/api/${instance._id}/users`) |
||||
await db.destroy(); |
.set(defaultHeaders) |
||||
}); |
|
||||
|
|
||||
it("returns a list of users from an instance db", done => { |
|
||||
request |
|
||||
.get(`/api/${TEST_INSTANCE_ID}/users`) |
|
||||
.set("Accept", "application/json") |
|
||||
.expect('Content-Type', /json/) |
.expect('Content-Type', /json/) |
||||
.expect(200) |
.expect(200) |
||||
.end(async (err, res) => { |
|
||||
const user = res.body[0]; |
expect(res.body.length).toBe(2) |
||||
expect(user.name).toEqual(TEST_USER.name); |
expect(res.body.find(u => u.username === "brenda")).toBeDefined() |
||||
done(); |
expect(res.body.find(u => u.username === "pam")).toBeDefined() |
||||
}); |
}) |
||||
}) |
|
||||
}); |
|
||||
|
|
||||
describe("create", () => { |
|
||||
let db; |
|
||||
|
|
||||
beforeEach(async () => { |
}) |
||||
db = await createInstanceDatabase(TEST_INSTANCE_ID); |
|
||||
}); |
|
||||
|
|
||||
afterEach(async () => { |
describe("create", () => { |
||||
await db.destroy(); |
|
||||
}); |
|
||||
|
|
||||
it("returns a success message when a user is successfully created", done => { |
it("returns a success message when a user is successfully created", async () => { |
||||
request |
const res = await request |
||||
.post(`/api/${TEST_INSTANCE_ID}/users`) |
.post(`/api/${instance._id}/users`) |
||||
.send({ name: "Bill", username: "bill1", password: "password" }) |
.set(defaultHeaders) |
||||
.set("Accept", "application/json") |
.send({ name: "Bill", username: "bill", password: "bills_password" }) |
||||
.expect('Content-Type', /json/) |
|
||||
.expect(200) |
.expect(200) |
||||
.end(async (err, res) => { |
.expect('Content-Type', /json/) |
||||
expect(res.body.message).toEqual("User created successfully."); |
|
||||
done(); |
expect(res.res.statusMessage).toEqual("User created successfully."); |
||||
}); |
expect(res.body._id).toBeUndefined() |
||||
}) |
}) |
||||
}); |
}); |
||||
}); |
}) |
||||
|
|||||
@ -1,78 +1,73 @@ |
|||||
const supertest = require("supertest"); |
const { |
||||
const app = require("../../../app"); |
createClientDatabase, |
||||
const { createInstanceDatabase, createModel, destroyDatabase } = require("./couchTestUtils"); |
createApplication, |
||||
|
createInstance, |
||||
|
createModel, |
||||
const TEST_INSTANCE_ID = "testing-123"; |
supertest, |
||||
|
defaultHeaders |
||||
|
} = require("./couchTestUtils") |
||||
|
|
||||
describe("/views", () => { |
describe("/views", () => { |
||||
let request; |
let request |
||||
let server; |
let server |
||||
let db; |
let app |
||||
|
let instance |
||||
|
let model |
||||
|
|
||||
beforeAll(async () => { |
beforeAll(async () => { |
||||
server = app; |
({ request, server } = await supertest()) |
||||
request = supertest(server); |
await createClientDatabase(request) |
||||
}); |
app = await createApplication(request) |
||||
|
}) |
||||
|
|
||||
|
beforeEach(async () => { |
||||
|
instance = await createInstance(request, app._id) |
||||
|
}) |
||||
|
|
||||
afterAll(async () => { |
afterAll(async () => { |
||||
server.close(); |
server.close() |
||||
}) |
}) |
||||
|
|
||||
describe("create", () => { |
const createView = async () => |
||||
beforeEach(async () => { |
await request |
||||
db = await createInstanceDatabase(TEST_INSTANCE_ID); |
.post(`/api/${instance._id}/views`) |
||||
}); |
.send({ |
||||
|
name: "TestView", |
||||
|
map: `function(doc) {
|
||||
|
if (doc.id) { |
||||
|
emit(doc.name, doc._id); |
||||
|
} |
||||
|
}`,
|
||||
|
reduce: `function(keys, values) { }` |
||||
|
}) |
||||
|
.set(defaultHeaders) |
||||
|
.expect('Content-Type', /json/) |
||||
|
.expect(200) |
||||
|
|
||||
afterEach(async () => { |
describe("create", () => { |
||||
db && await db.destroy(); |
|
||||
}); |
|
||||
|
|
||||
it("returns a success message when the view is successfully created", done => { |
it("returns a success message when the view is successfully created", async () => { |
||||
request |
const res = await createView() |
||||
.post(`/api/${TEST_INSTANCE_ID}/views`) |
expect(res.res.statusMessage).toEqual("View TestView created successfully."); |
||||
.send({ |
expect(res.body.name).toEqual("TestView"); |
||||
name: "TestView", |
}) |
||||
map: `function(doc) {
|
}); |
||||
if (doc.id) { |
|
||||
emit(doc.name, doc._id); |
|
||||
} |
|
||||
}`,
|
|
||||
reduce: `function(keys, values) { }` |
|
||||
}) |
|
||||
.set("Accept", "application/json") |
|
||||
.expect('Content-Type', /json/) |
|
||||
.expect(200) |
|
||||
.end(async (err, res) => { |
|
||||
expect(res.body.message).toEqual("View TestView created successfully."); |
|
||||
expect(res.body.id).toEqual("_design/database"); |
|
||||
done(); |
|
||||
}); |
|
||||
}) |
|
||||
}); |
|
||||
|
|
||||
describe("fetch", () => { |
describe("fetch", () => { |
||||
let db; |
|
||||
|
|
||||
beforeEach(async () => { |
beforeEach(async () => { |
||||
db = await createInstanceDatabase(TEST_INSTANCE_ID); |
model = await createModel(request, instance._id); |
||||
await createModel(TEST_INSTANCE_ID); |
|
||||
}); |
}); |
||||
|
|
||||
afterEach(async () => { |
it("should only return custom views", async () => { |
||||
await db.destroy(); |
const view = await createView() |
||||
}); |
const res = await request |
||||
|
.get(`/api/${instance._id}/views`) |
||||
it("returns a list of all the views that exist in the instance database", done => { |
.set(defaultHeaders) |
||||
request |
|
||||
.get(`/api/${TEST_INSTANCE_ID}/views`) |
|
||||
.set("Accept", "application/json") |
|
||||
.expect('Content-Type', /json/) |
.expect('Content-Type', /json/) |
||||
.expect(200) |
.expect(200) |
||||
.end(async (_, res) => { |
expect(res.body.length).toBe(1) |
||||
expect(res.body.by_type).toBeDefined(); |
expect(res.body.find(v => v.name === view.body.name)).toBeDefined() |
||||
done(); |
}) |
||||
}); |
}); |
||||
}) |
|
||||
}); |
|
||||
}); |
}); |
||||
|
|||||
@ -0,0 +1,26 @@ |
|||||
|
const CouchDB = require("./client") |
||||
|
|
||||
|
exports.create = async clientId => { |
||||
|
const dbId = exports.name(clientId) |
||||
|
const db = new CouchDB(dbId) |
||||
|
await db.put({ |
||||
|
_id: "_design/client", |
||||
|
views: { |
||||
|
by_type: { |
||||
|
map: `function(doc) {
|
||||
|
emit([doc.type], doc._id) |
||||
|
}`,
|
||||
|
}, |
||||
|
}, |
||||
|
}) |
||||
|
return db |
||||
|
} |
||||
|
|
||||
|
exports.destroy = async function(clientId) { |
||||
|
const dbId = exports.name(clientId) |
||||
|
await new CouchDB(dbId).destroy() |
||||
|
} |
||||
|
|
||||
|
exports.name = function(clientId) { |
||||
|
return `client_${clientId}` |
||||
|
} |
||||
@ -1,13 +0,0 @@ |
|||||
module.exports = async db => { |
|
||||
const doc = await db.put({ |
|
||||
_id: "_design/client", |
|
||||
views: { |
|
||||
by_type: { |
|
||||
map: `function(doc) {
|
|
||||
emit([doc.type], doc._id) |
|
||||
}`,
|
|
||||
}, |
|
||||
}, |
|
||||
}) |
|
||||
console.log(doc) |
|
||||
} |
|
||||
@ -0,0 +1,11 @@ |
|||||
|
module.exports = { |
||||
|
CLIENT_ID: process.env.CLIENT_ID, |
||||
|
NODE_ENV: process.env.NODE_ENV, |
||||
|
JWT_SECRET: process.env.JWT_SECRET, |
||||
|
BUDIBASE_DIR: process.env.BUDIBASE_DIR, |
||||
|
ADMIN_SECRET: process.env.ADMIN_SECRET, |
||||
|
PORT: process.env.PORT, |
||||
|
COUCH_DB_URL: process.env.COUCH_DB_URL, |
||||
|
SALT_ROUNDS: process.env.SALT_ROUNDS, |
||||
|
LOGGER: process.env.LOGGER, |
||||
|
} |
||||
Loading…
Reference in new issue