Files
sausage/host/tests/it/goal_questions.rs
T

93 lines
3.4 KiB
Rust

//! Goal and question-card server cases execute through the world loader.
use sausage::{harness::run_module, world::World};
use std::{path::Path, process::Command};
const BUNDLE: &str = include_str!("../../js/goal-questions-test-bundle.js");
static PREPARE: std::sync::Mutex<()> = std::sync::Mutex::new(());
fn prepare(dir: &Path) -> anyhow::Result<()> {
let _guard = PREPARE.lock().unwrap();
let disk = dir.join("world");
let repo = disk.join("src/sausage");
if repo.join(".git").exists() {
return Ok(());
}
let source = Path::new(env!("CARGO_MANIFEST_DIR")).join("..");
let target = crate::common::build_git();
std::fs::create_dir_all(disk.join("bin"))?;
for binary in ["git", "tar"] {
std::fs::copy(
target.join(format!("wasm32-wasip2/release/{binary}.wasm")),
disk.join(format!("bin/{binary}.wasm")),
)?;
}
crate::common::copy_tree(&source.join("extensions"), &repo.join("extensions"))?;
std::fs::create_dir_all(repo.join("agents"))?;
std::fs::create_dir_all(repo.join("extensions/probe"))?;
std::fs::write(
repo.join("extensions/probe/server.ts"),
"export default host => { globalThis.testHost = host; globalThis.subagentService = host.need({name:'subagents'}); globalThis.messageService = host.need({name:'messages'}); globalThis.lineageService = host.need({name:'lineage'}); host.implement({name:'conversations'}, {summaryModel: async () => globalThis.summaryRef, concludedIn: async () => new Set(), generatedTitle: async () => {}, setMainAgent: async () => {}, setAutomaticSummaries: async () => {}}); return {name:'probe'}; }",
)?;
crate::common::write_config(
dir,
"mainAgent",
serde_json::json!([
{
"name": "scout",
"description": "Search",
"resident": true,
"denyTools": [
"subagent"
],
"isolate": "none",
"model": "faux/faux-1",
"prompt": "Scout instructions"
},
{
"name": "mainAgent",
"description": "Primary",
"resident": true,
"isolate": "none",
"model": "faux/faux-1",
"prompt": "Primary agent"
},
{
"name": "coordinator",
"description": "Coordinate",
"isolate": "none",
"model": "faux/faux-1",
"prompt": "Coordinator agent"
}
]),
)?;
for args in [
vec!["init", "-b", "main"],
vec!["add", "."],
vec!["commit", "--no-gpg-sign", "-m", "messages fixture"],
] {
assert!(
Command::new("git")
.args(args)
.current_dir(&repo)
.env("GIT_AUTHOR_NAME", "Test")
.env("GIT_AUTHOR_EMAIL", "test@example.com")
.env("GIT_COMMITTER_NAME", "Test")
.env("GIT_COMMITTER_EMAIL", "test@example.com")
.status()?
.success()
);
}
Ok(())
}
#[tokio::test(flavor = "current_thread")]
async fn goal_questions() -> anyhow::Result<()> {
let dir = tempfile::tempdir()?;
let dir = dir.path();
let world = World::open(dir)?;
prepare(dir)?;
let exec = sausage::process::exec(World {
root: world.root.clone(),
host_dir: world.host_dir.clone(),
processes: world.processes.clone(),
})?;
run_module(world, exec, BUNDLE).await
}