// SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0 import { type AppEnv, loadAppEnv, profileRegistry, type ServerObservability } from "@app/config" import { appModules, moduleInclusion } from "@app/modules" import { buildRegistry } from "@conusai-kit/core" import { createMemoryDataSource, entitiesOf } from "@conusai-kit/data" import { users } from "@conusai-kit/tenancy" import { afterEach, describe, expect, it, vi } from "vitest" import { buildDialectWorkerRuntime, engineFor, migrateDialect } from "../../apps/worker/src/dialect/runtime.js" import { makeApp } from "../../modules/account/__tests__/harness.js" import type { AccountExport, DeletionView } from "../../modules/account/index.js" import { freshDialectModules } from "./fixture.js" afterEach(() => vi.restoreAllMocks()) describe.each(["mariadb", "mongodb"] as const)("%s module/profile composition", (profile) => { it("names unsupported adopted modules and preserves their custody registry", () => { const before = JSON.stringify(moduleInclusion) expect(() => profileRegistry(appModules, profile)).toThrow(/agent, assistant/) expect(JSON.stringify(moduleInclusion)).toBe(before) expect(buildRegistry([...appModules]).modules.map(({ id }) => id)).toContain("assistant") }) it("uses the same compatible fresh registry for data and account rights without changing starter history", async () => { const before = JSON.stringify(moduleInclusion) const modules = freshDialectModules(profile) const registry = profileRegistry(modules, profile) const data = createMemoryDataSource({ entities: entitiesOf(registry, profile) }) const app = makeApp({ data, modules }) expect(app.registry.modules.map(({ id }) => id)).toEqual(registry.modules.map(({ id }) => id)) const ada = await app.signUp("profile-ada@example.test") const grace = await app.signUp("profile-grace@example.test") await ada.call().callByName("tenancy.org.create", { slug: "profile-ada", name: "Ada fixture" }) await grace.call().callByName("tenancy.org.create", { slug: "profile-grace", name: "Grace fixture" }) const exported = (await ada.call().callByName("account.data.export", {})) as AccountExport expect(exported).toMatchObject({ subject: ada.actor.userId, complete: true, failed: [] }) expect(JSON.stringify(exported)).not.toContain(grace.email) const deleted = (await ada.call().callByName("account.deletion.request", { confirm: ada.email })) as DeletionView expect(deleted).toMatchObject({ state: "completed", pending: [], abandoned: [] }) expect(await data.global(users).get(ada.actor.userId)).toBeNull() expect((await data.global(users).get(grace.actor.userId))?.email).toBe(grace.email) expect(JSON.stringify(moduleInclusion)).toBe(before) }) it("refuses the actual worker and migrate paths before connecting or applying migrations", async () => { const databaseUrl = `${profile === "mariadb" ? "mysql" : "mongodb"}://127.0.0.1:1/fixture` const raw: Record = { NODE_ENV: "test", CONUSAI_API_URL: "https://fixture.example.test/api", CONUSAI_API_TOKEN: "synthetic-token", CONUSAI_PROJECT_ID: "profile-refusal", REDIS_URL: "redis://127.0.0.1:1", [profile === "mariadb" ? "MARIADB_URL" : "MONGODB_URL"]: `${profile === "mariadb" ? "mysql" : "mongodb"}://127.0.0.1:1/fixture`, } if (profile === "mariadb") raw.DATABASE_URL = databaseUrl const env: AppEnv = loadAppEnv("worker", raw, profile) const engine = engineFor(profile) const connect = vi .spyOn(engine, "connect") .mockRejectedValue(new Error("database access forbidden in refusal control")) const migrate = vi.spyOn(engine, "migrate").mockRejectedValue(new Error("migration forbidden in refusal control")) await expect(buildDialectWorkerRuntime(env, {} as ServerObservability)).rejects.toThrow(/agent, assistant/) expect(() => migrateDialect(env)).toThrow(/agent, assistant/) expect(connect).not.toHaveBeenCalled() expect(migrate).not.toHaveBeenCalled() }) })