#!/usr/bin/env python3 """ api.test - Test REST API endpoints by executing HTTP requests and validating responses against expected outcomes Generated by meta.skill """ import os import sys import json import yaml from pathlib import Path from typing import Dict, List, Any, Optional from betty.config import BASE_DIR from betty.logging_utils import setup_logger logger = setup_logger(__name__) class ApiTest: """ Test REST API endpoints by executing HTTP requests and validating responses against expected outcomes """ def __init__(self, base_dir: str = BASE_DIR): """Initialize skill""" self.base_dir = Path(base_dir) def execute(self, api_spec_path: Optional[str] = None, base_url: Optional[str] = None, test_scenarios_path_optional: Optional[str] = None, auth_config_path_optional: Optional[str] = None) -> Dict[str, Any]: """ Execute the skill Returns: Dict with execution results """ try: logger.info("Executing api.test...") # TODO: Implement skill logic here # Implementation notes: # Support multiple HTTP methods: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS Test scenarios should validate: - Response status codes - Response headers - Response body structure and content - Response time/performance - Authentication/authorization - Error handling Features: - Load test scenarios from OpenAPI/Swagger specs - Support various authentication methods (Bearer, Basic, API Key, OAuth2) - Execute tests in sequence or parallel - Generate detailed HTML reports with pass/fail visualization - Support environment variables for configuration - Retry failed tests with exponential backoff - Collect performance metrics (response time, throughput) Output should include: - Total tests run - Passed/failed counts - Individual test results with request/response details - Performance statistics - Coverage metrics (% of endpoints tested) # Placeholder implementation result = { "ok": True, "status": "success", "message": "Skill executed successfully" } logger.info("Skill completed successfully") return result except Exception as e: logger.error(f"Error executing skill: {e}") return { "ok": False, "status": "failed", "error": str(e) } def main(): """CLI entry point""" import argparse parser = argparse.ArgumentParser( description="Test REST API endpoints by executing HTTP requests and validating responses against expected outcomes" ) parser.add_argument( "--api-spec-path", help="api_spec_path" ) parser.add_argument( "--base-url", help="base_url" ) parser.add_argument( "--test-scenarios-path-optional", help="test_scenarios_path (optional)" ) parser.add_argument( "--auth-config-path-optional", help="auth_config_path (optional)" ) parser.add_argument( "--output-format", choices=["json", "yaml"], default="json", help="Output format" ) args = parser.parse_args() # Create skill instance skill = ApiTest() # Execute skill result = skill.execute( api_spec_path=args.api_spec_path, base_url=args.base_url, test_scenarios_path_optional=args.test_scenarios_path_optional, auth_config_path_optional=args.auth_config_path_optional, ) # Output result if args.output_format == "json": print(json.dumps(result, indent=2)) else: print(yaml.dump(result, default_flow_style=False)) # Exit with appropriate code sys.exit(0 if result.get("ok") else 1) if __name__ == "__main__": main()