import requests
import json
def dry_run_api(url, method='GET', headers=None, data=None, params=None, expected_status_code=None, expected_response_keys=None):
"""
Performs a dry-run API call and asserts conditions.
Args:
url (str): The API endpoint URL.
method (str): The HTTP method (GET, POST, PUT, DELETE, etc.). Defaults to GET.
headers (dict): HTTP headers to include in the request. Defaults to None.
data (dict): JSON data to send in the request body (for POST, PUT, etc.). Defaults to None.
params (dict): Query parameters to include in the URL. Defaults to None.
expected_status_code (int): The expected HTTP status code. Defaults to None.
expected_response_keys (list): List of keys expected in the response. Defaults to None.
Raises:
AssertionError: If the API call fails to meet the specified conditions.
"""
try:
response = requests.request(method, url, headers=headers, data=json.dumps(data) if data else None, params=params) # Serialize data to JSON if provided
response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
assert response.status_code == expected_status_code, f"Expected status code {expected_status_code}, but got {response.status_code}"
if expected_response_keys:
try:
response_json = response.json()
assert all(key in response_json for key in expected_response_keys), f"Missing expected keys: {expected_response_keys}"
except json.JSONDecodeError:
raise AssertionError("Response is not valid JSON.")
except requests.exceptions.RequestException as e:
raise AssertionError(f"API call failed: {e}")
if __name__ == '__main__':
# Example Usage (Replace with your API endpoint and conditions)
test_url = "https://jsonplaceholder.typicode.com/posts"
# Test 1: GET request, check status code and presence of 'id', 'title', and 'body'
dry_run_api(test_url, method='GET', expected_status_code=200, expected_response_keys=['id', 'title', 'body'])
# Test 2: POST request, check status code and presence of 'id'
post_url = "https://jsonplaceholder.typicode.com/posts"
post_data = {"title": "foo", "body": "bar", "userId": 1}
dry_run_api(post_url, method='POST', data=post_data, expected_status_code=201, expected_response_keys=['id'])
# Test 3: GET request with params
params_url = "https://jsonplaceholder.typicode.com/posts?userId=1"
dry_run_api(params_url, method='GET', params={'userId': 1}, expected_status_code=200, expected_response_keys=['id', 'title', 'body'])
#Test 4: Failing test - incorrect status code
failing_url = "https://httpstat.us/404"
try:
dry_run_api(failing_url, method='GET', expected_status_code=200)
except AssertionError as e:
print(f"Test failed as expected: {e}")
Add your comment