1. import requests
  2. import json
  3. def dry_run_api(url, method='GET', headers=None, data=None, params=None, expected_status_code=None, expected_response_keys=None):
  4. """
  5. Performs a dry-run API call and asserts conditions.
  6. Args:
  7. url (str): The API endpoint URL.
  8. method (str): The HTTP method (GET, POST, PUT, DELETE, etc.). Defaults to GET.
  9. headers (dict): HTTP headers to include in the request. Defaults to None.
  10. data (dict): JSON data to send in the request body (for POST, PUT, etc.). Defaults to None.
  11. params (dict): Query parameters to include in the URL. Defaults to None.
  12. expected_status_code (int): The expected HTTP status code. Defaults to None.
  13. expected_response_keys (list): List of keys expected in the response. Defaults to None.
  14. Raises:
  15. AssertionError: If the API call fails to meet the specified conditions.
  16. """
  17. try:
  18. response = requests.request(method, url, headers=headers, data=json.dumps(data) if data else None, params=params) # Serialize data to JSON if provided
  19. response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
  20. assert response.status_code == expected_status_code, f"Expected status code {expected_status_code}, but got {response.status_code}"
  21. if expected_response_keys:
  22. try:
  23. response_json = response.json()
  24. assert all(key in response_json for key in expected_response_keys), f"Missing expected keys: {expected_response_keys}"
  25. except json.JSONDecodeError:
  26. raise AssertionError("Response is not valid JSON.")
  27. except requests.exceptions.RequestException as e:
  28. raise AssertionError(f"API call failed: {e}")
  29. if __name__ == '__main__':
  30. # Example Usage (Replace with your API endpoint and conditions)
  31. test_url = "https://jsonplaceholder.typicode.com/posts"
  32. # Test 1: GET request, check status code and presence of 'id', 'title', and 'body'
  33. dry_run_api(test_url, method='GET', expected_status_code=200, expected_response_keys=['id', 'title', 'body'])
  34. # Test 2: POST request, check status code and presence of 'id'
  35. post_url = "https://jsonplaceholder.typicode.com/posts"
  36. post_data = {"title": "foo", "body": "bar", "userId": 1}
  37. dry_run_api(post_url, method='POST', data=post_data, expected_status_code=201, expected_response_keys=['id'])
  38. # Test 3: GET request with params
  39. params_url = "https://jsonplaceholder.typicode.com/posts?userId=1"
  40. dry_run_api(params_url, method='GET', params={'userId': 1}, expected_status_code=200, expected_response_keys=['id', 'title', 'body'])
  41. #Test 4: Failing test - incorrect status code
  42. failing_url = "https://httpstat.us/404"
  43. try:
  44. dry_run_api(failing_url, method='GET', expected_status_code=200)
  45. except AssertionError as e:
  46. print(f"Test failed as expected: {e}")

Add your comment