"""Production schema checks must describe endpoints without guessing string types.""" from io import StringIO import pytest import yaml from django.core.management import call_command @pytest.mark.django_db def test_openapi_schema_validates_without_warnings(): output = StringIO() call_command( "spectacular", validate=True, fail_on_warn=True, stdout=output, stderr=StringIO(), ) schema = yaml.safe_load(output.getvalue()) components = schema["components"]["schemas"] assert components["Project"]["properties"]["can_manage"]["type"] == "boolean" assert components["Skill"]["properties"]["experience"]["type"] == "integer" assert components["Skill"]["properties"]["next_rank"]["nullable"] is True assert components["Employee"]["properties"]["skills"]["type"] == "array" assert ( components["ChatUserSettings"]["properties"]["notifications_enabled"]["type"] == "boolean" ) assert "DayResponse" in components assert "AnalyticsOptionsResponse" in components assert "PushReplyResponse" in components attachment_response = schema["paths"]["/api/v1/requests/{id}/attachment/download/"][ "get" ]["responses"]["200"] assert attachment_response["content"]["application/octet-stream"]["schema"] == { "type": "string", "format": "binary", } for suffix, content_type in [ ("", "application/octet-stream"), ("thumbnail/", "image/png"), ]: operation = schema["paths"][ f"/api/v1/communications/messages/{{id}}/attachments/{{attachment_id}}/{suffix}" ]["get"] assert operation["responses"]["200"]["content"][content_type]["schema"] == { "type": "string", "format": "binary", } assert ( next(p for p in operation["parameters"] if p["name"] == "attachment_id")[ "schema" ]["type"] == "integer" )