149 lines
4.3 KiB
TypeScript
149 lines
4.3 KiB
TypeScript
import "../../../tests"
|
|
import * as context from ".."
|
|
import { DEFAULT_TENANT_ID } from "../../constants"
|
|
import env from "../../environment"
|
|
|
|
// must use require to spy index file exports due to known issue in jest
|
|
const dbUtils = require("../../db")
|
|
jest.spyOn(dbUtils, "closeDB")
|
|
jest.spyOn(dbUtils, "dangerousGetDB")
|
|
|
|
describe("context", () => {
|
|
beforeEach(() => {
|
|
jest.clearAllMocks()
|
|
})
|
|
|
|
describe("doInTenant", () => {
|
|
describe("single-tenancy", () => {
|
|
it("defaults to the default tenant", () => {
|
|
const tenantId = context.getTenantId()
|
|
expect(tenantId).toBe(DEFAULT_TENANT_ID)
|
|
})
|
|
|
|
it("defaults to the default tenant db", async () => {
|
|
await context.doInTenant(DEFAULT_TENANT_ID, () => {
|
|
const db = context.getGlobalDB()
|
|
expect(db.name).toBe("global-db")
|
|
})
|
|
expect(dbUtils.dangerousGetDB).toHaveBeenCalledTimes(1)
|
|
expect(dbUtils.closeDB).toHaveBeenCalledTimes(1)
|
|
})
|
|
})
|
|
|
|
describe("multi-tenancy", () => {
|
|
beforeEach(() => {
|
|
env._set("MULTI_TENANCY", 1)
|
|
})
|
|
|
|
it("fails when no tenant id is set", () => {
|
|
const test = () => {
|
|
let error
|
|
try {
|
|
context.getTenantId()
|
|
} catch (e: any) {
|
|
error = e
|
|
}
|
|
expect(error.message).toBe("Tenant id not found")
|
|
}
|
|
|
|
// test under no tenancy
|
|
test()
|
|
|
|
// test after tenancy has been accessed to ensure cleanup
|
|
context.doInTenant("test", () => {})
|
|
test()
|
|
})
|
|
|
|
it("fails when no tenant db is set", () => {
|
|
const test = () => {
|
|
let error
|
|
try {
|
|
context.getGlobalDB()
|
|
} catch (e: any) {
|
|
error = e
|
|
}
|
|
expect(error.message).toBe("Global DB not found")
|
|
}
|
|
|
|
// test under no tenancy
|
|
test()
|
|
|
|
// test after tenancy has been accessed to ensure cleanup
|
|
context.doInTenant("test", () => {})
|
|
test()
|
|
})
|
|
|
|
it("sets tenant id", () => {
|
|
context.doInTenant("test", () => {
|
|
const tenantId = context.getTenantId()
|
|
expect(tenantId).toBe("test")
|
|
})
|
|
})
|
|
|
|
it("initialises the tenant db", async () => {
|
|
await context.doInTenant("test", () => {
|
|
const db = context.getGlobalDB()
|
|
expect(db.name).toBe("test_global-db")
|
|
})
|
|
expect(dbUtils.dangerousGetDB).toHaveBeenCalledTimes(1)
|
|
expect(dbUtils.closeDB).toHaveBeenCalledTimes(1)
|
|
})
|
|
|
|
it("sets the tenant id when nested with same tenant id", async () => {
|
|
await context.doInTenant("test", async () => {
|
|
const tenantId = context.getTenantId()
|
|
expect(tenantId).toBe("test")
|
|
|
|
await context.doInTenant("test", async () => {
|
|
const tenantId = context.getTenantId()
|
|
expect(tenantId).toBe("test")
|
|
|
|
await context.doInTenant("test", () => {
|
|
const tenantId = context.getTenantId()
|
|
expect(tenantId).toBe("test")
|
|
})
|
|
})
|
|
})
|
|
})
|
|
|
|
it("initialises the tenant db when nested with same tenant id", async () => {
|
|
await context.doInTenant("test", async () => {
|
|
const db = context.getGlobalDB()
|
|
expect(db.name).toBe("test_global-db")
|
|
|
|
await context.doInTenant("test", async () => {
|
|
const db = context.getGlobalDB()
|
|
expect(db.name).toBe("test_global-db")
|
|
|
|
await context.doInTenant("test", () => {
|
|
const db = context.getGlobalDB()
|
|
expect(db.name).toBe("test_global-db")
|
|
})
|
|
})
|
|
})
|
|
|
|
// only 1 db is opened and closed
|
|
expect(dbUtils.dangerousGetDB).toHaveBeenCalledTimes(1)
|
|
expect(dbUtils.closeDB).toHaveBeenCalledTimes(1)
|
|
})
|
|
|
|
it("sets different tenant id inside another context", () => {
|
|
context.doInTenant("test", () => {
|
|
const tenantId = context.getTenantId()
|
|
expect(tenantId).toBe("test")
|
|
|
|
context.doInTenant("nested", () => {
|
|
const tenantId = context.getTenantId()
|
|
expect(tenantId).toBe("nested")
|
|
|
|
context.doInTenant("double-nested", () => {
|
|
const tenantId = context.getTenantId()
|
|
expect(tenantId).toBe("double-nested")
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|
|
})
|