dkp 0.4.1

dkp — Domain Knowledge Pack management CLI
Documentation
mod common;

use common::{dkp_cmd, scaffold_pack};
use predicates::prelude::*;
use tempfile::TempDir;

#[test]
fn add_source_from_discovered_promotes_entry_interactively() {
    let tmp = TempDir::new().unwrap();
    let pack = scaffold_pack(tmp.path(), "rights-pack", "testing");

    std::fs::create_dir_all(pack.join("build")).unwrap();
    std::fs::write(
        pack.join("build/sources_discovered.jsonl"),
        r#"{"url":"https://example.com/doc","title":"Example Doc","via":"web_fetch","retrieved_at":"2026-01-01T00:00:00Z","command":"generate"}"#,
    )
    .unwrap();

    dkp_cmd()
        .arg("rights")
        .arg(&pack)
        .arg("add-source")
        .arg("--from-discovered")
        .write_stdin("y\nCC-BY-4.0\nsome notes\n")
        .assert()
        .success();

    let csv = std::fs::read_to_string(pack.join("evidence/sources.csv")).unwrap();
    assert!(csv.contains("https://example.com/doc"));
    assert!(csv.contains("CC-BY-4.0"));
    assert!(csv.contains("Example Doc"));
}

#[test]
fn add_source_from_discovered_skips_urls_already_in_sources_csv() {
    let tmp = TempDir::new().unwrap();
    let pack = scaffold_pack(tmp.path(), "rights-dedup-pack", "testing");

    std::fs::create_dir_all(pack.join("build")).unwrap();
    std::fs::create_dir_all(pack.join("evidence")).unwrap();
    std::fs::write(
        pack.join("build/sources_discovered.jsonl"),
        r#"{"url":"https://example.com/already","title":"Already There","via":"web_fetch","retrieved_at":"2026-01-01T00:00:00Z","command":"generate"}"#,
    )
    .unwrap();
    std::fs::write(
        pack.join("evidence/sources.csv"),
        "id,title,url,retrieved_date,license,notes\nsrc-001,Already There,https://example.com/already,2026-01-01,MIT,\n",
    )
    .unwrap();

    dkp_cmd()
        .arg("rights")
        .arg(&pack)
        .arg("add-source")
        .arg("--from-discovered")
        .assert()
        .success()
        .stdout(predicate::str::contains("No new discovered sources"));
}

#[test]
fn add_source_from_discovered_reports_missing_jsonl_clearly() {
    let tmp = TempDir::new().unwrap();
    let pack = scaffold_pack(tmp.path(), "rights-missing-pack", "testing");

    dkp_cmd()
        .arg("rights")
        .arg(&pack)
        .arg("add-source")
        .arg("--from-discovered")
        .assert()
        .success()
        .stdout(predicate::str::contains("No discovered sources found"));
}