govctl 0.9.1

Project governance CLI for RFC, ADR, and Work Item management
use super::*;

#[test]
fn test_work_get_nested_scalar_rejects_index() -> common::TestResult {
    let (temp_dir, date) = init_project_with_date()?;

    let wi_id = format!("WI-{}-001", date);
    let output = run_commands(
        temp_dir.path(),
        &[
            &["work", "new", "Work Scalar Index Test"],
            &[
                "work",
                "add",
                &wi_id,
                "acceptance_criteria",
                "add: Did something",
            ],
            &["work", "get", &wi_id, "acceptance_criteria[0].text[0]"],
        ],
    )?;
    let normalized = normalize_output(&output, temp_dir.path(), &date)?;
    assert!(
        normalized.contains("error[E0817]: Cannot index into non-list field 'text'"),
        "output: {normalized}"
    );
    Ok(())
}

#[test]
fn test_work_journal_legacy_entries_are_read_only() -> common::TestResult {
    let (temp_dir, date) = init_project_with_date()?;

    let wi_id = format!("WI-{}-001", date);
    let work_path = temp_dir
        .path()
        .join("gov")
        .join("work")
        .join(format!("{}-legacy-journal-test.toml", date));
    let output = run_commands(temp_dir.path(), &[&["work", "new", "Legacy Journal Test"]])?;
    assert!(output.contains("Created work item"), "output: {output}");

    let mut content = std::fs::read_to_string(&work_path)?;
    content.push_str(
        r#"

[[content.journal]]
date = "2026-02-22"
content = "Keep this history"
"#,
    );
    std::fs::write(&work_path, content)?;

    let output = run_commands(
        temp_dir.path(),
        &[
            &["work", "get", &wi_id, "journal[0].content"],
            &[
                "work",
                "edit",
                &wi_id,
                "journal[0].content",
                "--set",
                "Changed history",
            ],
            &["work", "remove", &wi_id, "journal", "--all"],
            &["work", "show", &wi_id],
        ],
    )?;
    let normalized = normalize_output(&output, temp_dir.path(), &date)?;
    assert!(
        normalized.contains("Keep this history"),
        "legacy journal should still render via work show: {normalized}"
    );
    assert_eq!(
        normalized.matches("error[E0803]").count(),
        3,
        "legacy journal get/set/remove field operations should be rejected: {normalized}"
    );
    assert!(
        normalized.contains("## Journal")
            && normalized.contains("Legacy execution history")
            && normalized.contains("loop state"),
        "legacy journal should render with neutral migration guidance: {normalized}"
    );
    let persisted = std::fs::read_to_string(&work_path)?;
    assert!(
        !persisted.contains("Changed history"),
        "legacy journal should not be mutated: {persisted}"
    );
    Ok(())
}