Files
template-app/modules/knowledge/__tests__/account.test.ts
T
2026-11-14 09:56:45 +00:00

63 lines
2.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { Container, type TenantScope } from "@conusai-kit/core"
import { createMemoryDataSource, DATA_SOURCE, SYSTEM_DATA } from "@conusai-kit/data"
import { accountData, projects } from "@conusai-kit/tenancy"
import { expect, it } from "vitest"
import { custodyModule } from "../../custody.js"
import { knowledgeAccountData } from "../adapters/account.js"
import { autoIndex, KNOWLEDGE_ENTITIES } from "../contract/index.js"
import { knowledgeModule } from "../module.js"
const subject = "01900000-0000-7000-0000-000000000009"
async function fixture() {
const data = createMemoryDataSource({ entities: [projects, ...KNOWLEDGE_ENTITIES] })
const container = new Container()
container.value(DATA_SOURCE, data)
container.value(SYSTEM_DATA, data)
const scopes: TenantScope[] = []
for (const n of [1, 2, 3]) {
const orgId = `01900000-0000-7000-0000-00000000000${n}`
const workspaceId = `01900000-0000-7000-0000-00000000001${n}`
const actor = { userId: subject }
const project = await data
.forScope({ level: "workspace", orgId, workspaceId, actor })
.of(projects)
.insert({ slug: "site", name: "Site", moduleKey: "notes", archivedAt: null })
const scope: TenantScope = { level: "project", orgId, workspaceId, projectId: project.id, actor }
scopes.push(scope)
await data
.forScope(scope)
.of(autoIndex)
.insert({
collectionName: "contracts",
enabledBy: n === 3 ? "another-person" : subject,
enabledAt: "2026-11-11T00:00:00.000Z",
})
}
return { data, container, scopes }
}
it("exports and erases only that administrator’s opt-ins across projects, idempotently", async () => {
const { data, container, scopes } = await fixture()
const exported = await knowledgeAccountData.export?.({ subject, container })
expect(exported?.automaticIndexing).toHaveLength(2)
await knowledgeAccountData.erase?.({ subject, container })
expect(await knowledgeAccountData.export?.({ subject, container })).toEqual({ automaticIndexing: [] })
await knowledgeAccountData.erase?.({ subject, container })
const otherScope = scopes[2]
if (!otherScope) throw new Error("Missing unrelated project fixture")
expect((await data.forScope(otherScope).of(autoIndex).list()).items).toHaveLength(1)
})
it("retains the account contribution when processing is deselected", () => {
const retained = custodyModule(knowledgeModule)
expect(retained.extends?.find((entry) => entry.point.id === accountData.id)?.values).toEqual([knowledgeAccountData])
})
it("an aborted account operation changes no opt-in", async () => {
const { data, container, scopes } = await fixture()
const controller = new AbortController()
controller.abort()
await expect(knowledgeAccountData.erase?.({ subject, container, signal: controller.signal })).rejects.toThrow()
for (const scope of scopes) expect((await data.forScope(scope).of(autoIndex).list()).items).toHaveLength(1)
})