112 lines
3.3 KiB
TypeScript
112 lines
3.3 KiB
TypeScript
import { convexTest } from "convex-test";
|
|
import { anyApi } from "convex/server";
|
|
import { describe, expect, test } from "vitest";
|
|
|
|
import schema from "./schema";
|
|
|
|
const modules = import.meta.glob("./**/*.ts");
|
|
const api = anyApi;
|
|
|
|
describe("real work execution persistence", () => {
|
|
test("records revisions, activity, diff, and terminal state atomically", async () => {
|
|
const t = convexTest({ modules, schema });
|
|
const seeded = await t.run(async (ctx) => {
|
|
const organizationId = await ctx.db.insert("organizations", {
|
|
createdAt: 1,
|
|
createdBy: "user",
|
|
kind: "personal",
|
|
name: "Personal",
|
|
});
|
|
const projectId = await ctx.db.insert("projects", {
|
|
createdAt: 1,
|
|
name: "Zopu",
|
|
normalizedSourceUrl: "https://example.com/zopu",
|
|
organizationId,
|
|
repositoryPath: "puter/zopu",
|
|
sourceHost: "example.com",
|
|
sourceUrl: "https://example.com/zopu",
|
|
updatedAt: 1,
|
|
});
|
|
const workId = await ctx.db.insert("works", {
|
|
createdAt: 1,
|
|
objective: "Implement a real slice",
|
|
organizationId,
|
|
projectId,
|
|
status: "executing",
|
|
title: "Real execution",
|
|
updatedAt: 1,
|
|
});
|
|
const sliceRowId = await ctx.db.insert("workSlices", {
|
|
designVersion: 1,
|
|
objective: "Change the repo",
|
|
observableBehavior: "A diff exists",
|
|
ordinal: 0,
|
|
payloadJson: "{}",
|
|
sliceId: "slice-1",
|
|
status: "running",
|
|
title: "Implementation",
|
|
workId,
|
|
});
|
|
const runId = await ctx.db.insert("workRuns", {
|
|
createdAt: 1,
|
|
designVersion: 1,
|
|
executionKind: "real",
|
|
kitId: "coding-v0",
|
|
kitVersion: "1",
|
|
scenario: "success",
|
|
sliceId: "slice-1",
|
|
sliceRowId,
|
|
status: "running",
|
|
workId,
|
|
});
|
|
const attemptId = await ctx.db.insert("workAttempts", {
|
|
number: 1,
|
|
runId,
|
|
status: "running",
|
|
workId,
|
|
workspaceKey: "workspace-1",
|
|
});
|
|
return { attemptId, runId, workId };
|
|
});
|
|
|
|
await t.mutation(api.workExecutionWorkflow.completeAttempt, {
|
|
attemptId: seeded.attemptId,
|
|
result: {
|
|
baseRevision: "base123",
|
|
candidateRevision: "candidate456",
|
|
changedFiles: ["src/index.ts"],
|
|
diff: "+export const ready = true;",
|
|
environmentId: "workspace-1",
|
|
events: [
|
|
{
|
|
kind: "runtime.completed",
|
|
message: "completed",
|
|
metadata: {},
|
|
occurredAt: 2,
|
|
sequence: 0,
|
|
},
|
|
],
|
|
summary: "Changed one file",
|
|
},
|
|
});
|
|
|
|
const state = await t.run(async (ctx) => ({
|
|
artifacts: await ctx.db.query("workArtifacts").collect(),
|
|
attempt: await ctx.db.get(seeded.attemptId),
|
|
run: await ctx.db.get(seeded.runId),
|
|
work: await ctx.db.get(seeded.workId),
|
|
}));
|
|
expect(state.attempt?.classification).toBe("Succeeded");
|
|
expect(state.run).toMatchObject({
|
|
baseRevision: "base123",
|
|
candidateRevision: "candidate456",
|
|
terminalClassification: "Succeeded",
|
|
});
|
|
expect(state.work?.status).toBe("completed");
|
|
expect(state.artifacts[0]).toMatchObject({
|
|
kind: "diff",
|
|
sourceRevision: "candidate456",
|
|
});
|
|
});
|
|
});
|