87 lines
3.6 KiB
TypeScript
87 lines
3.6 KiB
TypeScript
// The components' markup, rendered on the server the way a page renders it: what a screen reader
|
|
// and a keyboard user get is in the HTML — a name for every control, a status that says what a
|
|
// colour would, and the AI disclosure where AI output appears.
|
|
|
|
import { buildRegistry } from "@conusai-kit/core"
|
|
import { builtInCatalogues, createI18n, uiLabels } from "@conusai-kit/i18n"
|
|
import { createDataClient, DataProvider } from "@conusai-kit/ui/data"
|
|
import { UiLabelsProvider } from "@conusai-kit/ui/primitives"
|
|
import { renderToStaticMarkup } from "react-dom/server"
|
|
import { describe, expect, it, vi } from "vitest"
|
|
import { appModules } from "../../index.js"
|
|
import { searchFormLabels } from "../ui/labels.js"
|
|
import { SearchForm } from "../ui/search-form.js"
|
|
import { SettingsSection } from "../ui/settings-section.js"
|
|
|
|
const catalogues = buildRegistry([...appModules]).catalogues
|
|
const i18n = createI18n("en", { en: { knowledge: catalogues.en?.knowledge ?? {} } })
|
|
const t = (key: string, values?: Record<string, string | number>) => i18n.message(`knowledge.${key}`, values)
|
|
const failed = "That did not work: {detail}"
|
|
const slugs = { org: "acme", workspace: "ws", project: "p" }
|
|
|
|
const kitStrings = uiLabels(createI18n("en", builtInCatalogues))
|
|
|
|
const inProvider = (node: React.ReactNode) =>
|
|
renderToStaticMarkup(
|
|
<UiLabelsProvider labels={kitStrings}>
|
|
<DataProvider client={createDataClient({ fetch: async () => new Response(null, { status: 501 }) })}>
|
|
{node}
|
|
</DataProvider>
|
|
</UiLabelsProvider>,
|
|
)
|
|
|
|
describe("the search form", () => {
|
|
const html = inProvider(
|
|
<SearchForm slugs={slugs} collectionName="contracts" labels={searchFormLabels(t)} locale="en" />,
|
|
)
|
|
|
|
it("names its controls and carries the AI disclosure", () => {
|
|
expect(html).toMatch(/<label[^>]*for=/)
|
|
expect(html).toContain('type="search"')
|
|
expect(html).toContain("kit-ai-disclosure")
|
|
expect(html).toContain(t("search.disclosure"))
|
|
})
|
|
})
|
|
|
|
describe("the settings section", () => {
|
|
const labels = {
|
|
heading: t("settings.heading"),
|
|
state: t("settings.state"),
|
|
stateOn: t("settings.stateOn"),
|
|
stateOff: t("settings.stateOff"),
|
|
backend: t("settings.backend"),
|
|
backendPlatform: t("settings.backendPlatform"),
|
|
enable: t("settings.enable"),
|
|
enabling: t("settings.enabling"),
|
|
disable: t("settings.disable"),
|
|
disabling: t("settings.disabling"),
|
|
enabledDone: t("settings.enabledDone"),
|
|
disabledDone: t("settings.disabledDone"),
|
|
planRequired: t("settings.planRequired"),
|
|
featureDisabled: t("settings.featureDisabled"),
|
|
quotaExhausted: t("settings.quotaExhausted"),
|
|
upgrade: t("settings.upgrade"),
|
|
hint: t("settings.hint"),
|
|
failed,
|
|
}
|
|
|
|
it("renders the state and the enable action when disabled", () => {
|
|
const html = inProvider(<SettingsSection org="acme" initial={{ enabled: false, backend: null }} labels={labels} />)
|
|
expect(html).toContain(t("settings.stateOff"))
|
|
expect(html).toContain(`>${t("settings.enable")}<`)
|
|
})
|
|
|
|
it("says the platform serves the organization, with the disable action, when enabled", () => {
|
|
const html = inProvider(
|
|
<SettingsSection org="acme" initial={{ enabled: true, backend: "platform" }} labels={labels} />,
|
|
)
|
|
expect(html).toContain(t("settings.backendPlatform").replaceAll("'", "'"))
|
|
expect(html).toContain(`>${t("settings.disable")}<`)
|
|
})
|
|
})
|
|
|
|
// Explicit synthetic admission: module-local fixtures exercise the selected module.
|
|
vi.mock("../../inclusion.json", () => ({
|
|
default: { schemaVersion: 1, selected: ["knowledge"], everAdopted: ["knowledge"] },
|
|
}))
|