microck/api-test-generator
Генерация полных Python pytest тестов для REST API эндпоинтов с валидацией схемы. Использовать при создании тестов для новых эндпоинтов, добавлении покрытия для CRUD операций или валидации соответствия API с OpenAPI схемами.
npx skills add https://github.com/Microck/ordinary-claude-skills --skill api-test-generator
Generate comprehensive Python pytest tests for MikoPBX REST API endpoints with full parameter coverage, schema validation, and edge case testing.
Analyzes DataStructure.php files and generates complete pytest test suites including:
Use this skill when you need to:
When the user requests test generation:
/pbxcore/api/v3/extensions) find /Users/nb/PhpstormProjects/mikopbx/Core/src/PBXCoreREST/Lib -name "DataStructure.php" | grep -i "{resource}"
Extract from DataStructure.php:
Use the complete template from test-template.py
{ResourceName} placeholderstests/api/
├── test_{resource}_api.py # Main test file
└── conftest.py # Shared fixtures
Each test file should have these test classes:
class TestCreate{ResourceName}:
"""Test POST endpoint for creating resources"""
- test_create_with_valid_data()
- test_create_missing_required_field()
- test_create_with_invalid_type()
class TestGet{ResourceName}:
"""Test GET endpoint for retrieving resources"""
- test_get_all()
- test_get_by_id()
- test_get_nonexistent()
class TestUpdate{ResourceName}:
"""Test PUT/PATCH endpoints for updating resources"""
- test_update_with_valid_data()
- test_patch_partial_update()
class TestDelete{ResourceName}:
"""Test DELETE endpoint for removing resources"""
- test_delete_existing()
- test_delete_nonexistent()
class TestSchemaValidation{ResourceName}:
"""Test response schema validation"""
- test_response_matches_openapi_schema()
class TestEdgeCases{ResourceName}:
"""Test edge cases and boundary conditions"""
- test_special_characters_in_fields()
- test_empty_string_values()
- test_boundary_values()
@pytest.fixture
def auth_token():
"""Get authentication token"""
response = requests.post(
f"{BASE_URL}/pbxcore/api/v3/auth/login",
json={"login": "admin", "password": "123456789MikoPBX#1"},
verify=False
)
return response.json()["data"]["access_token"]
@pytest.fixture
def headers(auth_token):
"""Standard headers with authentication"""
return {
"Authorization": f"Bearer {auth_token}",
"Content-Type": "application/json"
}
def test_create_with_valid_data(self, headers):
"""Test creating a resource with all valid required parameters"""
payload = {
# Based on DataStructure.php
}
response = requests.post(
f"{BASE_URL}{API_PATH}",
json=payload,
headers=headers,
verify=False
)
assert response.status_code == 200, f"Expected 200, got {response.status_code}: {response.text}"
data = response.json()
assert "data" in data
assert "id" in data["data"]
# Validate returned values match input
for key, value in payload.items():
assert data["data"][key] == value
def test_create_missing_required_field(self, headers):
"""Test validation when required field is missing"""
payload = {
# Missing required field
}
response = requests.post(
f"{BASE_URL}{API_PATH}",
json=payload,
headers=headers,
verify=False
)
assert response.status_code == 400
assert "messages" in response.json()
def test_special_characters_in_fields(self, headers):
"""Test handling of special characters"""
special_chars = "Test <script>alert('xss')</script> & \"quotes\""
payload = {
"string_field": special_chars,
}
response = requests.post(...)
assert response.status_code == 200
assert response.json()["data"]["string_field"] == special_chars
When analyzing DataStructure.php, extract these key elements:
public static function getParameterDefinitions(): array
{
return [
'request' => [
'POST' => [
'parameter_name' => [
'type' => 'string', // Extract type
'description' => 'Description', // Extract description
'example' => 'value', // Use for test data
'required' => true, // Required vs optional
'default' => 'default_value', // Default value
'enum' => ['val1', 'val2'], // Valid enum values
'pattern' => '^[a-z]+$', // Regex pattern
'minLength' => 1, // Min length
'maxLength' => 100, // Max length
],
],
],
];
}
example and default valuesAdd to the top of each test file:
"""
Tests for {ResourceName} API endpoint
API Endpoint: /pbxcore/api/v3/{resource-path}
DataStructure: src/PBXCoreREST/Lib/{ResourceName}/DataStructure.php
Test Coverage:
- CRUD operations (Create, Read, Update, Delete)
- Required vs optional parameters
- Data type validations
- Enum value validations
- Pattern validations (regex)
- Boundary conditions (min/max values)
- Special characters and edge cases
- Schema validation (when SCHEMA_VALIDATION_STRICT=1)
Requirements:
- pytest
- requests
- Docker container running with MikoPBX
Run tests:
pytest tests/api/test_{resource_name}.py -v
Run with schema validation:
# Ensure SCHEMA_VALIDATION_STRICT=1 is set in container
pytest tests/api/test_{resource_name}.py -v
"""
Always generate:
# Run all API tests
pytest tests/api/ -v
# Run specific endpoint tests
pytest tests/api/test_extensions_api.py -v
# Run specific test class
pytest tests/api/test_extensions_api.py::TestCreateExtensions -v
# Run specific test
pytest tests/api/test_extensions_api.py::TestCreateExtensions::test_create_with_valid_data -v
# Enable schema validation in container
docker exec mikopbx_container sh -c 'export SCHEMA_VALIDATION_STRICT=1'
# Run tests
pytest tests/api/test_extensions_api.py -v
# Run only CRUD tests
pytest tests/api/ -m crud -v
# Skip slow tests
pytest tests/api/ -m "not slow" -v
# Run smoke tests
pytest tests/api/ -m smoke -v
/auth/loginverify=False for self-signed certificateshttps://mikopbx-php83.localhost:8445SCHEMA_VALIDATION_STRICT=1 in containerComplete test templates for copy-paste usage:
Test a new endpoint in 5 steps:
{ResourceName} and {resource-path}pytest tests/api/test_{resource}_api.py -vNeed specific patterns?
User: "Generate pytest tests for the Extensions API endpoint"
Your response should:
/src/PBXCoreREST/Lib/Extensions/DataStructure.phptests/api/test_extensions_api.pyIssue: Test fails with "Unauthorized"
Solution: Check that auth_token fixture is working and token is valid
Issue: Schema validation tests don't run
Solution: Ensure SCHEMA_VALIDATION_STRICT=1 is set in container
Issue: Tests are flaky
Solution: Ensure test isolation - each test should create its own resources
Issue: Container not accessible
Solution: Check container is running: docker ps | grep mikopbx
Issue: SSL certificate errors
Solution: Ensure verify=False is set in requests
# Check container is running
docker ps | grep mikopbx
# Check environment variable
docker exec mikopbx_container env | grep SCHEMA_VALIDATION_STRICT
# View API logs
docker exec mikopbx_container tail -f /storage/usbdisk1/mikopbx/log/php/error.log
# Test API manually
curl -k https://mikopbx-php83.localhost:8445/pbxcore/api/v3/system/ping
Take microck/api-test-generator from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.