Files
mcp-docx/scripts/run_tests.sh
T
2025-08-11 14:31:51 +08:00

312 lines
8.4 KiB
Bash
Executable File

#!/bin/bash
# Comprehensive test runner script for docx-mcp
# Usage: ./scripts/run_tests.sh [OPTIONS]
set -euo pipefail
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Default options
RUN_UNIT_TESTS=true
RUN_INTEGRATION_TESTS=true
RUN_PERFORMANCE_TESTS=false
RUN_BENCHMARKS=false
RUN_SECURITY_AUDIT=true
RUN_COVERAGE=false
VERBOSE=false
QUIET=false
CLEAN_FIRST=false
# Function to print colored output
print_status() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Function to show help
show_help() {
cat << EOF
Usage: $0 [OPTIONS]
Test runner script for docx-mcp project
OPTIONS:
-h, --help Show this help message
-u, --unit-only Run only unit tests
-i, --integration-only Run only integration tests
-p, --performance Include performance tests (slow)
-b, --benchmarks Run benchmarks (slow)
-s, --skip-security Skip security audit
-c, --coverage Generate coverage report
-v, --verbose Verbose output
-q, --quiet Quiet output (errors only)
--clean Clean build artifacts first
--all Run all tests including slow ones
Examples:
$0 # Run standard test suite
$0 -u # Run only unit tests
$0 --all # Run all tests including performance
$0 -c --verbose # Generate coverage with verbose output
EOF
}
# Parse command line arguments
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
exit 0
;;
-u|--unit-only)
RUN_UNIT_TESTS=true
RUN_INTEGRATION_TESTS=false
shift
;;
-i|--integration-only)
RUN_UNIT_TESTS=false
RUN_INTEGRATION_TESTS=true
shift
;;
-p|--performance)
RUN_PERFORMANCE_TESTS=true
shift
;;
-b|--benchmarks)
RUN_BENCHMARKS=true
shift
;;
-s|--skip-security)
RUN_SECURITY_AUDIT=false
shift
;;
-c|--coverage)
RUN_COVERAGE=true
shift
;;
-v|--verbose)
VERBOSE=true
shift
;;
-q|--quiet)
QUIET=true
shift
;;
--clean)
CLEAN_FIRST=true
shift
;;
--all)
RUN_UNIT_TESTS=true
RUN_INTEGRATION_TESTS=true
RUN_PERFORMANCE_TESTS=true
RUN_BENCHMARKS=true
shift
;;
*)
print_error "Unknown option: $1"
show_help
exit 1
;;
esac
done
# Set up output redirection based on quiet flag
if [ "$QUIET" = true ]; then
CARGO_OUTPUT="--quiet"
else
CARGO_OUTPUT=""
fi
if [ "$VERBOSE" = true ]; then
CARGO_OUTPUT="$CARGO_OUTPUT --verbose"
fi
print_status "Starting docx-mcp test suite"
# Check if we're in the right directory
if [ ! -f "Cargo.toml" ]; then
print_error "Cargo.toml not found. Please run this script from the project root."
exit 1
fi
# Check if Rust is installed
if ! command -v cargo &> /dev/null; then
print_error "Cargo not found. Please install Rust first."
exit 1
fi
# Clean build artifacts if requested
if [ "$CLEAN_FIRST" = true ]; then
print_status "Cleaning build artifacts..."
cargo clean $CARGO_OUTPUT
fi
# Check formatting
print_status "Checking code formatting..."
if ! cargo fmt --all -- --check; then
print_error "Code formatting issues found. Run 'cargo fmt' to fix."
exit 1
fi
print_success "Code formatting OK"
# Run Clippy lints
print_status "Running Clippy lints..."
if ! cargo clippy --all-targets --all-features $CARGO_OUTPUT -- -D warnings; then
print_error "Clippy lints failed"
exit 1
fi
print_success "Clippy lints passed"
# Build the project
print_status "Building project..."
if ! cargo build --all-features $CARGO_OUTPUT; then
print_error "Build failed"
exit 1
fi
print_success "Build completed"
# Initialize test results tracking
TESTS_PASSED=0
TESTS_FAILED=0
FAILED_TESTS=()
# Function to run a test and track results
run_test() {
local test_name="$1"
local test_command="$2"
print_status "Running $test_name..."
if eval $test_command; then
print_success "$test_name passed"
((TESTS_PASSED++))
else
print_error "$test_name failed"
((TESTS_FAILED++))
FAILED_TESTS+=("$test_name")
fi
}
# Run unit tests
if [ "$RUN_UNIT_TESTS" = true ]; then
run_test "unit tests" "cargo test --lib $CARGO_OUTPUT"
run_test "doc tests" "cargo test --doc $CARGO_OUTPUT"
fi
# Run integration tests
if [ "$RUN_INTEGRATION_TESTS" = true ]; then
run_test "DOCX handler tests" "cargo test --test docx_handler_tests $CARGO_OUTPUT"
run_test "MCP integration tests" "cargo test --test mcp_integration_tests $CARGO_OUTPUT"
run_test "security tests" "cargo test --test security_tests $CARGO_OUTPUT"
run_test "converter tests" "cargo test --test converter_tests $CARGO_OUTPUT"
run_test "end-to-end workflow tests" "cargo test --test e2e_workflow_tests $CARGO_OUTPUT"
fi
# Run performance tests (if requested)
if [ "$RUN_PERFORMANCE_TESTS" = true ]; then
print_warning "Running performance tests (this may take a while)..."
run_test "performance tests" "cargo test --test performance_tests $CARGO_OUTPUT --release"
fi
# Run benchmarks (if requested)
if [ "$RUN_BENCHMARKS" = true ]; then
print_warning "Running benchmarks (this may take a while)..."
run_test "benchmarks" "cargo bench --all-features $CARGO_OUTPUT"
fi
# Run security audit
if [ "$RUN_SECURITY_AUDIT" = true ]; then
print_status "Running security audit..."
# Install cargo-audit if not present
if ! command -v cargo-audit &> /dev/null; then
print_status "Installing cargo-audit..."
cargo install cargo-audit
fi
run_test "security audit" "cargo audit"
# Check for denied dependencies if cargo-deny is available
if command -v cargo-deny &> /dev/null; then
run_test "dependency check" "cargo deny check"
else
print_warning "cargo-deny not found, skipping dependency checks"
fi
fi
# Generate coverage report (if requested)
if [ "$RUN_COVERAGE" = true ]; then
print_status "Generating coverage report..."
# Check if cargo-llvm-cov is installed
if ! command -v cargo-llvm-cov &> /dev/null; then
print_status "Installing cargo-llvm-cov..."
cargo install cargo-llvm-cov
fi
if cargo llvm-cov --all-features --workspace --html; then
print_success "Coverage report generated in target/llvm-cov/html/"
# Also generate lcov format for CI
if cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info; then
print_success "LCOV format generated as lcov.info"
fi
else
print_error "Coverage generation failed"
((TESTS_FAILED++))
FAILED_TESTS+=("coverage generation")
fi
fi
# Test different feature configurations
print_status "Testing different feature configurations..."
run_test "minimal features" "cargo test --no-default-features $CARGO_OUTPUT"
run_test "all features" "cargo test --all-features $CARGO_OUTPUT"
# Check that package builds for release
print_status "Verifying release build..."
run_test "release build" "cargo build --release --all-features $CARGO_OUTPUT"
# Verify package can be published (dry run)
print_status "Verifying package..."
run_test "package verification" "cargo package --dry-run $CARGO_OUTPUT"
# Print final results
echo ""
print_status "============ Test Results Summary ============"
if [ $TESTS_FAILED -eq 0 ]; then
print_success "All tests passed! ($TESTS_PASSED/$((TESTS_PASSED + TESTS_FAILED)))"
echo ""
print_status "Ready for deployment! 🚀"
exit 0
else
print_error "Some tests failed! ($TESTS_PASSED passed, $TESTS_FAILED failed)"
echo ""
print_error "Failed tests:"
for test in "${FAILED_TESTS[@]}"; do
echo -e " ${RED}${NC} $test"
done
echo ""
print_error "Please fix the failing tests before proceeding."
exit 1
fi