tovuk 0.1.107

Use Tovuk scraper APIs from a native CLI.
use serde_json::json;

use crate::cli::args::CliOptions;

use super::support_create_body;

#[test]
fn support_create_body_uses_typed_payload_and_omits_empty_context() {
    let cli = CliOptions {
        command: "support".to_owned(),
        args: vec![
            "create".to_owned(),
            " Request failed ".to_owned(),
            " request_123 ".to_owned(),
            "timed".to_owned(),
            "out ".to_owned(),
        ],
        ..CliOptions::default()
    };

    assert_eq!(
        support_create_body(&cli).ok(),
        Some(json!({
            "subject": "Request failed",
            "details": "request_123 timed out"
        }))
    );
}

#[test]
fn support_create_body_includes_trimmed_context_flags() {
    let mut cli = CliOptions {
        command: "support".to_owned(),
        args: vec![
            "create".to_owned(),
            "Request failed".to_owned(),
            "Request id request_123 failed.".to_owned(),
        ],
        ..CliOptions::default()
    };
    cli.failing_command = " tovuk request show request_123 --json ".to_owned();
    cli.first_log_line = " upstream timeout ".to_owned();
    cli.request_id = " request_123 ".to_owned();
    cli.scraper_id = " tiktok ".to_owned();
    cli.severity = " urgent ".to_owned();

    assert_eq!(
        support_create_body(&cli).ok(),
        Some(json!({
            "subject": "Request failed",
            "details": "Request id request_123 failed.",
            "severity": "urgent",
            "request_id": "request_123",
            "scraper_id": "tiktok",
            "failing_command": "tovuk request show request_123 --json",
            "first_log_line": "upstream timeout"
        }))
    );
}

#[test]
fn support_create_body_requires_subject_and_details() {
    let cli = CliOptions {
        command: "support".to_owned(),
        args: vec!["create".to_owned(), " ".to_owned(), "details".to_owned()],
        ..CliOptions::default()
    };

    let message = support_create_body(&cli)
        .err()
        .map(|error| error.to_string());
    assert_eq!(
        message.as_deref(),
        Some("Support ticket subject and details are required.")
    );
}

#[test]
fn support_create_body_rejects_invalid_severity() {
    let cli = CliOptions {
        command: "support".to_owned(),
        args: vec![
            "create".to_owned(),
            "Request failed".to_owned(),
            "Request id request_123 failed.".to_owned(),
        ],
        severity: "critical".to_owned(),
        ..CliOptions::default()
    };

    let payload = support_create_body(&cli)
        .err()
        .map(|error| error.payload().clone());
    assert_eq!(
        payload.as_ref().map(|payload| payload.code.as_str()),
        Some("invalid_support_ticket")
    );
    assert_eq!(
        payload.as_ref().map(|payload| payload.message.as_str()),
        Some("Support ticket severity must be low, normal, or urgent.")
    );
}