mod common;
use common::{copy_store_to_temp, corpus_a, dbmd};
#[test]
fn regression_append_accepts_trailing_json_flag() {
let (_tmp, store) = copy_store_to_temp(&corpus_a());
let out = dbmd()
.current_dir(&store)
.args([
"log",
"create",
"records/contacts/sarah-chen.md",
"-m",
"weekly sync",
"--json",
])
.assert()
.success();
let stdout = String::from_utf8(out.get_output().stdout.clone()).unwrap();
let v: serde_json::Value =
serde_json::from_str(&stdout).expect("trailing --json yields a JSON report");
assert_eq!(v["appended"], serde_json::json!(true));
assert_eq!(v["kind"], serde_json::json!("create"));
assert_eq!(
v["object"],
serde_json::json!("records/contacts/sarah-chen.md")
);
let log = std::fs::read_to_string(store.join("log.md")).unwrap();
assert!(
log.contains("create | records/contacts/sarah-chen.md"),
"the appended header landed in log.md:\n{log}"
);
assert!(
log.contains("weekly sync"),
"the note landed in log.md:\n{log}"
);
}
#[test]
fn regression_append_trailing_json_matches_leading_json() {
let (_tmp, store) = copy_store_to_temp(&corpus_a());
let leading = dbmd()
.current_dir(&store)
.args([
"--json",
"log",
"update",
"records/contacts/david-kim.md",
"-m",
"x",
])
.assert()
.success();
let leading_out = String::from_utf8(leading.get_output().stdout.clone()).unwrap();
let leading_v: serde_json::Value = serde_json::from_str(&leading_out).unwrap();
let trailing = dbmd()
.current_dir(&store)
.args([
"log",
"update",
"records/contacts/david-kim.md",
"-m",
"x",
"--json",
])
.assert()
.success();
let trailing_out = String::from_utf8(trailing.get_output().stdout.clone()).unwrap();
let trailing_v: serde_json::Value = serde_json::from_str(&trailing_out).unwrap();
assert_eq!(leading_v["appended"], trailing_v["appended"]);
assert_eq!(leading_v["kind"], trailing_v["kind"]);
assert_eq!(leading_v["object"], trailing_v["object"]);
}
#[test]
fn regression_append_accepts_trailing_color_flag() {
let (_tmp, store) = copy_store_to_temp(&corpus_a());
let before = std::fs::read_to_string(store.join("log.md")).unwrap();
let out = dbmd()
.current_dir(&store)
.args([
"log",
"create",
"records/contacts/sarah-chen.md",
"-m",
"color test",
"--color",
"never",
])
.assert()
.success();
let echoed = String::from_utf8(out.get_output().stdout.clone()).unwrap();
assert!(
echoed.contains("create | records/contacts/sarah-chen.md"),
"append still echoes its header under --color never:\n{echoed}"
);
let after = std::fs::read_to_string(store.join("log.md")).unwrap();
assert_ne!(before, after, "the append landed in log.md");
}
#[test]
fn regression_append_still_rejects_a_real_third_positional() {
let (_tmp, store) = copy_store_to_temp(&corpus_a());
let before = std::fs::read_to_string(store.join("log.md")).unwrap();
dbmd()
.current_dir(&store)
.args([
"log",
"create",
"records/contacts/sarah-chen.md",
"an-unquoted-extra-token",
])
.assert()
.failure()
.code(1);
let after = std::fs::read_to_string(store.join("log.md")).unwrap();
assert_eq!(
before, after,
"a rejected append (real extra positional) must not mutate log.md"
);
}
#[test]
fn regression_tail_help_describes_chronological_order() {
let out = dbmd().args(["log", "tail", "--help"]).assert().success();
let help = String::from_utf8(out.get_output().stdout.clone()).unwrap();
let lower = help.to_lowercase();
assert!(
!lower.contains("newest first"),
"tail help must not claim 'newest first' (output is oldest→newest):\n{help}"
);
assert!(
lower.contains("oldest") && lower.contains("newest"),
"tail help should describe the oldest→newest order explicitly:\n{help}"
);
}