wme-cli 0.1.3

CLI tool for the Wikimedia Enterprise API
//! Integration tests for wme-cli
//!
//! These tests verify the CLI's overall behavior including:
//! - Configuration loading and saving
//! - Command-line argument parsing
//! - Output formatting
//! - Error handling

use std::process::Command;
use std::str;

/// Helper to run the CLI binary
fn run_cli() -> Command {
    Command::new(env!("CARGO_BIN_EXE_wme-cli"))
}

#[test]
fn test_cli_version() {
    let output = run_cli()
        .arg("--version")
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("wme"));
}

#[test]
fn test_cli_help() {
    let output = run_cli()
        .arg("--help")
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("Wikimedia Enterprise"));
    assert!(stdout.contains("auth"));
    assert!(stdout.contains("meta"));
    assert!(stdout.contains("article"));
    assert!(stdout.contains("snapshot"));
    assert!(stdout.contains("realtime"));
}

#[test]
fn test_auth_subcommand_help() {
    let output = run_cli()
        .args(["auth", "--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("login"));
    assert!(stdout.contains("refresh"));
    assert!(stdout.contains("revoke"));
}

#[test]
fn test_meta_subcommand_help() {
    let output = run_cli()
        .args(["meta", "--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("project-codes"));
    assert!(stdout.contains("languages"));
    assert!(stdout.contains("projects"));
    assert!(stdout.contains("namespaces"));
}

#[test]
fn test_article_subcommand_help() {
    let output = run_cli()
        .args(["article", "--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("get"));
    assert!(stdout.contains("structured"));
}

#[test]
fn test_snapshot_subcommand_help() {
    let output = run_cli()
        .args(["snapshot", "--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("list"));
    assert!(stdout.contains("info"));
    assert!(stdout.contains("download"));
    assert!(stdout.contains("chunks"));
    assert!(stdout.contains("structured"));
}

#[test]
fn test_realtime_subcommand_help() {
    let output = run_cli()
        .args(["realtime", "--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("stream"));
    assert!(stdout.contains("batches"));
}

#[test]
fn test_invalid_subcommand() {
    let output = run_cli()
        .args(["invalid-command"])
        .output()
        .expect("Failed to execute CLI");

    assert!(!output.status.success());
    let stderr = str::from_utf8(&output.stderr).unwrap();
    assert!(stderr.contains("unrecognized subcommand") || stderr.contains("error"));
}

#[test]
fn test_global_output_flag_help() {
    let output = run_cli()
        .args(["--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("--output"));
    assert!(stdout.contains("--token"));
    assert!(stdout.contains("--config"));
    assert!(stdout.contains("--verbose"));
}

#[test]
fn test_auth_login_help() {
    let output = run_cli()
        .args(["auth", "login", "--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("--username"));
    assert!(stdout.contains("--password"));
}

#[test]
fn test_meta_project_codes_get_help() {
    let output = run_cli()
        .args(["meta", "project-codes-get", "--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("CODE"));
}

#[test]
fn test_snapshot_download_help() {
    let output = run_cli()
        .args(["snapshot", "download", "--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("IDENTIFIER"));
    assert!(stdout.contains("--output-file"));
    assert!(stdout.contains("--range"));
}

#[test]
fn test_realtime_stream_help() {
    let output = run_cli()
        .args(["realtime", "stream", "--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("--since"));
    assert!(stdout.contains("--parts"));
    assert!(stdout.contains("--offsets"));
    assert!(stdout.contains("--ndjson"));
}

#[test]
fn test_snapshot_download_help_resume_info() {
    let output = run_cli()
        .args(["snapshot", "download", "--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    // Verify that --range is documented (single-range downloads don't support resume)
    assert!(stdout.contains("--range"));
    // The download command should be present
    assert!(stdout.contains("download"));
}

#[test]
fn test_snapshot_chunks_list_help() {
    let output = run_cli()
        .args(["snapshot", "chunks", "list", "--help"])
        .output()
        .expect("Failed to execute CLI");

    assert!(output.status.success());
    let stdout = str::from_utf8(&output.stdout).unwrap();
    assert!(stdout.contains("SNAPSHOT_ID"));
}