mod common;
use common::{init_project, normalize_output, run_commands, today};
use std::fs;
#[test]
fn test_render_rfc_display_path() {
let temp_dir = init_project();
let date = today();
let rfc_dir = temp_dir.path().join("gov/rfc/RFC-0001");
fs::create_dir_all(rfc_dir.join("clauses")).unwrap();
fs::write(
rfc_dir.join("rfc.toml"),
r#"[govctl]
id = "RFC-0001"
title = "Test RFC"
version = "0.1.0"
status = "draft"
phase = "spec"
owners = ["test@example.com"]
created = "2026-01-01"
[[sections]]
title = "Specification"
clauses = ["clauses/C-TEST.toml"]
[[changelog]]
version = "0.1.0"
date = "2026-01-01"
notes = "Initial draft"
"#,
)
.unwrap();
fs::write(
rfc_dir.join("clauses/C-TEST.toml"),
r#"[govctl]
id = "C-TEST"
title = "Test Clause"
kind = "normative"
status = "active"
[content]
text = "Test clause content."
"#,
)
.unwrap();
let output = run_commands(
temp_dir.path(),
&[&["rfc", "render", "RFC-0001", "--dry-run"]],
);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}
#[test]
fn test_render_adr_display_path() {
let temp_dir = init_project();
let date = today();
let adr_dir = temp_dir.path().join("gov/adr");
fs::create_dir_all(&adr_dir).unwrap();
fs::write(
adr_dir.join("ADR-0001-test-decision.toml"),
r#"[govctl]
schema = 1
id = "ADR-0001"
title = "Test Decision"
status = "proposed"
date = "2026-01-01"
refs = []
[content]
context = "Test context"
decision = "Test decision"
alternatives = []
consequences = "Test consequences"
"#,
)
.unwrap();
let output = run_commands(
temp_dir.path(),
&[&["adr", "render", "ADR-0001", "--dry-run"]],
);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}
#[test]
fn test_render_work_display_path() {
let temp_dir = init_project();
let date = today();
let work_dir = temp_dir.path().join("gov/work");
fs::create_dir_all(&work_dir).unwrap();
let work_filename = format!("{}-test-work.toml", date);
fs::write(
work_dir.join(&work_filename),
format!(
r#"[govctl]
schema = 1
id = "WI-{}-001"
title = "Test Work"
status = "active"
created = "{}"
started = "{}"
refs = []
[content]
description = "Test description"
acceptance_criteria = []
notes = []
"#,
date, date, date
),
)
.unwrap();
let output = run_commands(
temp_dir.path(),
&[&["work", "render", &format!("WI-{}-001", date), "--dry-run"]],
);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}
#[test]
fn test_render_rfc_missing_returns_scope_context() {
let temp_dir = init_project();
let date = today();
let output = run_commands(temp_dir.path(), &[&["rfc", "render", "RFC-9999"]]);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}
#[test]
fn test_render_adr_missing_returns_scope_context() {
let temp_dir = init_project();
let date = today();
let output = run_commands(temp_dir.path(), &[&["adr", "render", "ADR-9999"]]);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}
#[test]
fn test_render_work_missing_returns_scope_context() {
let temp_dir = init_project();
let date = today();
let output = run_commands(temp_dir.path(), &[&["work", "render", "WI-9999-01-01-001"]]);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}
#[test]
fn test_delete_work_dry_run_display_path() {
let temp_dir = init_project();
let date = today();
let work_dir = temp_dir.path().join("gov/work");
fs::create_dir_all(&work_dir).unwrap();
let work_filename = format!("{}-test-work.toml", date);
fs::write(
work_dir.join(&work_filename),
format!(
r#"[govctl]
schema = 1
id = "WI-{}-001"
title = "Test Work to Delete"
status = "queue"
created = "{}"
refs = []
[content]
description = "Test description"
acceptance_criteria = []
notes = []
"#,
date, date
),
)
.unwrap();
let output = run_commands(
temp_dir.path(),
&[&["work", "delete", &format!("WI-{}-001", date), "--dry-run"]],
);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}
#[test]
fn test_delete_clause_dry_run_display_path() {
let temp_dir = init_project();
let date = today();
let rfc_dir = temp_dir.path().join("gov/rfc/RFC-0001");
fs::create_dir_all(rfc_dir.join("clauses")).unwrap();
fs::write(
rfc_dir.join("rfc.toml"),
r#"#:schema ../../schema/rfc.schema.json
[govctl]
schema = 1
id = "RFC-0001"
title = "Draft RFC"
version = "0.1.0"
status = "draft"
phase = "spec"
owners = ["test@example.com"]
created = "2026-01-01"
[[sections]]
title = "Specification"
clauses = ["clauses/C-TO-DELETE.toml"]
[[changelog]]
version = "0.1.0"
date = "2026-01-01"
notes = "Initial draft"
"#,
)
.unwrap();
fs::write(
rfc_dir.join("clauses/C-TO-DELETE.toml"),
r#"#:schema ../../schema/clause.schema.json
[govctl]
schema = 1
id = "C-TO-DELETE"
title = "Clause To Delete"
kind = "normative"
status = "active"
[content]
text = "This clause will be deleted."
"#,
)
.unwrap();
let output = run_commands(
temp_dir.path(),
&[&["clause", "delete", "RFC-0001:C-TO-DELETE", "--dry-run"]],
);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}
#[test]
fn test_rfc_set_dry_run_display_path() {
let temp_dir = init_project();
let date = today();
let rfc_dir = temp_dir.path().join("gov/rfc/RFC-0001");
fs::create_dir_all(rfc_dir.join("clauses")).unwrap();
fs::write(
rfc_dir.join("rfc.toml"),
r#"#:schema ../../schema/rfc.schema.json
[govctl]
schema = 1
id = "RFC-0001"
title = "Draft RFC"
version = "0.1.0"
status = "draft"
phase = "spec"
owners = ["test@example.com"]
created = "2026-01-01"
[[sections]]
title = "Specification"
clauses = []
[[changelog]]
version = "0.1.0"
date = "2026-01-01"
notes = "Initial draft"
"#,
)
.unwrap();
let output = run_commands(
temp_dir.path(),
&[&[
"rfc",
"set",
"RFC-0001",
"title",
"Updated Title",
"--dry-run",
]],
);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}
#[test]
fn test_rfc_bump_dry_run_display_path() {
let temp_dir = init_project();
let date = today();
let rfc_dir = temp_dir.path().join("gov/rfc/RFC-0001");
fs::create_dir_all(rfc_dir.join("clauses")).unwrap();
fs::write(
rfc_dir.join("rfc.toml"),
r#"#:schema ../../schema/rfc.schema.json
[govctl]
schema = 1
id = "RFC-0001"
title = "Draft RFC"
version = "0.1.0"
status = "draft"
phase = "spec"
owners = ["test@example.com"]
created = "2026-01-01"
[[sections]]
title = "Specification"
clauses = []
[[changelog]]
version = "0.1.0"
date = "2026-01-01"
notes = "Initial draft"
"#,
)
.unwrap();
let output = run_commands(
temp_dir.path(),
&[&[
"rfc",
"bump",
"RFC-0001",
"--change",
"fix: test change",
"--dry-run",
]],
);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}
#[test]
fn test_rfc_new_dry_run_display_path() {
let temp_dir = init_project();
let date = today();
let output = run_commands(temp_dir.path(), &[&["rfc", "new", "New RFC", "--dry-run"]]);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}
#[test]
fn test_work_new_dry_run_display_path() {
let temp_dir = init_project();
let date = today();
let output = run_commands(
temp_dir.path(),
&[&["work", "new", "New Work", "--dry-run"]],
);
insta::assert_snapshot!(normalize_output(&output, temp_dir.path(), &date));
}