231 lines
9.5 KiB
Bash
Executable File
231 lines
9.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Colors for output
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
RED='\033[0;31m'
|
|
BLUE='\033[0;34m'
|
|
ORANGE='\033[0;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Track test results
|
|
PASSED_TESTS=0
|
|
FAILED_TESTS=0
|
|
SKIPPED_TESTS=0
|
|
TOTAL_TESTS=0
|
|
|
|
echo -e "${YELLOW}=== MCP Inspector CLI Test Script ===${NC}"
|
|
echo -e "${BLUE}This script tests the MCP Inspector CLI's ability to handle various command line options:${NC}"
|
|
echo -e "${BLUE}- Basic CLI mode${NC}"
|
|
echo -e "${BLUE}- Environment variables (-e)${NC}"
|
|
echo -e "${BLUE}- Config file (--config)${NC}"
|
|
echo -e "${BLUE}- Server selection (--server)${NC}"
|
|
echo -e "${BLUE}- Method selection (--method)${NC}"
|
|
echo -e "${BLUE}- Tool-related options (--tool-name, --tool-arg)${NC}"
|
|
echo -e "${BLUE}- Resource-related options (--uri)${NC}"
|
|
echo -e "${BLUE}- Prompt-related options (--prompt-name, --prompt-args)${NC}"
|
|
echo -e "${BLUE}- Logging options (--log-level)${NC}"
|
|
echo ""
|
|
|
|
# Change to the bin directory
|
|
cd "$(dirname "$0")/.."
|
|
BIN_DIR="$(pwd)"
|
|
PROJECT_ROOT="$(dirname "$BIN_DIR")"
|
|
|
|
# Compile bin and cli projects
|
|
echo -e "${YELLOW}Compiling MCP Inspector bin and cli...${NC}"
|
|
cd "$BIN_DIR"
|
|
npm run build
|
|
cd "$PROJECT_ROOT/cli"
|
|
npm run build
|
|
cd "$BIN_DIR"
|
|
|
|
# Create a symbolic link to handle path resolution
|
|
echo -e "${YELLOW}Setting up environment for tests...${NC}"
|
|
PARENT_DIR="$(dirname "$PROJECT_ROOT")"
|
|
|
|
# Define the test server command using npx
|
|
TEST_CMD="npx"
|
|
TEST_ARGS=("@modelcontextprotocol/server-everything")
|
|
|
|
# Create output directory for test results
|
|
OUTPUT_DIR="$BIN_DIR/tests/output"
|
|
mkdir -p "$OUTPUT_DIR"
|
|
|
|
# Create a temporary directory for test files
|
|
TEMP_DIR=$(mktemp -d)
|
|
trap 'rm -rf "$TEMP_DIR"' EXIT INT TERM
|
|
|
|
# Use the existing sample config file
|
|
echo -e "${BLUE}Using existing sample config file: $PROJECT_ROOT/sample-config.json${NC}"
|
|
cat "$PROJECT_ROOT/sample-config.json"
|
|
|
|
# Create an invalid config file for testing
|
|
echo '{
|
|
"mcpServers": {
|
|
"invalid": {' > "$TEMP_DIR/invalid-config.json"
|
|
|
|
# Function to run a basic test
|
|
run_basic_test() {
|
|
local test_name=$1
|
|
local output_file="$OUTPUT_DIR/${test_name//\//_}.log"
|
|
shift
|
|
|
|
echo -e "\n${YELLOW}Testing: ${test_name}${NC}"
|
|
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
|
|
|
# Run the command and capture output
|
|
echo -e "${BLUE}Command: node ${BIN_DIR}/cli.js $*${NC}"
|
|
node "$BIN_DIR/cli.js" "$@" > "$output_file" 2>&1
|
|
local exit_code=$?
|
|
|
|
# Check if the test passed or failed
|
|
if [ $exit_code -eq 0 ]; then
|
|
echo -e "${GREEN}✓ Test passed: ${test_name}${NC}"
|
|
echo -e "${BLUE}First few lines of output:${NC}"
|
|
head -n 5 "$output_file" | sed 's/^/ /'
|
|
PASSED_TESTS=$((PASSED_TESTS + 1))
|
|
else
|
|
echo -e "${RED}✗ Test failed: ${test_name}${NC}"
|
|
echo -e "${RED}Error output:${NC}"
|
|
cat "$output_file" | sed 's/^/ /'
|
|
FAILED_TESTS=$((FAILED_TESTS + 1))
|
|
|
|
# Stop after any error is encountered
|
|
echo -e "${YELLOW}Stopping tests due to error. Please validate and fix before continuing.${NC}"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Function to run an error test (expected to fail)
|
|
run_error_test() {
|
|
local test_name=$1
|
|
local output_file="$OUTPUT_DIR/${test_name//\//_}.log"
|
|
shift
|
|
|
|
echo -e "\n${YELLOW}Testing error case: ${test_name}${NC}"
|
|
TOTAL_TESTS=$((TOTAL_TESTS + 1))
|
|
|
|
# Run the command and capture output
|
|
echo -e "${BLUE}Command: node ${BIN_DIR}/cli.js $*${NC}"
|
|
node "$BIN_DIR/cli.js" "$@" > "$output_file" 2>&1
|
|
local exit_code=$?
|
|
|
|
# For error tests, we expect a non-zero exit code
|
|
if [ $exit_code -ne 0 ]; then
|
|
echo -e "${GREEN}✓ Error test passed: ${test_name}${NC}"
|
|
echo -e "${BLUE}Error output (expected):${NC}"
|
|
head -n 5 "$output_file" | sed 's/^/ /'
|
|
PASSED_TESTS=$((PASSED_TESTS + 1))
|
|
else
|
|
echo -e "${RED}✗ Error test failed: ${test_name} (expected error but got success)${NC}"
|
|
echo -e "${RED}Output:${NC}"
|
|
cat "$output_file" | sed 's/^/ /'
|
|
FAILED_TESTS=$((FAILED_TESTS + 1))
|
|
|
|
# Stop after any error is encountered
|
|
echo -e "${YELLOW}Stopping tests due to error. Please validate and fix before continuing.${NC}"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
echo -e "\n${YELLOW}=== Running Basic CLI Mode Tests ===${NC}"
|
|
|
|
# Test 1: Basic CLI mode with method
|
|
run_basic_test "basic_cli_mode" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "tools/list"
|
|
|
|
# Test 2: CLI mode with non-existent method (should fail)
|
|
run_error_test "nonexistent_method" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "nonexistent/method"
|
|
|
|
# Test 3: CLI mode without method (should fail)
|
|
run_error_test "missing_method" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli"
|
|
|
|
echo -e "\n${YELLOW}=== Running Environment Variable Tests ===${NC}"
|
|
|
|
# Test 4: CLI mode with environment variables
|
|
run_basic_test "env_variables" "${TEST_CMD}" "${TEST_ARGS[@]}" "-e" "KEY1=value1" "-e" "KEY2=value2" "--cli" "--method" "tools/list"
|
|
|
|
# Test 5: CLI mode with invalid environment variable format (should fail)
|
|
run_error_test "invalid_env_format" "${TEST_CMD}" "${TEST_ARGS[@]}" "-e" "INVALID_FORMAT" "--cli" "--method" "tools/list"
|
|
|
|
echo -e "\n${YELLOW}=== Running Config File Tests ===${NC}"
|
|
|
|
# Test 6: Using config file with CLI mode
|
|
run_basic_test "config_file" "--config" "$PROJECT_ROOT/sample-config.json" "--server" "everything" "--cli" "--method" "tools/list"
|
|
|
|
# Test 7: Using config file without server name (should fail)
|
|
run_error_test "config_without_server" "--config" "$PROJECT_ROOT/sample-config.json" "--cli" "--method" "tools/list"
|
|
|
|
# Test 8: Using server name without config file (should fail)
|
|
run_error_test "server_without_config" "--server" "everything" "--cli" "--method" "tools/list"
|
|
|
|
# Test 9: Using non-existent config file (should fail)
|
|
run_error_test "nonexistent_config" "--config" "./nonexistent-config.json" "--server" "everything" "--cli" "--method" "tools/list"
|
|
|
|
# Test 10: Using invalid config file format (should fail)
|
|
run_error_test "invalid_config" "--config" "$TEMP_DIR/invalid-config.json" "--server" "everything" "--cli" "--method" "tools/list"
|
|
|
|
# Test 11: Using config file with non-existent server (should fail)
|
|
run_error_test "nonexistent_server" "--config" "$PROJECT_ROOT/sample-config.json" "--server" "nonexistent" "--cli" "--method" "tools/list"
|
|
|
|
echo -e "\n${YELLOW}=== Running Tool-Related Tests ===${NC}"
|
|
|
|
# Test 12: CLI mode with tool call
|
|
run_basic_test "tool_call" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "tools/call" "--tool-name" "echo" "--tool-arg" "message=Hello"
|
|
|
|
# Test 13: CLI mode with tool call but missing tool name (should fail)
|
|
run_error_test "missing_tool_name" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "tools/call" "--tool-arg" "message=Hello"
|
|
|
|
# Test 14: CLI mode with tool call but invalid tool args format (should fail)
|
|
run_error_test "invalid_tool_args" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "tools/call" "--tool-name" "echo" "--tool-arg" "invalid_format"
|
|
|
|
# Test 15: CLI mode with multiple tool args
|
|
run_basic_test "multiple_tool_args" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "tools/call" "--tool-name" "add" "--tool-arg" "a=1" "b=2"
|
|
|
|
echo -e "\n${YELLOW}=== Running Resource-Related Tests ===${NC}"
|
|
|
|
# Test 16: CLI mode with resource read
|
|
run_basic_test "resource_read" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "resources/read" "--uri" "test://static/resource/1"
|
|
|
|
# Test 17: CLI mode with resource read but missing URI (should fail)
|
|
run_error_test "missing_uri" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "resources/read"
|
|
|
|
echo -e "\n${YELLOW}=== Running Prompt-Related Tests ===${NC}"
|
|
|
|
# Test 18: CLI mode with prompt get
|
|
run_basic_test "prompt_get" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "prompts/get" "--prompt-name" "simple_prompt"
|
|
|
|
# Test 19: CLI mode with prompt get and args
|
|
run_basic_test "prompt_get_with_args" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "prompts/get" "--prompt-name" "complex_prompt" "--prompt-args" "temperature=0.7" "style=concise"
|
|
|
|
# Test 20: CLI mode with prompt get but missing prompt name (should fail)
|
|
run_error_test "missing_prompt_name" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "prompts/get"
|
|
|
|
echo -e "\n${YELLOW}=== Running Logging Tests ===${NC}"
|
|
|
|
# Test 21: CLI mode with log level
|
|
run_basic_test "log_level" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "logging/setLevel" "--log-level" "debug"
|
|
|
|
# Test 22: CLI mode with invalid log level (should fail)
|
|
run_error_test "invalid_log_level" "${TEST_CMD}" "${TEST_ARGS[@]}" "--cli" "--method" "logging/setLevel" "--log-level" "invalid"
|
|
|
|
echo -e "\n${YELLOW}=== Running Combined Option Tests ===${NC}"
|
|
|
|
# Note about the combined options issue
|
|
echo -e "${BLUE}Testing combined options with environment variables and config file.${NC}"
|
|
|
|
# Test 23: CLI mode with config file, environment variables, and tool call
|
|
run_basic_test "combined_options" "--config" "$PROJECT_ROOT/sample-config.json" "--server" "everything" "-e" "CLI_ENV_VAR=cli_value" "--cli" "--method" "tools/list"
|
|
|
|
# Test 24: CLI mode with all possible options (that make sense together)
|
|
run_basic_test "all_options" "--config" "$PROJECT_ROOT/sample-config.json" "--server" "everything" "-e" "CLI_ENV_VAR=cli_value" "--cli" "--method" "tools/call" "--tool-name" "echo" "--tool-arg" "message=Hello" "--log-level" "debug"
|
|
|
|
# Print test summary
|
|
echo -e "\n${YELLOW}=== Test Summary ===${NC}"
|
|
echo -e "${GREEN}Passed: $PASSED_TESTS${NC}"
|
|
echo -e "${RED}Failed: $FAILED_TESTS${NC}"
|
|
echo -e "${ORANGE}Skipped: $SKIPPED_TESTS${NC}"
|
|
echo -e "Total: $TOTAL_TESTS"
|
|
echo -e "${BLUE}Detailed logs saved to: $OUTPUT_DIR${NC}"
|
|
|
|
echo -e "\n${GREEN}All tests completed!${NC}" |