66 lines
2.7 KiB
TypeScript
66 lines
2.7 KiB
TypeScript
// SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0
|
|
// A role has one name. The invitation page says the role a link joins with by the name Settings > Members gives the
|
|
// same role (kit-tenancy's roleName over the built-in roles: a member is an editor), in English and in Lithuanian, from
|
|
// the app's own catalogues.
|
|
|
|
import { createI18n } from "@conusai-kit/i18n"
|
|
import { roleName } from "@conusai-kit/tenancy/ui"
|
|
import { describe, expect, it, vi } from "vitest"
|
|
|
|
const mocks = vi.hoisted(() => ({ pageContext: vi.fn(), call: vi.fn() }))
|
|
|
|
vi.mock("@tanstack/react-start/server", () => ({
|
|
getRequest: () => new Request("http://app.test/"),
|
|
setResponseStatus: vi.fn(),
|
|
setResponseHeader: vi.fn(),
|
|
}))
|
|
vi.mock("../apps/web/src/server/page", () => ({ pageContext: mocks.pageContext }))
|
|
vi.mock("@conusai-kit/auth", async (importOriginal) => ({
|
|
...(await importOriginal<Record<string, unknown>>()),
|
|
loadAuthConfig: () => ({ provider: "oidc", devLogin: true }),
|
|
}))
|
|
vi.mock("../apps/web/src/server/better-auth", () => ({
|
|
MIN_PASSWORD_LENGTH: 12,
|
|
betterAuthFormLabels: () => ({ submit: "Go" }),
|
|
}))
|
|
vi.mock("@app/modules/account/ui", () => ({
|
|
analyticsLabels: () => ({}),
|
|
deletionLabels: () => ({}),
|
|
exportLabels: () => ({}),
|
|
pageLabels: () => ({ title: "Account" }),
|
|
}))
|
|
vi.mock("@conusai-kit/tenancy", async (importOriginal) => ({
|
|
...(await importOriginal<Record<string, unknown>>()),
|
|
invitationRead: "invitation.read",
|
|
}))
|
|
|
|
const { appCatalogues } = await import("../apps/web/src/ui/messages")
|
|
const { invitationData } = await import("../apps/web/src/server/account-pages")
|
|
|
|
describe("the invitation page", () => {
|
|
it.each(["en", "lt"] as const)("names the role as the members table does, in %s", async (locale) => {
|
|
const i18n = createI18n(locale, appCatalogues)
|
|
mocks.pageContext.mockResolvedValue({ i18n, caller: { call: mocks.call }, path: "/here", signedIn: false })
|
|
for (const [role, roleKey] of [
|
|
["viewer", "viewer"],
|
|
["member", "editor"],
|
|
["admin", "admin"],
|
|
["owner", "owner"],
|
|
] as const) {
|
|
mocks.call.mockResolvedValue({
|
|
invitationId: "inv-1",
|
|
state: "open",
|
|
email: "guest@example.test",
|
|
organization: { slug: "acme", name: "Acme" },
|
|
role,
|
|
roleKey,
|
|
expiresAt: "2026-11-10T09:00:00.000Z",
|
|
})
|
|
const inTable = roleName(i18n, { key: roleKey, name: roleKey, builtIn: true })
|
|
expect(inTable, `${locale} ${roleKey} has a translated name`).not.toBe(roleKey)
|
|
const { lead } = await invitationData({ org: "acme", token: "token" })
|
|
expect(lead).toBe(i18n.message("invite.lead", { email: "guest@example.test", org: "Acme", role: inTable }))
|
|
}
|
|
})
|
|
})
|