From 03d05afe067e0e73c834083dd524ca2488eccdac Mon Sep 17 00:00:00 2001 From: alexpetul Date: Wed, 22 May 2024 22:24:13 +0400 Subject: [PATCH 1/2] Add support for "const" keyword in JSON schema --- .../rest_framework/openapi.py | 6 ++++++ tests/test_openapi_schema.py | 21 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/django_custom_jsonfield/rest_framework/openapi.py b/django_custom_jsonfield/rest_framework/openapi.py index d4bbdb1..e0ca266 100644 --- a/django_custom_jsonfield/rest_framework/openapi.py +++ b/django_custom_jsonfield/rest_framework/openapi.py @@ -48,6 +48,12 @@ def build_basic_schema(self, schema: dict): def map_serializer_field(self, auto_schema, direction): schema = self.target.schema + if "const" in schema: + if schema["const"] is None: + return None + + return {"enum": [schema["const"]]} + try: if schema["type"] == "object": return self.build_object_schema(schema) diff --git a/tests/test_openapi_schema.py b/tests/test_openapi_schema.py index 849829e..035ceec 100644 --- a/tests/test_openapi_schema.py +++ b/tests/test_openapi_schema.py @@ -1,3 +1,4 @@ +from typing import Any from unittest.mock import Mock import pytest @@ -50,6 +51,26 @@ def test_map_serializer_field_ok(schema: dict): assert data == schema +@pytest.mark.parametrize( + "schema,expected", + [ + ({"const": 10}, {"enum": [10]}), # integer + ({"const": 10.00}, {"enum": [10.00]}), # float + ({"const": 10.00}, {"enum": [10.00]}), # bytes + ({"const": "string"}, {"enum": ["string"]}), # string + ({"const": True}, {"enum": [True]}), # bool + ({"const": None}, None), # none + ], +) +def test_map_serializer_field_const(schema: dict, expected: Any): + """Test basic types declared as const in JSON schema.""" + + json_field = CustomJSONField(schema=schema) + extension = CustomJSONFieldSerializerExtension(json_field) + data = extension.map_serializer_field(Mock(), "response") + assert data == expected + + @pytest.mark.parametrize( "schema", [ From dcca73d190637d830f4009622d642085b3cf4ac3 Mon Sep 17 00:00:00 2001 From: alexpetul Date: Wed, 22 May 2024 22:39:53 +0400 Subject: [PATCH 2/2] Add tests for const list and dict --- tests/test_openapi_schema.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/test_openapi_schema.py b/tests/test_openapi_schema.py index 035ceec..a1266c3 100644 --- a/tests/test_openapi_schema.py +++ b/tests/test_openapi_schema.py @@ -60,6 +60,8 @@ def test_map_serializer_field_ok(schema: dict): ({"const": "string"}, {"enum": ["string"]}), # string ({"const": True}, {"enum": [True]}), # bool ({"const": None}, None), # none + ({"const": {"k": "v", "k2": 10}}, {"enum": [{"k": "v", "k2": 10}]}), # dict + ({"const": [10, 20]}, {"enum": [[10, 20]]}), # list ], ) def test_map_serializer_field_const(schema: dict, expected: Any):