mocked correctly

This commit is contained in:
Mateus Badan de Pieri 2023-04-05 14:14:55 +01:00
parent b6fd3b7cf7
commit 6bd950717c
1 changed files with 76 additions and 77 deletions

View File

@ -4,8 +4,11 @@ jest.mock("../../context", () => ({
isMultiTenant: jest.fn(() => true),
}))
import { TenantResolutionStrategy } from "@budibase/types"
import { addTenantToUrl, isUserInAppTenant, getTenantIDFromCtx } from "../"
import { isMultiTenant, getTenantIDFromAppID } from "../../context"
import { any } from "joi"
import { DEFAULT_TENANT_ID } from "../../../src/constants/misc"
const mockedIsMultiTenant = isMultiTenant as jest.MockedFunction<
typeof isMultiTenant
>
@ -26,8 +29,6 @@ describe("addTenantToUrl", () => {
})
it("should not append tenantId parameter to the URL if isMultiTenant is false", () => {
// mock the `isMultiTenant` function to return false
mockedIsMultiTenant.mockImplementation(() => false)
const url = "https://budibase.com"
@ -69,97 +70,95 @@ describe("isUserInAppTenant", () => {
})
})
const mockCtx = {
user: { tenantId: "123" },
request: {
headers: { "X-Tenant-ID": "456" },
query: { tenantId: "789" },
},
host: "tenant.budibase.app",
originalUrl: "/tenant/123",
matched: [
{
paramNames: [{ name: "tenantId" }],
params: (url: any, captures: any, ctx: any) => ({ tenantId: "456" }),
},
],
}
const mockOpts = {
allowNoTenant: false,
includeStrategies: ["USER", "HEADER", "QUERY", "SUBDOMAIN", "PATH"],
excludeStrategies: ["QUERY"],
}
let mockOpts: any = {}
// mock the `getTenantId` and `isMultiTenant` functions
jest.mock("../../context", () => ({
isMultiTenant: jest.fn(() => true),
}))
jest.mock("../../../src/constants/misc", () => ({
DEFAULT_TENANT_ID: "default",
}))
function createCtx(opts: {
originalUrl?: string
headers?: string[]
qsTenantId?: string
userTenantId?: string
}) {
const createdCtx: any = {
originalUrl: opts.originalUrl || "budibase.com",
matched: [{ name: "name" }],
throw: jest.fn(),
request: { headers: {} },
}
if (opts.headers) {
createdCtx.request.headers = opts.headers
}
if (opts.qsTenantId) {
createdCtx.request.query = { tenantId: opts.qsTenantId }
}
if (opts.userTenantId) {
createdCtx.user = { tenantId: opts.userTenantId }
}
return createdCtx as any
}
describe("getTenantIDFromCtx", () => {
describe("when isMultiTenant() returns true", () => {
beforeEach(() => {
jest.spyOn(global, "isMultiTenant").mockReturnValue(true)
describe("when tenant can be found", () => {
it("returns the tenant ID from the user object", () => {
const ctx = createCtx({ userTenantId: "budibase" })
expect(getTenantIDFromCtx(ctx, mockOpts)).toEqual("budibase")
})
afterEach(() => {
jest.restoreAllMocks()
it("returns the tenant ID from the header", () => {
const ctx = createCtx({ headers: ["TENANT_ID:budibase"] })
mockOpts = { includeStrategies: [TenantResolutionStrategy.HEADERS] }
expect(getTenantIDFromCtx(ctx, mockOpts)).toEqual("budibase")
})
describe("when tenant can be found", () => {
it("returns the tenant ID from the user object", () => {
expect(getTenantIDFromCtx(mockCtx, mockOpts)).toEqual("123")
})
it("returns the tenant ID from the header", () => {
mockCtx.user = null
expect(getTenantIDFromCtx(mockCtx, mockOpts)).toEqual("456")
})
it("returns the tenant ID from the query param", () => {
mockCtx.user = null
mockCtx.request.headers = {}
expect(getTenantIDFromCtx(mockCtx, mockOpts)).toEqual("789")
})
it("returns the tenant ID from the subdomain", () => {
mockCtx.user = null
mockCtx.request.headers = {}
mockCtx.request.query = {}
expect(getTenantIDFromCtx(mockCtx, mockOpts)).toEqual("tenant")
})
it("returns the tenant ID from the path", () => {
mockCtx.user = null
mockCtx.request.headers = {}
mockCtx.request.query = {}
mockCtx.host = "budibase.app"
expect(getTenantIDFromCtx(mockCtx, mockOpts)).toEqual("123")
})
it("returns the tenant ID from the query param", () => {
const ctx = createCtx({ qsTenantId: "budibase" })
expect(getTenantIDFromCtx(ctx, mockOpts)).toEqual("budibase")
})
describe("when tenant cannot be found", () => {
it("throws a 403 error if allowNoTenant is false", () => {
mockCtx.user = null
mockCtx.request.headers = {}
mockCtx.request.query = {}
mockCtx.host = "budibase.app"
mockOpts.allowNoTenant = false
expect(() => getTenantIDFromCtx(mockCtx, mockOpts)).toThrowError(
"Tenant id not set"
)
})
it("returns the tenant ID from the subdomain", () => {
const ctx = createCtx({ host: "bb" })
mockOpts = { includeStrategies: [TenantResolutionStrategy.SUBDOMAIN] }
expect(getTenantIDFromCtx(ctx, mockOpts)).toEqual("bb")
})
it("returns null if allowNoTenant is true", () => {
mockCtx.user = null
mockCtx.request.headers = {}
mockCtx.request.query = {}
mockCtx.host = "budibase.app"
mockOpts.allowNoTenant = true
expect(getTenantIDFromCtx(mockCtx, mockOpts)).toBeNull()
})
it("returns the tenant ID from the path", () => {
const ctx = createCtx({ host: "bb" })
mockOpts = { includeStrategies: [TenantResolutionStrategy.PATH] }
expect(getTenantIDFromCtx(ctx, mockOpts)).toEqual("123")
})
})
describe("when tenant cannot be found", () => {
it("throws a 403 error if allowNoTenant is false", () => {
mockCtx.user = null
mockCtx.request.headers = {}
mockCtx.request.query = {}
mockCtx.host = "budibase.app"
mockOpts.allowNoTenant = false
expect(() => getTenantIDFromCtx(mockCtx, mockOpts)).toThrowError(
"Tenant id not set"
)
})
it("returns null if allowNoTenant is true", () => {
mockedIsMultiTenant.mockImplementation(() => false)
const ctx = createCtx({})
mockOpts = { allowNoTenant: true }
console.log(mockOpts)
expect(getTenantIDFromCtx(ctx, mockOpts)).toBeNull()
})
})
it("returns the default tenant ID when isMultiTenant() returns false", () => {
mockedIsMultiTenant.mockImplementation(() => false)
expect(getTenantIDFromCtx(mockCtx, mockOpts)).toEqual("default")
const ctx = createCtx({})
expect(getTenantIDFromCtx(ctx, mockOpts)).toEqual("default")
})
})