""" Tests for the FormDefinition creation endpoint. Endpoint: POST /wp-json/reservations/v1/form-definition Body: { "name": str, "definition": object } Run: pytest tests/Forms/test_form_definition.py -v Override the WordPress base URL: WP_BASE_URL=http://mysite.local pytest tests/Forms/test_form_definition.py -v """ import os import requests BASE_URL = os.environ.get("WP_BASE_URL", "http://localhost/wordpress") ENDPOINT = f"{BASE_URL}/wp-json/reservations/v1/form-definition" VALID_DEFINITION = { "email_key": "email", "elements": [ {"type": "text", "name": "name", "label": "Your name", "required": False}, {"type": "text", "name": "email", "label": "Your email", "required": True}, ] } def post_definition(payload: dict) -> requests.Response: return requests.post(ENDPOINT, json=payload) class TestFormDefinitionCreation: def test_can_create_form_definition(self): r = post_definition({"name": "Contact form", "definition": VALID_DEFINITION}) assert r.status_code == 201 body = r.json() assert "id" in body assert isinstance(body["id"], int) assert body["id"] > 0 def test_response_content_type_is_json(self): r = post_definition({"name": "Contact form", "definition": VALID_DEFINITION}) assert r.headers["Content-Type"].startswith("application/json") def test_each_creation_returns_a_new_id(self): r1 = post_definition({"name": "Form A", "definition": VALID_DEFINITION}) r2 = post_definition({"name": "Form B", "definition": VALID_DEFINITION}) assert r1.status_code == 201 assert r2.status_code == 201 assert r1.json()["id"] != r2.json()["id"] class TestFormDefinitionValidation: def test_missing_name_returns_400(self): r = post_definition({"definition": VALID_DEFINITION}) assert r.status_code == 400 def test_empty_name_returns_400(self): r = post_definition({"name": "", "definition": VALID_DEFINITION}) assert r.status_code == 400 def test_missing_definition_returns_400(self): r = post_definition({"name": "Contact form"}) assert r.status_code == 400 def test_definition_must_be_object_not_string(self): r = post_definition({"name": "Contact form", "definition": "not-an-object"}) assert r.status_code == 400 def test_missing_both_fields_returns_400(self): r = post_definition({}) assert r.status_code == 400 def test_definition_with_no_elements_is_accepted(self): r = post_definition({"name": "Empty form", "definition": {}}) assert r.status_code == 201 def test_definition_with_empty_elements_list_is_accepted(self): r = post_definition({"name": "Empty elements form", "definition": {"elements": []}}) assert r.status_code == 201