Files
AgentCompany/AgentCompany-Rust/crates/storage/tests/runtime_contract_snapshot_e2e.rs
T

127 lines
4.4 KiB
Rust

use pi_bridge::RuntimeEvent;
use storage::{NewCompanyInput, ProfileStore};
use tempfile::tempdir;
#[test]
fn runtime_contract_entities_round_trip_through_snapshot() {
let sandbox = tempdir().expect("temp dir");
let mut store = ProfileStore::open(sandbox.path()).expect("open store");
let company_id = store
.create_company(NewCompanyInput {
name: "Orbit Runtime".to_string(),
description: "Runtime contract verification".to_string(),
workspace_path: "/tmp/orbit-runtime".to_string(),
execution_mode: "ai_ceo".to_string(),
})
.expect("create company");
let ts = support::time::now_iso().expect("timestamp");
let run_id = uuid::Uuid::new_v4().to_string();
let conn = rusqlite::Connection::open(store.db_path()).expect("open raw db");
conn.execute(
"insert into runs (id, company_id, task_id, agent_id, workspace_id, connector_id, status, summary, error_message, model, cost_usd, started_at, finished_at, created_at, updated_at) values (?1, ?2, null, '__board__', null, 'anthropic', 'running', 'Runtime active', null, 'claude-sonnet', 0.25, ?3, null, ?3, ?3)",
rusqlite::params![run_id, company_id, ts],
)
.expect("insert run");
let event_id = store
.append_run_event(
&company_id,
&run_id,
"tool_call",
"write_file",
"Requested README update",
)
.expect("append run event");
let artifact_id = store
.register_artifact(
&company_id,
&run_id,
"filesystem",
"/tmp/orbit-runtime/README.md",
"README update",
"{\"path\":\"/tmp/orbit-runtime/README.md\"}",
)
.expect("register artifact");
store
.ingest_runtime_event(RuntimeEvent::Message {
run_id: run_id.clone(),
role: "assistant".to_string(),
body: "Draft ready".to_string(),
})
.expect("ingest message event");
store
.ingest_runtime_event(RuntimeEvent::Artifact {
run_id: run_id.clone(),
provider: "filesystem".to_string(),
external_id: "/tmp/orbit-runtime/output.txt".to_string(),
title: "output.txt".to_string(),
metadata_json: serde_json::json!({"path": "/tmp/orbit-runtime/output.txt"}),
})
.expect("ingest artifact event");
store
.ingest_runtime_event(RuntimeEvent::RunFinished {
run_id: run_id.clone(),
status: "completed".to_string(),
summary: "Run complete".to_string(),
session_id: Some("session-1".to_string()),
cost_usd: Some(1.25),
})
.expect("ingest run finished event");
let snapshot = store.snapshot().expect("snapshot");
assert!(snapshot.run_events.iter().any(|event| {
event.id == event_id
&& event.run_id == run_id
&& event.event_kind == "tool_call"
&& event.title == "write_file"
}));
assert!(snapshot.artifacts.iter().any(|artifact| {
artifact.id == artifact_id
&& artifact.run_id == run_id
&& artifact.provider == "filesystem"
&& artifact.title == "README update"
}));
assert!(snapshot.run_events.iter().any(|event| {
event.run_id == run_id && event.event_kind == "message" && event.detail == "Draft ready"
}));
assert!(
snapshot
.artifacts
.iter()
.any(|artifact| { artifact.run_id == run_id && artifact.title == "output.txt" })
);
let run = snapshot
.runs
.iter()
.find(|run| run.id == run_id)
.expect("run present");
assert_eq!(run.status, "completed");
assert_eq!(run.summary, "Run complete");
assert_eq!(run.cost_usd, Some(1.25));
assert!(run.finished_at.is_some());
let reopened = ProfileStore::open(sandbox.path()).expect("reopen store");
let reopened_snapshot = reopened.snapshot().expect("reopened snapshot");
assert!(
reopened_snapshot
.run_events
.iter()
.any(|event| event.id == event_id)
);
assert!(
reopened_snapshot
.artifacts
.iter()
.any(|artifact| artifact.id == artifact_id)
);
assert!(
reopened_snapshot
.runs
.iter()
.any(|run| run.id == run_id && run.status == "completed")
);
}