API Reference - Core Module
This section documents the core framework classes and functions.
BasePage
The BasePage class is the foundation for all API testing in socialseed-e2e.
This module provides an enhanced BasePage class for API testing with production-ready features including structured logging, automatic retries, rate limiting, and comprehensive request/response logging.
- class socialseed_e2e.core.base_page.RetryConfig(max_retries: int = 3, backoff_factor: float = 1.0, max_backoff: float = 60.0, retry_on: List[int] | None = None, retry_exceptions: List[Type[Exception]] | None = None)[source]
Bases:
objectConfiguration for automatic retry mechanism.
- class socialseed_e2e.core.base_page.RateLimitConfig(enabled: bool = False, requests_per_second: float = 10.0, requests_per_minute: float = 600.0, burst_size: int = 5)[source]
Bases:
objectConfiguration for rate limiting.
- class socialseed_e2e.core.base_page.RequestLog(method: str, url: str, headers: Dict[str, str], body: str | None, timestamp: float, duration_ms: float = 0.0, status: int | None = None, response_headers: Dict[str, str] | None = None, response_body: str | None = None, error: str | None = None)[source]
Bases:
objectLog entry for a single request.
- class socialseed_e2e.core.base_page.ServiceHealth(healthy: bool, status_code: int | None = None, response_time_ms: float = 0.0, message: str = '', timestamp: float = <factory>)[source]
Bases:
objectService health status.
- exception socialseed_e2e.core.base_page.BasePageError(message: str, url: str | None = None, method: str | None = None, status: int | None = None, response_text: str | None = None, request_log: RequestLog | None = None)[source]
Bases:
ExceptionEnhanced exception with request context.
- class socialseed_e2e.core.base_page.BasePage(base_url: str, playwright: Playwright | None = None, default_headers: Dict[str, str] | None = None, retry_config: RetryConfig | None = None, rate_limit_config: RateLimitConfig | None = None, enable_request_logging: bool = True, max_log_body_size: int = 10000, health_endpoint: str = '/actuator/health')[source]
Bases:
objectEnhanced base class for API testing with logging, retries, and rate limiting.
This class extends the basic API testing capabilities with production-ready features including:
Structured logging of all requests and responses
Automatic retry mechanism with exponential backoff
Rate limiting to avoid overwhelming APIs
Request timing and performance metrics
Enhanced error messages with full context
Helper methods for common assertions
Service health checking
Example
>>> page = BasePage("https://api.example.com") >>> page.setup() >>> >>> # Enable retries for transient failures >>> page.retry_config = RetryConfig(max_retries=3) >>> >>> # Enable rate limiting >>> page.rate_limit_config = RateLimitConfig( ... enabled=True, ... requests_per_second=5 ... ) >>> >>> # Make request with automatic retry and logging >>> response = page.get("/users/123") >>> >>> # Use helper methods for assertions >>> page.assert_status(response, 200) >>> user = page.assert_json(response) >>> >>> page.teardown()
- base_url
The base URL for the API
- default_headers
Headers applied to all requests
- retry_config
Configuration for automatic retries
- rate_limit_config
Configuration for rate limiting
- enable_request_logging
Whether to log all requests
- max_log_body_size
Maximum size for logged request/response bodies
- request_history
List of RequestLog entries for recent requests
- __init__(base_url: str, playwright: Playwright | None = None, default_headers: Dict[str, str] | None = None, retry_config: RetryConfig | None = None, rate_limit_config: RateLimitConfig | None = None, enable_request_logging: bool = True, max_log_body_size: int = 10000, health_endpoint: str = '/actuator/health') None[source]
Initialize the BasePage.
- Parameters:
base_url – The base URL for the API (e.g., “https://api.example.com”)
playwright – Optional Playwright instance (created if not provided)
default_headers – Headers to include in all requests
retry_config – Configuration for automatic retries (default: no retries)
rate_limit_config – Configuration for rate limiting (default: disabled)
enable_request_logging – Whether to log requests and responses
max_log_body_size – Maximum size for logged bodies (truncated if larger)
health_endpoint – Endpoint for health checks (default: /actuator/health)
- request_history: List[RequestLog]
- set_metadata(key: str, value: Any) None[source]
Set a metadata value for sharing state between tests.
- expect(value: Any, name: str = 'value') AssertionBuilder[source]
Start a fluent assertion.
Example
page.expect(user_id).exists().equals(123)
- classmethod from_config(config: ServiceConfig, playwright: Playwright | None = None, **kwargs) BasePage[source]
Create a BasePage from a ServiceConfig object.
- Parameters:
config – Service configuration object
playwright – Optional Playwright instance
**kwargs – Additional arguments passed to BasePage constructor
- Returns:
Configured BasePage instance
- setup() None[source]
Initialize the API context.
This method creates the Playwright APIRequestContext. It is called automatically before making requests if not already set up.
- teardown() None[source]
Clean up the API context and resources.
Always call this method when done to release resources properly.
- get(endpoint: str, headers: Dict[str, str] | None = None, params: Dict[str, Any] | None = None) APIResponse[source]
Perform a GET request.
- Parameters:
endpoint – API endpoint (e.g., “/users/123”)
headers – Optional request-specific headers
params – Optional query parameters
- Returns:
APIResponse object
- post(endpoint: str, data: Dict[str, Any] | str | None = None, json: Dict[str, Any] | None = None, headers: Dict[str, str] | None = None) APIResponse[source]
Perform a POST request.
- Parameters:
endpoint – API endpoint (e.g., “/users”)
data – Form data or dict (use either data or json, not both)
json – JSON payload (use either data or json, not both)
headers – Optional request-specific headers
- Returns:
APIResponse object
- put(endpoint: str, data: Dict[str, Any] | str | None = None, json: Dict[str, Any] | None = None, headers: Dict[str, str] | None = None) APIResponse[source]
Perform a PUT request.
- Parameters:
endpoint – API endpoint (e.g., “/users/123”)
data – Form data or dict (use either data or json, not both)
json – JSON payload (use either data or json, not both)
headers – Optional request-specific headers
- Returns:
APIResponse object
- delete(endpoint: str, data: Dict[str, Any] | str | None = None, json: Dict[str, Any] | None = None, headers: Dict[str, str] | None = None) APIResponse[source]
Perform a DELETE request.
- Parameters:
endpoint – API endpoint (e.g., “/users/123”)
data – Request body as dict or string (for non-standard REST APIs)
json – JSON payload (alternative to data)
headers – Optional request-specific headers
- Returns:
APIResponse object
- patch(endpoint: str, data: Dict[str, Any] | str | None = None, json: Dict[str, Any] | None = None, headers: Dict[str, str] | None = None) APIResponse[source]
Perform a PATCH request.
- Parameters:
endpoint – API endpoint (e.g., “/users/123”)
data – Form data or dict (use either data or json, not both)
json – JSON payload (use either data or json, not both)
headers – Optional request-specific headers
- Returns:
APIResponse object
- assert_status(response: APIResponse, expected_status: int | List[int], message: str | None = None) APIResponse[source]
Assert that response status matches expected.
- Parameters:
response – The API response to check
expected_status – Expected status code or list of acceptable codes
message – Optional custom error message
- Returns:
The response (for chaining)
- Raises:
BasePageError – If status doesn’t match
- assert_ok(response: APIResponse) APIResponse[source]
Assert that response status is 2xx (success).
- Parameters:
response – The API response to check
- Returns:
The response (for chaining)
- Raises:
BasePageError – If status is not 2xx
- assert_json(response: APIResponse, key: str | None = None) Any[source]
Parse response as JSON with optional key extraction.
- Parameters:
response – The API response to parse
key – Optional key to extract from JSON (e.g., “data.user.name”)
- Returns:
Parsed JSON data, or value at key if specified
- Raises:
BasePageError – If JSON parsing fails or key not found
- assert_header(response: APIResponse, header_name: str, expected_value: str | None = None) str[source]
Assert that response contains a specific header.
- Parameters:
response – The API response to check
header_name – Name of the header to check (case-insensitive)
expected_value – Optional expected value (if None, just checks existence)
- Returns:
The header value
- Raises:
BasePageError – If header not found or value doesn’t match
- assert_schema(response: APIResponse, schema: Dict[str, Any] | type, message: str | None = None) Dict[str, Any][source]
Assert that response matches a JSON schema or Pydantic model.
- Parameters:
response – The API response to validate
schema – JSON schema dict or Pydantic model class
message – Optional custom error message
- Returns:
The parsed JSON data
- Raises:
BasePageError – If validation fails
- get_response_text(response: APIResponse) str[source]
Get response text from Playwright APIResponse.
- Parameters:
response – The API response
- Returns:
Response body as string
- get_last_request() RequestLog | None[source]
Get the most recent request log entry.
- Returns:
The last RequestLog or None if no requests made
- get_request_stats() Dict[str, Any][source]
Get statistics about requests made.
- Returns:
total_requests: Total number of requests
successful_requests: Number of 2xx responses
failed_requests: Number of non-2xx responses
total_duration_ms: Total time spent in requests
average_duration_ms: Average request duration
status_distribution: Count of each status code
- Return type:
Dictionary with request statistics
- add_response_interceptor(interceptor: Callable[[APIResponse], None]) None[source]
Add a response interceptor.
Interceptors are called after each successful response. They receive the APIResponse object and can be used for: - Logging - Token extraction - Response transformation - Metrics collection
- Parameters:
interceptor – Callable that receives APIResponse
- check_health(timeout: int | None = None) ServiceHealth[source]
Check if the service is healthy.
Makes a request to the health endpoint and returns status.
- Parameters:
timeout – Request timeout in milliseconds (uses default if not specified)
- Returns:
ServiceHealth object with health status
- wait_for_healthy(timeout: int = 30, interval: float = 1.0, raise_on_timeout: bool = True) bool[source]
Wait for the service to become healthy.
Polls the health endpoint until it returns healthy or timeout is reached.
- Parameters:
timeout – Maximum time to wait in seconds
interval – Polling interval in seconds
raise_on_timeout – Whether to raise exception on timeout
- Returns:
True if service became healthy, False if timed out
- Raises:
BasePageError – If raise_on_timeout is True and service doesn’t become healthy
- classmethod wait_for_service(url: str, health_endpoint: str = '/actuator/health', timeout: int = 30, interval: float = 1.0) bool[source]
Wait for a service to become healthy without creating a persistent instance.
This is a class method that creates a temporary instance just for health checking.
- Parameters:
url – Service base URL
health_endpoint – Health check endpoint
timeout – Maximum wait time in seconds
interval – Polling interval
- Returns:
True if service became healthy
Example
>>> BasePage.wait_for_service("http://localhost:8081", timeout=60)