jerrycan 0.1.0

The AI-native Rust backend platform: framework, CLI, and MCP server. https://jerrycan.cc
Documentation
//! Generated acceptance tests: the design contract as runnable assertions.

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]; // todos (with comments subroute)
    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}"
    );
    // success tests:
    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}"
        );
    }
    // listed 404s:
    assert!(
        generated.contains("async fn show_todo_missing_id_is_404"),
        "{generated}"
    );
    assert!(generated.contains("/todos/999999"), "{generated}");
    // seed-then-request flow uses the creator:
    assert!(generated.contains("post_json(\"/todos/\""), "{generated}");
    // memory preamble — no db:
    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}"
    );
}