Files

90 lines
3.4 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 { createI18n } from "@conusai-kit/i18n"
import { TransportProvider } from "@conusai-kit/ui"
import { renderToStaticMarkup } from "react-dom/server"
import { describe, expect, it } 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 inProvider = (node: React.ReactNode) =>
renderToStaticMarkup(
<TransportProvider call={async () => undefined} describe={() => "x"}>
{node}
</TransportProvider>,
)
describe("the search form", () => {
const html = inProvider(<SearchForm slugs={slugs} collectionName="contracts" labels={searchFormLabels(t, failed)} />)
it("names its controls and carries the AI disclosure", () => {
expect(html).toContain(`<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"),
backendVectors: t("settings.backendVectors"),
source: t("settings.source"),
sourceOperator: t("settings.sourceOperator"),
sourceManaged: t("settings.sourceManaged"),
endpoint: t("settings.endpoint"),
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, source: null, url: null }}
labels={labels}
/>,
)
expect(html).toContain(t("settings.stateOff"))
expect(html).toContain(`>${t("settings.enable")}<`)
})
it("renders the endpoint and the disable action when enabled, without any secret in the markup", () => {
const html = inProvider(
<SettingsSection
org="acme"
initial={{ enabled: true, backend: "vectors", source: "operator", url: "http://qdrant:6333" }}
labels={labels}
/>,
)
expect(html).toContain("http://qdrant:6333")
expect(html).toContain(`>${t("settings.disable")}<`)
expect(html).not.toContain("apiKey")
})
})