use nginx_discovery::{
export::{export, ExportFormat, ExportOptions, Filter, FilterType},
parse,
};
use std::io::Cursor;
const SAMPLE_CONFIG: &str = r#"
http {
server {
listen 80;
listen 443 ssl;
server_name example.com www.example.com;
root /var/www/html;
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;
location / {
proxy_pass http://backend;
}
}
server {
listen 8080;
server_name api.example.com;
location /api {
proxy_pass http://api_backend;
}
}
}
"#;
#[test]
fn test_export_json() {
let config = parse(SAMPLE_CONFIG).expect("Failed to parse config");
let options = ExportOptions::builder()
.format(ExportFormat::Json)
.pretty(true)
.build();
let mut output = Cursor::new(Vec::new());
export(&config, &mut output, &options).expect("Failed to export");
let json_str = String::from_utf8(output.into_inner()).unwrap();
assert!(!json_str.is_empty());
assert!(json_str.contains("directives"));
}
#[test]
fn test_export_yaml() {
let config = parse(SAMPLE_CONFIG).expect("Failed to parse config");
let options = ExportOptions::builder().format(ExportFormat::Yaml).build();
let mut output = Cursor::new(Vec::new());
export(&config, &mut output, &options).expect("Failed to export");
let yaml_str = String::from_utf8(output.into_inner()).unwrap();
assert!(!yaml_str.is_empty());
}
#[test]
#[cfg(feature = "export-toml")]
fn test_export_toml() {
let config = parse(SAMPLE_CONFIG).expect("Failed to parse config");
let options = ExportOptions::builder()
.format(ExportFormat::Toml)
.pretty(true)
.build();
let mut output = Cursor::new(Vec::new());
export(&config, &mut output, &options).expect("Failed to export");
let toml_str = String::from_utf8(output.into_inner()).unwrap();
assert!(!toml_str.is_empty());
}
#[test]
#[cfg(feature = "export-markdown")]
fn test_export_markdown() {
let config = parse(SAMPLE_CONFIG).expect("Failed to parse config");
let options = ExportOptions::builder()
.format(ExportFormat::Markdown)
.include_metadata(true)
.build();
let mut output = Cursor::new(Vec::new());
export(&config, &mut output, &options).expect("Failed to export");
let md_str = String::from_utf8(output.into_inner()).unwrap();
assert!(!md_str.is_empty());
assert!(md_str.contains("# NGINX Configuration Report"));
assert!(md_str.contains("## HTTP Configuration"));
}
#[test]
fn test_export_with_filter() {
let config = parse(SAMPLE_CONFIG).expect("Failed to parse config");
let filter = Filter::new(FilterType::ServerName, "example.com");
let options = ExportOptions::builder()
.format(ExportFormat::Json)
.filter(filter)
.build();
let mut output = Cursor::new(Vec::new());
export(&config, &mut output, &options).expect("Failed to export");
let json_str = String::from_utf8(output.into_inner()).unwrap();
assert!(!json_str.is_empty());
}
#[test]
fn test_parse_filter_from_string() {
let filter: Filter = "server_name=*.example.com".parse().unwrap();
assert_eq!(filter.filter_type, FilterType::ServerName);
assert_eq!(filter.pattern, "*.example.com");
}
#[test]
fn test_export_options_builder() {
let options = ExportOptions::builder()
.format(ExportFormat::Json)
.pretty(true)
.compact(false)
.include_metadata(true)
.include_comments(false)
.build();
assert_eq!(options.format, ExportFormat::Json);
assert!(options.pretty);
assert!(!options.compact);
assert!(options.include_metadata);
assert!(!options.include_comments);
}
#[test]
fn test_format_from_str() {
assert_eq!("json".parse::<ExportFormat>().unwrap(), ExportFormat::Json);
assert_eq!("yaml".parse::<ExportFormat>().unwrap(), ExportFormat::Yaml);
assert_eq!("yml".parse::<ExportFormat>().unwrap(), ExportFormat::Yaml);
#[cfg(feature = "export-toml")]
{
assert_eq!("toml".parse::<ExportFormat>().unwrap(), ExportFormat::Toml);
}
#[cfg(feature = "export-markdown")]
{
assert_eq!(
"markdown".parse::<ExportFormat>().unwrap(),
ExportFormat::Markdown
);
assert_eq!(
"md".parse::<ExportFormat>().unwrap(),
ExportFormat::Markdown
);
}
}