govctl 0.9.4

Project governance CLI for RFC, ADR, and Work Item management
use super::super::test_support::{adr, project_index, render_app, rfc, work_item};
use super::*;
use crate::model::{AdrStatus, RfcPhase, RfcStatus, WorkItemStatus};

#[test]
fn dashboard_draws_summary_counts() -> Result<(), Box<dyn std::error::Error>> {
    let app = App::new(dashboard_project_index());

    let (_, rendered) = render_app(120, 24, app, |frame, app| draw(frame, app, frame.area()))?;
    assert!(rendered.iter().any(|line| line.contains("Draft:")));
    assert!(rendered.iter().any(|line| line.contains("Normative:")));
    assert!(rendered.iter().any(|line| line.contains("Proposed:")));
    assert!(rendered.iter().any(|line| line.contains("Accepted:")));
    assert!(rendered.iter().any(|line| line.contains("Queue:")));
    assert!(rendered.iter().any(|line| line.contains("Active:")));
    assert!(
        rendered
            .iter()
            .any(|line| line.contains("Read-only cockpit"))
    );
    assert!(rendered.iter().any(|line| line.contains("[s]")));
    assert!(rendered.iter().any(|line| line.contains("Loops")));
    assert!(rendered.iter().any(|line| line.contains("[9]")));
    assert!(rendered.iter().any(|line| line.contains("Releases")));
    assert!(rendered.iter().any(|line| line.contains("[t]")));
    assert!(rendered.iter().any(|line| line.contains("Tags")));
    Ok(())
}

fn dashboard_project_index() -> crate::model::ProjectIndex {
    project_index(
        vec![
            rfc(
                "RFC-0001",
                "RFC-0001",
                RfcStatus::Draft,
                RfcPhase::Spec,
                &[],
            ),
            rfc(
                "RFC-0002",
                "RFC-0002",
                RfcStatus::Normative,
                RfcPhase::Spec,
                &[],
            ),
        ],
        vec![
            adr("ADR-0001", "ADR-0001", AdrStatus::Proposed, &[]),
            adr("ADR-0002", "ADR-0002", AdrStatus::Accepted, &[]),
        ],
        vec![
            work_item(
                "WI-2026-01-01-001",
                "WI-2026-01-01-001",
                WorkItemStatus::Queue,
                &[],
            ),
            work_item(
                "WI-2026-01-01-002",
                "WI-2026-01-01-002",
                WorkItemStatus::Active,
                &[],
            ),
        ],
    )
}