Ctrl K
ComunidadGuías…

tests/integration/golden-path.test.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { expect, test } from "bun:test";
import { mkdtempSync, rmSync } from "node:fs";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { migrate } from "../../src/core/migrations";
import { serve } from "../../src/runtime/bun/server";
import { createSqliteDb, openDatabase } from "../../src/runtime/bun/sqlite";
import { provisionWith } from "../contract/harness";

test("the documented golden path runs against scoped principals", async () => {
  const directory = mkdtempSync(join(tmpdir(), "titen-golden-"));
  const dbPath = join(directory, "titen.db");
  const database = openDatabase(dbPath);
  const db = createSqliteDb(database);
  await migrate(db);
  const researcher = await provisionWith(db, {
    principalId: "researcher",
    scopes: ["projects:resolve", "projects:create", "observations:write", "claims:write"],
  });
  const writer = await provisionWith(db, {
    orgId: researcher.orgId,
    principalId: "writer",
    scopes: ["projects:resolve", "context:compile"],
  });
  const operator = await provisionWith(db, {
    orgId: researcher.orgId,
    principalId: "operator",
    scopes: ["checkpoints:write", "leases:write", "handoffs:write"],
  });
  const reviewer = await provisionWith(db, {
    orgId: researcher.orgId,
    principalId: "reviewer",
    scopes: ["handoffs:write", "feedback:write", "evidence:read", "views:compile"],
  });
  const workspaceId = "ws_golden_path";
  const at = new Date().toISOString();
  await db.batch([
    {
      sql: `INSERT INTO workspaces (id, org_id, name, created_at) VALUES (?, ?, ?, ?)`,
      params: [workspaceId, researcher.orgId, "Golden path", at],
    },
    ...[
      ["researcher", "member"],
      ["writer", "reader"],
      ["operator", "admin"],
      ["reviewer", "reader"],
    ].map(([principalId, role], index) => ({
      sql: `INSERT INTO memberships
              (id, org_id, workspace_id, principal_id, principal_kind, role, created_at)
            VALUES (?, ?, ?, ?, 'agent', ?, ?)`,
      params: [`mbr_golden_${index}`, researcher.orgId, workspaceId, principalId!, role!, at],
    })),
  ]);
  database.close();

  const api = await serve({ dbPath, port: 0, hostname: "127.0.0.1", quiet: true });
  try {
    const run = Bun.spawn({
      cmd: [process.execPath, "examples/small-team-golden-path.ts"],
      env: {
        ...process.env,
        TITEN_URL: api.url,
        TITEN_RESEARCHER_KEY: researcher.key,
        TITEN_WRITER_KEY: writer.key,
        TITEN_OPERATOR_KEY: operator.key,
        TITEN_REVIEWER_KEY: reviewer.key,
        TITEN_WORKSPACE_ID: workspaceId,
        TITEN_SUBJECT_ID: "golden-path-smoke",
      },
      stdout: "pipe",
      stderr: "pipe",
    });
    const [exitCode, stdout, stderr] = await Promise.all([
      run.exited,
      new Response(run.stdout).text(),
      new Response(run.stderr).text(),
    ]);
    expect(exitCode, stderr).toBe(0);
    const result = JSON.parse(stdout);
    expect(result.ok).toBe(true);
    expect(result.ids.observations).toHaveLength(2);
    expect(result.ids.claims).toHaveLength(2);
    expect(result.evidence).toHaveLength(2);
    expect(result.conflict_freshness.edges.some((edge: any) => edge.relation === "contradicts")).toBe(true);
    expect(result.conflict_freshness.metadata.subject_id).toBe("golden-path-smoke");
    expect(result.handoff_status).toBe("accepted");
    expect(result.feedback_outcome).toBe("useful");
  } finally {
    await api.stop();
    rmSync(directory, { recursive: true, force: true });
  }
}, 30_000);