Initial commit: Add OpenAPI Mock Server project
This commit is contained in:
251
.README.md
Normal file
251
.README.md
Normal file
@@ -0,0 +1,251 @@
|
||||
# OpenAPI Mock Server
|
||||
|
||||
A CLI tool that generates mock API servers from OpenAPI/Swagger specifications, automatically creating realistic mock responses with field-type-aware fake data generation, configurable response delays, hot-reload support, and optional authentication simulation.
|
||||
|
||||
## Features
|
||||
|
||||
- **OpenAPI/Swagger Support**: Parse and validate both OpenAPI 3.x and Swagger 2.0 specifications
|
||||
- **Smart Data Generation**: Generate realistic mock data based on JSON Schema field types, formats, patterns, and constraints
|
||||
- **Dynamic Route Creation**: Automatically create API routes from OpenAPI endpoint definitions
|
||||
- **Hot Reload**: Automatically reload the server when the OpenAPI spec file changes
|
||||
- **Configurable Delays**: Add response delays to simulate real API latency
|
||||
- **Authentication Simulation**: Support for Bearer token, API Key, and Basic authentication
|
||||
- **Configuration Files**: Support for YAML/JSON configuration files with environment variable overrides
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
# Install from PyPI
|
||||
pip install openapi-mock-server
|
||||
|
||||
# Install from source
|
||||
pip install -e .
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Basic Usage
|
||||
|
||||
Start a mock server from an OpenAPI specification:
|
||||
|
||||
```bash
|
||||
openapi-mock start path/to/openapi.yaml
|
||||
```
|
||||
|
||||
By default, the server runs on `http://127.0.0.1:8080`.
|
||||
|
||||
### With Options
|
||||
|
||||
```bash
|
||||
# Specify port and host
|
||||
openapi-mock start path/to/openapi.yaml --port 3000 --host 0.0.0.0
|
||||
|
||||
# Add response delay (fixed or range)
|
||||
openapi-mock start path/to/openapi.yaml --delay 0.5
|
||||
openapi-mock start path/to/openapi.yaml --delay 0.1,1.0
|
||||
|
||||
# Enable hot-reload (automatic restart on spec changes)
|
||||
openapi-mock start path/to/openapi.yaml --watch
|
||||
|
||||
# Enable authentication
|
||||
openapi-mock start path/to/openapi.yaml --auth bearer
|
||||
openapi-mock start path/to/openapi.yaml --auth api_key
|
||||
openapi-mock start path/to/openapi.yaml --auth basic
|
||||
```
|
||||
|
||||
### Other Commands
|
||||
|
||||
Validate an OpenAPI specification:
|
||||
|
||||
```bash
|
||||
openapi-mock validate path/to/openapi.yaml
|
||||
```
|
||||
|
||||
Display information about an OpenAPI specification:
|
||||
|
||||
```bash
|
||||
openapi-mock info path/to/openapi.yaml
|
||||
```
|
||||
|
||||
Generate a standalone Python file:
|
||||
|
||||
```bash
|
||||
openapi-mock generate path/to/openapi.yaml -o mock_server.py
|
||||
```
|
||||
|
||||
## Configuration File
|
||||
|
||||
You can use a configuration file to set default options. The tool looks for configuration files in the following order:
|
||||
|
||||
1. `.openapi-mock.yaml`
|
||||
2. `.openapi-mock.yml`
|
||||
3. `mock-config.yaml`
|
||||
4. `mock-config.yml`
|
||||
|
||||
Example configuration file:
|
||||
|
||||
```yaml
|
||||
# .openapi-mock.yaml
|
||||
host: 0.0.0.0
|
||||
port: 8080
|
||||
delay: 0.1,0.5
|
||||
auth: bearer
|
||||
watch: true
|
||||
```
|
||||
|
||||
### Environment Variables
|
||||
|
||||
You can also use environment variables to override configuration:
|
||||
|
||||
| Variable | Description |
|
||||
|----------|-------------|
|
||||
| `OPENAPI_MOCK_PORT` | Port number |
|
||||
| `OPENAPI_MOCK_HOST` | Host address |
|
||||
| `OPENAPI_MOCK_DELAY` | Response delay (e.g., `0.5` or `0.1,1.0`) |
|
||||
| `OPENAPI_MOCK_AUTH` | Authentication type |
|
||||
|
||||
## Data Generation
|
||||
|
||||
The mock server generates realistic mock data based on your OpenAPI schema:
|
||||
|
||||
- **String formats**: `email`, `date-time`, `date`, `uuid`, `uri`, `url`, `phone-number`
|
||||
- **String constraints**: `minLength`, `maxLength`, `pattern`, `enum`
|
||||
- **Number constraints**: `minimum`, `maximum`, `multipleOf`
|
||||
- **Array constraints**: `minItems`, `maxItems`
|
||||
- **Object properties**: Generates required properties and optionally additional properties
|
||||
|
||||
Example schema and generated data:
|
||||
|
||||
```yaml
|
||||
# OpenAPI Schema
|
||||
components:
|
||||
schemas:
|
||||
User:
|
||||
type: object
|
||||
required:
|
||||
- id
|
||||
- username
|
||||
- email
|
||||
properties:
|
||||
id:
|
||||
type: integer
|
||||
format: int64
|
||||
username:
|
||||
type: string
|
||||
minLength: 3
|
||||
maxLength: 50
|
||||
email:
|
||||
type: string
|
||||
format: email
|
||||
created_at:
|
||||
type: string
|
||||
format: date-time
|
||||
```
|
||||
|
||||
Generated response:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": 12345,
|
||||
"username": "john_doe",
|
||||
"email": "john.doe@example.com",
|
||||
"created_at": "2024-01-15T10:30:00Z"
|
||||
}
|
||||
```
|
||||
|
||||
## Hot Reload
|
||||
|
||||
When using the `--watch` flag, the server automatically reloads when the OpenAPI specification file changes. This is useful during development when you're iterating on your API design.
|
||||
|
||||
The watcher:
|
||||
- Monitors the spec file for changes
|
||||
- Gracefully restarts the server
|
||||
- Debounces rapid changes to avoid unnecessary reloads
|
||||
|
||||
## Authentication
|
||||
|
||||
### Bearer Token (JWT)
|
||||
|
||||
```bash
|
||||
openapi-mock start openapi.yaml --auth bearer
|
||||
```
|
||||
|
||||
Requests require the `Authorization: Bearer <token>` header.
|
||||
|
||||
### API Key
|
||||
|
||||
```bash
|
||||
openapi-mock start openapi.yaml --auth api_key
|
||||
```
|
||||
|
||||
Requests require either:
|
||||
- `X-API-Key: <key>` header
|
||||
- `Authorization: ApiKey <key>` header
|
||||
|
||||
### Basic Authentication
|
||||
|
||||
```bash
|
||||
openapi-mock start openapi.yaml --auth basic
|
||||
```
|
||||
|
||||
Requests require the `Authorization: Basic <base64-encoded-credentials>` header.
|
||||
|
||||
## Response Delays
|
||||
|
||||
Simulate real API latency by adding response delays:
|
||||
|
||||
```bash
|
||||
# Fixed delay of 500ms
|
||||
openapi-mock start openapi.yaml --delay 0.5
|
||||
|
||||
# Random delay between 100ms and 1000ms
|
||||
openapi-mock start openapi.yaml --delay 0.1,1.0
|
||||
```
|
||||
|
||||
## Development
|
||||
|
||||
### Running Tests
|
||||
|
||||
```bash
|
||||
# Run all tests
|
||||
pytest tests/ -v
|
||||
|
||||
# Run with coverage
|
||||
pytest tests/ -v --cov=src
|
||||
|
||||
# Run integration tests
|
||||
pytest tests/ -k "integration" --tb=short
|
||||
```
|
||||
|
||||
### Project Structure
|
||||
|
||||
```
|
||||
openapi-mock-server/
|
||||
├── src/
|
||||
│ └── openapi_mock/
|
||||
│ ├── cli/ # CLI commands and interface
|
||||
│ ├── core/ # Core utilities (spec parsing, config)
|
||||
│ ├── generators/ # Data generation logic
|
||||
│ └── server/ # FastAPI server and middleware
|
||||
├── tests/
|
||||
│ ├── conftest.py # Pytest fixtures
|
||||
│ ├── test_*.py # Unit tests
|
||||
│ └── fixtures/ # Test fixtures
|
||||
├── pyproject.toml
|
||||
└── requirements.txt
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
- Python 3.9+
|
||||
- click >= 8.0
|
||||
- pyyaml >= 6.0
|
||||
- faker >= 19.0
|
||||
- fastapi >= 0.100
|
||||
- uvicorn >= 0.23
|
||||
- openapi-spec-validator >= 0.6
|
||||
- watchdog >= 3.0
|
||||
|
||||
## License
|
||||
|
||||
MIT License
|
||||
Reference in New Issue
Block a user