mod common;
use common::cli_command;
use predicates::str::contains;
#[test]
fn test_rules_command_default_output() {
let assert = cli_command().arg("rules").assert();
assert
.success()
.stdout(contains("MD001"))
.stdout(contains("heading-increment"))
.stdout(contains("MDBOOK001"));
}
#[test]
fn test_rules_command_detailed_output() {
let assert = cli_command().arg("rules").arg("--detailed").assert();
assert
.success()
.stdout(contains("Rule"))
.stdout(contains("Name"))
.stdout(contains("Description"))
.stdout(contains("Category"))
.stdout(contains("Status"))
.stdout(contains("Fix"))
.stdout(contains("MD001"))
.stdout(contains("heading-increment"));
}
#[test]
fn test_rules_command_json_shorthand() {
let assert = cli_command().arg("rules").arg("--json").assert();
let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
let parsed: serde_json::Value =
serde_json::from_str(&stdout).expect("--json output should be valid JSON");
assert!(parsed.get("total_rules").is_some());
assert!(parsed.get("providers").is_some());
let providers = parsed.get("providers").unwrap().as_array().unwrap();
assert!(!providers.is_empty());
let first_provider = &providers[0];
assert!(first_provider.get("rules").is_some());
}
#[test]
fn test_rules_command_format_json() {
let assert = cli_command()
.arg("rules")
.arg("--format")
.arg("json")
.assert();
let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
let parsed: serde_json::Value =
serde_json::from_str(&stdout).expect("--format json output should be valid JSON");
assert!(parsed.get("total_rules").is_some());
}
#[test]
fn test_rules_command_json_and_format_json_equivalent() {
let json_flag_output = cli_command().arg("rules").arg("--json").assert();
let format_json_output = cli_command()
.arg("rules")
.arg("--format")
.arg("json")
.assert();
let json_stdout = String::from_utf8(json_flag_output.get_output().stdout.clone()).unwrap();
let format_stdout = String::from_utf8(format_json_output.get_output().stdout.clone()).unwrap();
let json_parsed: serde_json::Value = serde_json::from_str(&json_stdout).unwrap();
let format_parsed: serde_json::Value = serde_json::from_str(&format_stdout).unwrap();
assert_eq!(
json_parsed.get("total_rules"),
format_parsed.get("total_rules")
);
}
#[test]
fn test_rules_command_standard_only() {
let assert = cli_command().arg("rules").arg("--standard-only").assert();
let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
assert!(stdout.contains("MD001"));
assert!(stdout.contains("MD013"));
assert!(!stdout.contains("MDBOOK001"));
assert!(!stdout.contains("MDBOOK002"));
}
#[test]
fn test_rules_command_mdbook_only() {
let assert = cli_command().arg("rules").arg("--mdbook-only").assert();
let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
assert!(stdout.contains("MDBOOK001"));
assert!(stdout.contains("MDBOOK002"));
assert!(!stdout.contains("MD001"));
assert!(!stdout.contains("MD013"));
}
#[test]
fn test_rules_command_category_filter() {
let assert = cli_command()
.arg("rules")
.arg("--category")
.arg("Structure")
.assert();
let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
assert!(stdout.contains("MD001"));
let line_count = stdout.lines().count();
assert!(line_count < 80); }
#[test]
fn test_rules_command_detailed_with_json() {
let assert = cli_command()
.arg("rules")
.arg("--detailed")
.arg("--json")
.assert();
let stdout = String::from_utf8(assert.get_output().stdout.clone()).unwrap();
let parsed: serde_json::Value =
serde_json::from_str(&stdout).expect("Output should be valid JSON even with --detailed");
assert!(parsed.get("total_rules").is_some());
}
#[test]
fn test_rules_command_help() {
let assert = cli_command().arg("rules").arg("--help").assert();
assert
.success()
.stdout(contains("--detailed"))
.stdout(contains("--json"))
.stdout(contains("--format"))
.stdout(contains("--standard-only"))
.stdout(contains("--mdbook-only"))
.stdout(contains("--category"))
.stdout(contains("--provider"));
}