use help_probe::api_docs::{DocFormat, generate_api_docs};
use help_probe::model::ProbeResult;
fn create_test_result() -> ProbeResult {
ProbeResult {
command: "test-cmd".to_string(),
args: vec![],
exit_code: Some(0),
timed_out: false,
help_flag_detected: true,
usage_blocks: vec!["test-cmd [OPTIONS] <FILE>".to_string()],
options: vec![],
subcommands: vec![],
arguments: vec![],
examples: vec![],
environment_variables: vec![],
validation_rules: vec![],
raw_stdout: "Test command description".to_string(),
raw_stderr: String::new(),
}
}
#[test]
fn generate_api_docs_markdown() {
let result = create_test_result();
let docs = generate_api_docs(&result, DocFormat::Markdown);
assert!(docs.contains("# test-cmd"));
assert!(docs.contains("## Description"));
assert!(docs.contains("## Usage"));
}
#[test]
fn generate_api_docs_html() {
let result = ProbeResult {
command: "test-cmd".to_string(),
args: vec![],
exit_code: Some(0),
timed_out: false,
help_flag_detected: true,
usage_blocks: vec![],
options: vec![],
subcommands: vec![],
arguments: vec![],
examples: vec![],
environment_variables: vec![],
validation_rules: vec![],
raw_stdout: String::new(),
raw_stderr: String::new(),
};
let docs = generate_api_docs(&result, DocFormat::Html);
assert!(docs.contains("<!DOCTYPE html>"));
assert!(docs.contains("<h1>test-cmd</h1>"));
}
#[test]
fn generate_api_docs_openapi() {
let result = ProbeResult {
command: "test-cmd".to_string(),
args: vec![],
exit_code: Some(0),
timed_out: false,
help_flag_detected: true,
usage_blocks: vec![],
options: vec![],
subcommands: vec![],
arguments: vec![],
examples: vec![],
environment_variables: vec![],
validation_rules: vec![],
raw_stdout: String::new(),
raw_stderr: String::new(),
};
let docs = generate_api_docs(&result, DocFormat::OpenApi);
assert!(docs.contains("\"openapi\""));
assert!(docs.contains("\"3.0.0\""));
assert!(docs.contains("test-cmd"));
}
#[test]
fn generate_api_docs_json_schema() {
let result = ProbeResult {
command: "test-cmd".to_string(),
args: vec![],
exit_code: Some(0),
timed_out: false,
help_flag_detected: true,
usage_blocks: vec![],
options: vec![],
subcommands: vec![],
arguments: vec![],
examples: vec![],
environment_variables: vec![],
validation_rules: vec![],
raw_stdout: String::new(),
raw_stderr: String::new(),
};
let docs = generate_api_docs(&result, DocFormat::JsonSchema);
assert!(docs.contains("\"$schema\""));
assert!(docs.contains("\"title\""));
assert!(docs.contains("test-cmd"));
}
#[test]
fn generate_api_docs_with_options() {
use help_probe::model::OptionSpec;
let result = ProbeResult {
command: "test-cmd".to_string(),
args: vec![],
exit_code: Some(0),
timed_out: false,
help_flag_detected: true,
usage_blocks: vec![],
options: vec![OptionSpec {
short_flags: vec!["-h".to_string()],
long_flags: vec!["--help".to_string()],
description: Some("Show help".to_string()),
option_type: help_probe::model::OptionType::Boolean,
required: false,
default_value: None,
takes_argument: false,
argument_name: None,
choices: vec![],
}],
subcommands: vec![],
arguments: vec![],
examples: vec![],
environment_variables: vec![],
validation_rules: vec![],
raw_stdout: String::new(),
raw_stderr: String::new(),
};
let docs = generate_api_docs(&result, DocFormat::Markdown);
assert!(docs.contains("## Options"));
assert!(docs.contains("--help"));
}
#[test]
fn generate_api_docs_with_arguments() {
use help_probe::model::ArgumentSpec;
let result = ProbeResult {
command: "test-cmd".to_string(),
args: vec![],
exit_code: Some(0),
timed_out: false,
help_flag_detected: true,
usage_blocks: vec![],
options: vec![],
subcommands: vec![],
arguments: vec![ArgumentSpec {
name: "FILE".to_string(),
description: Some("Input file".to_string()),
required: true,
variadic: false,
arg_type: Some(help_probe::model::ArgumentType::Path),
placeholder: Some("<FILE>".to_string()),
}],
examples: vec![],
environment_variables: vec![],
validation_rules: vec![],
raw_stdout: String::new(),
raw_stderr: String::new(),
};
let docs = generate_api_docs(&result, DocFormat::Markdown);
assert!(docs.contains("## Arguments"));
assert!(docs.contains("FILE"));
}
#[test]
fn generate_api_docs_with_subcommands() {
use help_probe::model::SubcommandSpec;
let result = ProbeResult {
command: "test-cmd".to_string(),
args: vec![],
exit_code: Some(0),
timed_out: false,
help_flag_detected: true,
usage_blocks: vec![],
options: vec![],
subcommands: vec![SubcommandSpec {
name: "build".to_string(),
description: Some("Build the project".to_string()),
full_path: "build".to_string(),
parent: None,
options: Vec::new(),
arguments: Vec::new(),
subcommands: Vec::new(),
}],
arguments: vec![],
examples: vec![],
environment_variables: vec![],
validation_rules: vec![],
raw_stdout: String::new(),
raw_stderr: String::new(),
};
let docs = generate_api_docs(&result, DocFormat::Markdown);
assert!(docs.contains("## Subcommands"));
assert!(docs.contains("build"));
}
#[test]
fn generate_api_docs_with_examples() {
use help_probe::model::Example;
let result = ProbeResult {
command: "test-cmd".to_string(),
args: vec![],
exit_code: Some(0),
timed_out: false,
help_flag_detected: true,
usage_blocks: vec![],
options: vec![],
subcommands: vec![],
arguments: vec![],
examples: vec![Example {
command: "test-cmd --help".to_string(),
description: Some("Show help".to_string()),
tags: vec!["basic".to_string()],
}],
environment_variables: vec![],
validation_rules: vec![],
raw_stdout: String::new(),
raw_stderr: String::new(),
};
let docs = generate_api_docs(&result, DocFormat::Markdown);
assert!(docs.contains("## Examples"));
assert!(docs.contains("test-cmd --help"));
}