106 lines
3.3 KiB
Python
106 lines
3.3 KiB
Python
|
|
"""
|
||
|
|
Form submission API tests.
|
||
|
|
|
||
|
|
Install dependencies:
|
||
|
|
pip install pytest requests
|
||
|
|
|
||
|
|
Run:
|
||
|
|
pytest tests/Forms/FormTests.py -v
|
||
|
|
|
||
|
|
The base URL is read from the WP_BASE_URL environment variable,
|
||
|
|
defaulting to http://localhost/wordpress.
|
||
|
|
"""
|
||
|
|
|
||
|
|
import os
|
||
|
|
import pytest
|
||
|
|
import requests
|
||
|
|
|
||
|
|
BASE_URL = os.environ.get("WP_BASE_URL", "http://localhost/wordpress")
|
||
|
|
FORM_ENDPOINT = f"{BASE_URL}/wp-json/reservations/v1/form/1"
|
||
|
|
|
||
|
|
|
||
|
|
def post_form(data: dict) -> requests.Response:
|
||
|
|
return requests.post(FORM_ENDPOINT, json=data)
|
||
|
|
|
||
|
|
|
||
|
|
def find_error(errors: list, element: str) -> dict | None:
|
||
|
|
return next((e for e in errors if e.get("element") == element), None)
|
||
|
|
|
||
|
|
|
||
|
|
class TestFormResponseShape:
|
||
|
|
def test_response_is_json(self):
|
||
|
|
r = post_form({})
|
||
|
|
assert r.headers["Content-Type"].startswith("application/json")
|
||
|
|
|
||
|
|
def test_response_has_success_field(self):
|
||
|
|
r = post_form({})
|
||
|
|
body = r.json()
|
||
|
|
assert "success" in body
|
||
|
|
|
||
|
|
def test_failed_response_has_errors_list(self):
|
||
|
|
r = post_form({})
|
||
|
|
body = r.json()
|
||
|
|
assert body["success"] is False
|
||
|
|
assert isinstance(body["errors"], list)
|
||
|
|
|
||
|
|
def test_error_object_has_required_fields(self):
|
||
|
|
r = post_form({})
|
||
|
|
errors = r.json()["errors"]
|
||
|
|
assert len(errors) > 0
|
||
|
|
for error in errors:
|
||
|
|
assert "element" in error
|
||
|
|
assert "code" in error
|
||
|
|
assert "message" in error
|
||
|
|
|
||
|
|
|
||
|
|
class TestEmailValidation:
|
||
|
|
def test_missing_email_returns_required_error(self):
|
||
|
|
r = post_form({"name": "John"})
|
||
|
|
errors = r.json()["errors"]
|
||
|
|
email_error = find_error(errors, "email")
|
||
|
|
assert email_error is not None
|
||
|
|
assert email_error["code"] == "required"
|
||
|
|
|
||
|
|
def test_invalid_email_returns_invalid_email_error(self):
|
||
|
|
r = post_form({"email": "not-an-email", "name": "John"})
|
||
|
|
errors = r.json()["errors"]
|
||
|
|
email_error = find_error(errors, "email")
|
||
|
|
assert email_error is not None
|
||
|
|
assert email_error["code"] == "invalid_email"
|
||
|
|
|
||
|
|
def test_empty_email_returns_required_error(self):
|
||
|
|
r = post_form({"email": "", "name": "John"})
|
||
|
|
errors = r.json()["errors"]
|
||
|
|
email_error = find_error(errors, "email")
|
||
|
|
assert email_error is not None
|
||
|
|
assert email_error["code"] == "required"
|
||
|
|
|
||
|
|
def test_valid_email_produces_no_email_error(self):
|
||
|
|
r = post_form({"email": "valid@example.com", "name": "John"})
|
||
|
|
errors = r.json().get("errors", [])
|
||
|
|
email_error = find_error(errors, "email")
|
||
|
|
assert email_error is None
|
||
|
|
|
||
|
|
|
||
|
|
class TestNameField:
|
||
|
|
def test_missing_name_produces_no_name_error(self):
|
||
|
|
r = post_form({"email": "valid@example.com"})
|
||
|
|
errors = r.json().get("errors", [])
|
||
|
|
name_error = find_error(errors, "name")
|
||
|
|
assert name_error is None
|
||
|
|
|
||
|
|
def test_empty_name_produces_no_name_error(self):
|
||
|
|
r = post_form({"email": "valid@example.com", "name": ""})
|
||
|
|
errors = r.json().get("errors", [])
|
||
|
|
name_error = find_error(errors, "name")
|
||
|
|
assert name_error is None
|
||
|
|
|
||
|
|
class TestFormDefinition:
|
||
|
|
def test_form_definition_returns_correct_fields(self):
|
||
|
|
r = post_form({})
|
||
|
|
body = r.json()
|
||
|
|
assert "success" in body
|
||
|
|
assert "definition" in body
|
||
|
|
definition = body["definition"]
|
||
|
|
assert isinstance(definition, dict)
|