Squashed 'vendor/ruvector/' content from commit b64c2172
git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
This commit is contained in:
227
examples/scipix/tests/integration/cli_tests.rs
Normal file
227
examples/scipix/tests/integration/cli_tests.rs
Normal file
@@ -0,0 +1,227 @@
|
||||
// CLI integration tests
|
||||
//
|
||||
// Tests command-line interface functionality
|
||||
|
||||
use super::*;
|
||||
use assert_cmd::Command;
|
||||
use predicates::prelude::*;
|
||||
use std::process::Stdio;
|
||||
|
||||
#[test]
|
||||
fn test_cli_ocr_command_with_file() {
|
||||
// Create test image
|
||||
let image = images::generate_simple_equation("x + 1");
|
||||
image.save("/tmp/cli_test.png").unwrap();
|
||||
|
||||
// Run CLI command
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("ocr")
|
||||
.arg("/tmp/cli_test.png")
|
||||
.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains("x"))
|
||||
.stdout(predicate::str::contains("LaTeX:"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cli_ocr_with_output_format() {
|
||||
let image = images::generate_fraction(3, 4);
|
||||
image.save("/tmp/cli_fraction.png").unwrap();
|
||||
|
||||
// Test LaTeX output
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("ocr")
|
||||
.arg("/tmp/cli_fraction.png")
|
||||
.arg("--format")
|
||||
.arg("latex")
|
||||
.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains(r"\frac"));
|
||||
|
||||
// Test MathML output
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("ocr")
|
||||
.arg("/tmp/cli_fraction.png")
|
||||
.arg("--format")
|
||||
.arg("mathml")
|
||||
.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains("<mfrac>"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cli_batch_command() {
|
||||
// Create test directory with images
|
||||
std::fs::create_dir_all("/tmp/cli_batch").unwrap();
|
||||
|
||||
let equations = vec!["a + b", "x - y", "2 * 3"];
|
||||
for (i, eq) in equations.iter().enumerate() {
|
||||
let image = images::generate_simple_equation(eq);
|
||||
image.save(&format!("/tmp/cli_batch/eq_{}.png", i)).unwrap();
|
||||
}
|
||||
|
||||
// Run batch command
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("batch")
|
||||
.arg("/tmp/cli_batch")
|
||||
.arg("--output")
|
||||
.arg("/tmp/cli_batch_results.json")
|
||||
.assert()
|
||||
.success();
|
||||
|
||||
// Verify output file
|
||||
let results = std::fs::read_to_string("/tmp/cli_batch_results.json").unwrap();
|
||||
assert!(results.contains("a"), "Should contain results");
|
||||
assert!(results.len() > 100, "Should have substantial output");
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[ignore] // Requires built binary and available port
|
||||
fn test_cli_serve_command_startup() {
|
||||
// This test requires the binary to be built first
|
||||
// Use std::process::Command for spawn functionality
|
||||
use std::process::Command as StdCommand;
|
||||
|
||||
// Get the binary path from environment, or fall back to cargo build path
|
||||
let bin_path = std::env::var("CARGO_BIN_EXE_scipix-ocr")
|
||||
.unwrap_or_else(|_| "target/debug/scipix-ocr".to_string());
|
||||
|
||||
let mut child = StdCommand::new(&bin_path)
|
||||
.arg("serve")
|
||||
.arg("--port")
|
||||
.arg("18080")
|
||||
.stdout(Stdio::piped())
|
||||
.spawn()
|
||||
.expect("Failed to start server");
|
||||
|
||||
// Wait for server startup
|
||||
std::thread::sleep(std::time::Duration::from_secs(2));
|
||||
|
||||
// Check if server is running
|
||||
let client = reqwest::blocking::Client::new();
|
||||
let response = client
|
||||
.get("http://localhost:18080/health")
|
||||
.timeout(std::time::Duration::from_secs(5))
|
||||
.send();
|
||||
|
||||
// Kill server
|
||||
let _ = child.kill();
|
||||
|
||||
assert!(response.is_ok(), "Server should respond to health check");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cli_config_command() {
|
||||
// Test config show
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("config").arg("show").assert().success().stdout(
|
||||
predicate::str::contains("model_path").or(predicate::str::contains("Configuration")),
|
||||
);
|
||||
|
||||
// Test config set
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("config")
|
||||
.arg("set")
|
||||
.arg("preprocessing.enable_deskew")
|
||||
.arg("true")
|
||||
.assert()
|
||||
.success();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cli_invalid_file() {
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("ocr")
|
||||
.arg("/nonexistent/file.png")
|
||||
.assert()
|
||||
.failure()
|
||||
.stderr(predicate::str::contains("not found").or(predicate::str::contains("error")));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cli_exit_codes() {
|
||||
// Success case
|
||||
let image = images::generate_simple_equation("ok");
|
||||
image.save("/tmp/exit_code_test.png").unwrap();
|
||||
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("ocr")
|
||||
.arg("/tmp/exit_code_test.png")
|
||||
.assert()
|
||||
.code(0);
|
||||
|
||||
// Failure case
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("ocr")
|
||||
.arg("/nonexistent.png")
|
||||
.assert()
|
||||
.code(predicate::ne(0));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cli_verbose_output() {
|
||||
let image = images::generate_simple_equation("verbose");
|
||||
image.save("/tmp/verbose_test.png").unwrap();
|
||||
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("ocr")
|
||||
.arg("/tmp/verbose_test.png")
|
||||
.arg("--verbose")
|
||||
.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains("Processing").or(predicate::str::contains("Confidence")));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cli_json_output() {
|
||||
let image = images::generate_simple_equation("json");
|
||||
image.save("/tmp/json_test.png").unwrap();
|
||||
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
let output = cmd
|
||||
.arg("ocr")
|
||||
.arg("/tmp/json_test.png")
|
||||
.arg("--output-format")
|
||||
.arg("json")
|
||||
.output()
|
||||
.expect("Failed to execute command");
|
||||
|
||||
let stdout = String::from_utf8_lossy(&output.stdout);
|
||||
|
||||
// Verify JSON structure
|
||||
let json: serde_json::Value =
|
||||
serde_json::from_str(&stdout).expect("Output should be valid JSON");
|
||||
|
||||
assert!(json.get("latex").is_some(), "Should have latex field");
|
||||
assert!(
|
||||
json.get("confidence").is_some(),
|
||||
"Should have confidence field"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cli_help_command() {
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("--help")
|
||||
.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains("USAGE:"))
|
||||
.stdout(predicate::str::contains("COMMANDS:"));
|
||||
|
||||
// Test subcommand help
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("ocr")
|
||||
.arg("--help")
|
||||
.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains("OPTIONS:"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_cli_version_command() {
|
||||
let mut cmd = Command::cargo_bin("scipix-ocr").unwrap();
|
||||
cmd.arg("--version")
|
||||
.assert()
|
||||
.success()
|
||||
.stdout(predicate::str::contains(env!("CARGO_PKG_VERSION")));
|
||||
}
|
||||
Reference in New Issue
Block a user