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) { |
|||
ctx.body = process.env.CLIENT_ID |
|||
ctx.body = env.CLIENT_ID |
|||
} |
|||
|
|||
exports.create = async function(ctx) { |
|||
const clientId = `client-${ctx.request.body.clientId}` |
|||
const db = new CouchDB(clientId) |
|||
|
|||
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.`, |
|||
} |
|||
await create(env.CLIENT_ID) |
|||
ctx.status = 200 |
|||
ctx.message = `Client Database ${env.CLIENT_ID} successfully provisioned.` |
|||
} |
|||
|
|||
exports.destroy = async function(ctx) { |
|||
const dbId = `client-${ctx.params.clientId}` |
|||
|
|||
await new CouchDB(dbId).destroy() |
|||
|
|||
ctx.body = { |
|||
status: 200, |
|||
message: `Client Database ${dbId} successfully deleted.`, |
|||
} |
|||
await destroy(env.CLIENT_ID) |
|||
ctx.status = 200 |
|||
ctx.message = `Client Database ${env.CLIENT_ID} successfully deleted.` |
|||
} |
|||
|
|||
@ -1,11 +1,15 @@ |
|||
const Router = require("@koa/router") |
|||
const controller = require("../controllers/client") |
|||
const env = require("../../environment") |
|||
|
|||
const router = Router() |
|||
|
|||
router |
|||
.get("/api/client/id", controller.getClientId) |
|||
.post("/api/clients", controller.create) |
|||
.delete("/api/clients/:clientId", controller.destroy) |
|||
router.get("/api/client/id", controller.getClientId) |
|||
|
|||
if (env.NODE_ENV === "jest") { |
|||
router |
|||
.post("/api/client", controller.create) |
|||
.delete("/api/client", controller.destroy) |
|||
} |
|||
|
|||
module.exports = router |
|||
|
|||
@ -1,37 +1,58 @@ |
|||
const supertest = require("supertest"); |
|||
const app = require("../../../app"); |
|||
const { createClientDatabase, destroyDatabase } = require("./couchTestUtils"); |
|||
|
|||
|
|||
const CLIENT_DB_ID = "client-testing"; |
|||
const { |
|||
createClientDatabase, |
|||
createApplication, |
|||
destroyClientDatabase, |
|||
supertest, |
|||
defaultHeaders |
|||
} = require("./couchTestUtils") |
|||
|
|||
describe("/applications", () => { |
|||
let request; |
|||
let server; |
|||
let request |
|||
let server |
|||
|
|||
beforeAll(async () => { |
|||
server = app; |
|||
request = supertest(server); |
|||
await createClientDatabase(); |
|||
({ request, server } = await supertest()) |
|||
}); |
|||
|
|||
beforeEach(async () => { |
|||
await createClientDatabase(request) |
|||
}) |
|||
|
|||
afterEach(async () => { |
|||
await destroyClientDatabase(request) |
|||
}) |
|||
|
|||
afterAll(async () => { |
|||
server.close(); |
|||
await destroyDatabase(CLIENT_DB_ID) |
|||
server.close() |
|||
}) |
|||
|
|||
describe("create", () => { |
|||
it("returns a success message when the application is successfully created", done => { |
|||
request |
|||
.post("/api/testing/applications") |
|||
it("returns a success message when the application is successfully created", async () => { |
|||
const res = await request |
|||
.post("/api/applications") |
|||
.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(200) |
|||
.end((err, res) => { |
|||
expect(res.body.message).toEqual("Application My App created successfully"); |
|||
done(); |
|||
}); |
|||
}) |
|||
}); |
|||
}); |
|||
|
|||
expect(res.body.length).toBe(2) |
|||
}) |
|||
}) |
|||
|
|||
}) |
|||
|
|||
@ -1,58 +1,48 @@ |
|||
const supertest = require("supertest"); |
|||
const app = require("../../../app"); |
|||
const { createClientDatabase, destroyClientDatabase } = require("./couchTestUtils") |
|||
const { |
|||
createClientDatabase, |
|||
destroyClientDatabase, |
|||
supertest, |
|||
} = require("./couchTestUtils") |
|||
|
|||
|
|||
const CLIENT_DB_ID = "client-testing"; |
|||
const CLIENT_ID = "test-client-id" |
|||
|
|||
describe("/clients", () => { |
|||
let request; |
|||
let server; |
|||
let db; |
|||
|
|||
beforeAll(async () => { |
|||
server = app |
|||
request = supertest(server); |
|||
beforeEach(async () => { |
|||
({ request, server } = await supertest()) |
|||
}); |
|||
|
|||
afterAll(async () => { |
|||
afterEach(async () => { |
|||
server.close(); |
|||
}) |
|||
|
|||
describe("create", () => { |
|||
afterEach(async () => { |
|||
await destroyClientDatabase(); |
|||
}); |
|||
|
|||
it("returns a success message when the client database is successfully created", done => { |
|||
request |
|||
.post("/api/clients") |
|||
it("returns a success message when the client database is successfully created", async () => { |
|||
const res = await request |
|||
.post("/api/client") |
|||
.send({ clientId: "testing" }) |
|||
.set("Accept", "application/json") |
|||
.expect('Content-Type', /json/) |
|||
.expect(200) |
|||
.end((err, res) => { |
|||
expect(res.body.message).toEqual(`Client Database ${CLIENT_DB_ID} successfully provisioned.`); |
|||
done(); |
|||
}); |
|||
}) |
|||
}); |
|||
|
|||
expect(res.res.statusMessage).toEqual(`Client Database ${process.env.CLIENT_ID} successfully provisioned.`); |
|||
}) |
|||
}); |
|||
|
|||
describe("destroy", () => { |
|||
beforeEach(async () => { |
|||
db = await createClientDatabase(); |
|||
db = await createClientDatabase(request); |
|||
}); |
|||
|
|||
it("returns a success message when the client database is successfully destroyed", async done => { |
|||
request |
|||
.delete(`/api/clients/testing`) |
|||
it("returns a success message when the client database is successfully destroyed", async () => { |
|||
const res = await request |
|||
.delete(`/api/client`) |
|||
.set("Accept", "application/json") |
|||
.expect('Content-Type', /json/) |
|||
.expect(200) |
|||
.end((err, res) => { |
|||
expect(res.body.message).toEqual(`Client Database ${CLIENT_DB_ID} successfully deleted.`); |
|||
done(); |
|||
}); |
|||
}) |
|||
}); |
|||
expect(res.res.statusMessage).toEqual(`Client Database ${process.env.CLIENT_ID} successfully deleted.`); |
|||
|
|||
}) |
|||
}); |
|||
}); |
|||
|
|||
@ -1,75 +1,62 @@ |
|||
const supertest = require("supertest"); |
|||
const app = require("../../../app"); |
|||
const { |
|||
createInstanceDatabase |
|||
} = require("./couchTestUtils"); |
|||
|
|||
|
|||
const TEST_INSTANCE_ID = "testing-123"; |
|||
const TEST_USER = { |
|||
name: "Dave" |
|||
} |
|||
createClientDatabase, |
|||
createApplication, |
|||
createInstance, |
|||
supertest, |
|||
defaultHeaders, |
|||
createUser, |
|||
} = require("./couchTestUtils") |
|||
|
|||
describe("/users", () => { |
|||
let request; |
|||
let server; |
|||
let request |
|||
let server |
|||
let app |
|||
let instance |
|||
|
|||
beforeAll(async () => { |
|||
server = app |
|||
request = supertest(server); |
|||
({ request, server } = await supertest(server)) |
|||
await createClientDatabase(request) |
|||
app = await createApplication(request) |
|||
}); |
|||
|
|||
beforeEach(async () => { |
|||
instance = await createInstance(request, app._id) |
|||
}); |
|||
|
|||
afterAll(async () => { |
|||
server.close(); |
|||
}) |
|||
|
|||
describe("fetch", () => { |
|||
let db; |
|||
describe("fetch", () => { |
|||
|
|||
beforeEach(async () => { |
|||
db = await createInstanceDatabase(TEST_INSTANCE_ID); |
|||
}); |
|||
|
|||
afterEach(async () => { |
|||
await db.destroy(); |
|||
}); |
|||
|
|||
it("returns a list of users from an instance db", done => { |
|||
request |
|||
.get(`/api/${TEST_INSTANCE_ID}/users`) |
|||
.set("Accept", "application/json") |
|||
it("returns a list of users from an instance db", async () => { |
|||
await createUser(request, instance._id, "brenda", "brendas_password") |
|||
await createUser(request, instance._id, "pam", "pam_password") |
|||
const res = await request |
|||
.get(`/api/${instance._id}/users`) |
|||
.set(defaultHeaders) |
|||
.expect('Content-Type', /json/) |
|||
.expect(200) |
|||
.end(async (err, res) => { |
|||
const user = res.body[0]; |
|||
expect(user.name).toEqual(TEST_USER.name); |
|||
done(); |
|||
}); |
|||
}) |
|||
}); |
|||
|
|||
describe("create", () => { |
|||
let db; |
|||
|
|||
expect(res.body.length).toBe(2) |
|||
expect(res.body.find(u => u.username === "brenda")).toBeDefined() |
|||
expect(res.body.find(u => u.username === "pam")).toBeDefined() |
|||
}) |
|||
|
|||
beforeEach(async () => { |
|||
db = await createInstanceDatabase(TEST_INSTANCE_ID); |
|||
}); |
|||
}) |
|||
|
|||
afterEach(async () => { |
|||
await db.destroy(); |
|||
}); |
|||
describe("create", () => { |
|||
|
|||
it("returns a success message when a user is successfully created", done => { |
|||
request |
|||
.post(`/api/${TEST_INSTANCE_ID}/users`) |
|||
.send({ name: "Bill", username: "bill1", password: "password" }) |
|||
.set("Accept", "application/json") |
|||
.expect('Content-Type', /json/) |
|||
it("returns a success message when a user is successfully created", async () => { |
|||
const res = await request |
|||
.post(`/api/${instance._id}/users`) |
|||
.set(defaultHeaders) |
|||
.send({ name: "Bill", username: "bill", password: "bills_password" }) |
|||
.expect(200) |
|||
.end(async (err, res) => { |
|||
expect(res.body.message).toEqual("User created successfully."); |
|||
done(); |
|||
}); |
|||
}) |
|||
}); |
|||
}); |
|||
.expect('Content-Type', /json/) |
|||
|
|||
expect(res.res.statusMessage).toEqual("User created successfully."); |
|||
expect(res.body._id).toBeUndefined() |
|||
}) |
|||
}); |
|||
}) |
|||
|
|||
@ -1,78 +1,73 @@ |
|||
const supertest = require("supertest"); |
|||
const app = require("../../../app"); |
|||
const { createInstanceDatabase, createModel, destroyDatabase } = require("./couchTestUtils"); |
|||
|
|||
|
|||
const TEST_INSTANCE_ID = "testing-123"; |
|||
const { |
|||
createClientDatabase, |
|||
createApplication, |
|||
createInstance, |
|||
createModel, |
|||
supertest, |
|||
defaultHeaders |
|||
} = require("./couchTestUtils") |
|||
|
|||
describe("/views", () => { |
|||
let request; |
|||
let server; |
|||
let db; |
|||
let request |
|||
let server |
|||
let app |
|||
let instance |
|||
let model |
|||
|
|||
beforeAll(async () => { |
|||
server = app; |
|||
request = supertest(server); |
|||
}); |
|||
({ request, server } = await supertest()) |
|||
await createClientDatabase(request) |
|||
app = await createApplication(request) |
|||
}) |
|||
|
|||
beforeEach(async () => { |
|||
instance = await createInstance(request, app._id) |
|||
}) |
|||
|
|||
afterAll(async () => { |
|||
server.close(); |
|||
server.close() |
|||
}) |
|||
|
|||
describe("create", () => { |
|||
beforeEach(async () => { |
|||
db = await createInstanceDatabase(TEST_INSTANCE_ID); |
|||
}); |
|||
const createView = async () => |
|||
await request |
|||
.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 () => { |
|||
db && await db.destroy(); |
|||
}); |
|||
describe("create", () => { |
|||
|
|||
it("returns a success message when the view is successfully created", done => { |
|||
request |
|||
.post(`/api/${TEST_INSTANCE_ID}/views`) |
|||
.send({ |
|||
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(); |
|||
}); |
|||
}) |
|||
}); |
|||
it("returns a success message when the view is successfully created", async () => { |
|||
const res = await createView() |
|||
expect(res.res.statusMessage).toEqual("View TestView created successfully."); |
|||
expect(res.body.name).toEqual("TestView"); |
|||
}) |
|||
}); |
|||
|
|||
describe("fetch", () => { |
|||
let db; |
|||
|
|||
beforeEach(async () => { |
|||
db = await createInstanceDatabase(TEST_INSTANCE_ID); |
|||
await createModel(TEST_INSTANCE_ID); |
|||
model = await createModel(request, instance._id); |
|||
}); |
|||
|
|||
afterEach(async () => { |
|||
await db.destroy(); |
|||
}); |
|||
|
|||
it("returns a list of all the views that exist in the instance database", done => { |
|||
request |
|||
.get(`/api/${TEST_INSTANCE_ID}/views`) |
|||
.set("Accept", "application/json") |
|||
it("should only return custom views", async () => { |
|||
const view = await createView() |
|||
const res = await request |
|||
.get(`/api/${instance._id}/views`) |
|||
.set(defaultHeaders) |
|||
.expect('Content-Type', /json/) |
|||
.expect(200) |
|||
.end(async (_, res) => { |
|||
expect(res.body.by_type).toBeDefined(); |
|||
done(); |
|||
}); |
|||
}) |
|||
}); |
|||
expect(res.body.length).toBe(1) |
|||
expect(res.body.find(v => v.name === view.body.name)).toBeDefined() |
|||
}) |
|||
}); |
|||
}); |
|||
|
|||
@ -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