use jerrycan::platform::design::Design;
use jerrycan::platform::testgen;
const GOLDEN: &str = include_str!("../../../conformance/designs/todo-api.design.json");
fn golden(db: bool) -> Design {
let mut v: serde_json::Value = serde_json::from_str(GOLDEN).unwrap();
if db {
v["dependencies"] = serde_json::json!(["db"]);
}
serde_json::from_value(v).unwrap()
}
#[test]
fn memory_mode_tests_cover_success_and_listed_errors() {
let design = golden(false);
let module = &design.modules[0]; let generated = testgen::acceptance_rs(&design, module);
assert!(
generated.contains("GENERATED by jerrycan gen-tests"),
"tool-owned banner"
);
assert!(
generated.contains("use route_todos::module;"),
"{generated}"
);
for expected in [
"async fn list_todos_returns_200",
"async fn create_todo_returns_201",
"async fn show_todo_returns_200",
"async fn delete_todo_returns_204",
"async fn list_comments_returns_200",
"async fn create_comment_returns_201",
] {
assert!(
generated.contains(expected),
"missing {expected}\n{generated}"
);
}
assert!(
generated.contains("async fn show_todo_missing_id_is_404"),
"{generated}"
);
assert!(generated.contains("/todos/999999"), "{generated}");
assert!(generated.contains("post_json(\"/todos/\""), "{generated}");
assert!(!generated.contains("jerrycan::db"), "{generated}");
assert_eq!(
testgen::test_count(&generated),
8,
"6 success + 2 listed 404s"
);
}
#[test]
fn db_mode_preamble_migrates_an_in_memory_database() {
let design = golden(true);
let module = &design.modules[0];
let generated = testgen::acceptance_rs(&design, module);
assert!(
generated.contains("Db::connect(\"sqlite::memory:\")"),
"{generated}"
);
assert!(
generated.contains("include_str!(\"../migrations/sqlite/0001_create_tables.sql\")"),
"{generated}"
);
assert!(generated.contains(".extend(db)"), "{generated}");
}
#[test]
fn unsupported_error_cases_become_an_agent_todo_comment() {
let mut design = golden(false);
design.modules[0].endpoints[1]
.errors
.push(jerrycan::platform::design::ErrorCase {
status: 409,
code: Some("JC0409".into()),
when: "duplicate title".into(),
});
let generated = testgen::acceptance_rs(&design, &design.modules[0].clone());
assert!(
generated.contains("// AGENT TODO: design lists 409 (duplicate title)"),
"{generated}"
);
}