""" 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)