ralph-agent-loop 0.4.0

A Rust CLI for managing AI agent loops with a structured JSON task queue
Documentation
//! Merge-focused queue import tests.

use super::super::merge::merge_imported_tasks;
use super::{ImportReport, OnDuplicate};
use crate::contracts::{QueueFile, Task, TaskStatus};

#[test]
fn import_report_summary_format() {
    let report = ImportReport {
        parsed: 5,
        imported: 3,
        skipped_duplicates: 1,
        renamed: 1,
        rename_mappings: vec![("OLD-001".to_string(), "RQ-0001".to_string())],
    };
    let summary = report.summary();
    assert!(summary.contains("parsed 5"));
    assert!(summary.contains("imported 3"));
    assert!(summary.contains("skipped 1"));
    assert!(summary.contains("renamed 1"));
    assert!(summary.contains("OLD-001 -> RQ-0001"));
}

#[test]
fn merge_imported_tasks_rename_records_mapping() {
    let mut queue = QueueFile {
        version: 1,
        tasks: vec![Task {
            id: "RQ-0001".to_string(),
            title: "Existing".to_string(),
            description: None,
            status: TaskStatus::Todo,
            created_at: Some("2026-01-01T00:00:00Z".to_string()),
            updated_at: Some("2026-01-01T00:00:00Z".to_string()),
            ..Default::default()
        }],
    };

    let imported = vec![Task {
        id: "RQ-0001".to_string(),
        title: "Duplicate".to_string(),
        description: None,
        status: TaskStatus::Todo,
        created_at: Some("2026-01-02T00:00:00Z".to_string()),
        updated_at: Some("2026-01-02T00:00:00Z".to_string()),
        ..Default::default()
    }];

    let report = merge_imported_tasks(
        &mut queue,
        None,
        imported,
        "RQ",
        4,
        10,
        "2026-01-03T00:00:00Z",
        OnDuplicate::Rename,
    )
    .unwrap();

    assert_eq!(report.renamed, 1);
    assert_eq!(report.rename_mappings.len(), 1);
    assert_eq!(report.rename_mappings[0].0, "RQ-0001");
    assert!(report.rename_mappings[0].1.starts_with("RQ-"));
    assert_eq!(queue.tasks.len(), 2);
    assert!(queue.tasks.iter().any(|task| task.id == "RQ-0001"));
    let duplicate = queue
        .tasks
        .iter()
        .find(|task| task.title == "Duplicate")
        .expect("imported duplicate task");
    assert_ne!(duplicate.id, "RQ-0001");
}