Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions tests/schemas/test_openapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,6 @@ class View(generics.GenericAPIView):
inspector.view = view

request_body = inspector.get_request_body(path, method)
print(request_body)
assert request_body['content']['application/json']['schema']['$ref'] == '#/components/schemas/Item'

components = inspector.get_components(path, method)
Expand Down Expand Up @@ -928,7 +927,6 @@ def test_repeat_operation_ids(self):
request = create_request('/')
schema = generator.get_schema(request=request)
schema_str = str(schema)
print(schema_str)
assert schema_str.count("operationId") == 2
assert schema_str.count("newExample") == 1
assert schema_str.count("oldExample") == 1
Expand All @@ -948,7 +946,6 @@ def test_duplicate_operation_id(self):

assert len(w) == 1
assert issubclass(w[-1].category, UserWarning)
print(str(w[-1].message))
assert 'You have a duplicated operationId' in str(w[-1].message)

def test_operation_id_viewset(self):
Expand All @@ -960,7 +957,6 @@ def test_operation_id_viewset(self):

request = create_request('/')
schema = generator.get_schema(request=request)
print(schema)
assert schema['paths']['/account/']['get']['operationId'] == 'listExampleViewSets'
assert schema['paths']['/account/']['post']['operationId'] == 'createExampleViewSet'
assert schema['paths']['/account/{id}/']['get']['operationId'] == 'retrieveExampleViewSet'
Expand Down Expand Up @@ -1284,8 +1280,6 @@ def test_serializer_model(self):
request = create_request('/')
schema = generator.get_schema(request=request)

print(schema)

assert 'components' in schema
assert 'schemas' in schema['components']
assert 'ExampleModel' in schema['components']['schemas']
Expand All @@ -1299,8 +1293,6 @@ def test_authtoken_serializer(self):
request = create_request('/')
schema = generator.get_schema(request=request)

print(schema)

route = schema['paths']['/api-token-auth/']['post']
body_schema = route['requestBody']['content']['application/json']['schema']

Expand All @@ -1327,7 +1319,6 @@ def test_component_name(self):
request = create_request('/')
schema = generator.get_schema(request=request)

print(schema)
assert 'components' in schema
assert 'schemas' in schema['components']
assert 'Ulysses' in schema['components']['schemas']
Expand Down
39 changes: 33 additions & 6 deletions tests/test_model_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -168,13 +168,39 @@ class Meta:
model = RegularFieldsModel
fields = '__all__'

# Cross-platform path handling for regex matching against repr() output
#
# Challenge: repr() output escapes backslashes, so Windows paths like
# C:\Users become 'C:\\Users' in the repr string. To match \\ in regex,
# we need \\\\ in the pattern.
#
# Why re.escape() doesn't work for Windows:
# - re.escape(r'C:\Users') → 'C:\\Users' (matches single \)
# - But repr() shows 'C:\\Users' (double \\)
# - We need pattern 'C:\\\\Users' (to match double \\)
#
# Testing on Windows confirms:
# >>> path = r'C:\Users\Temp'
# >>> re.search(re.escape(path), repr(path))
# None # Fails
# >>> re.search(path.replace('\\', r'\\\\'), repr(path))
# <re.Match object...> # Works
#
# For Unix paths (no backslashes), re.escape() works correctly.
temp_path = tempfile.gettempdir()
if '\\' in temp_path:
# Windows: Manual replacement needed for repr() matching
escaped_temp_path = temp_path.replace('\\', r'\\\\')
else:
# Unix: re.escape() handles any special regex characters
escaped_temp_path = re.escape(temp_path)
expected = dedent(r"""
TestSerializer\(\):
auto_field = IntegerField\(read_only=True\)
big_integer_field = IntegerField\(.*\)
boolean_field = BooleanField\(required=False\)
char_field = CharField\(max_length=100\)
comma_separated_integer_field = CharField\(max_length=100, validators=\[<django.core.validators.RegexValidator object>\]\)
comma_separated_integer_field = CharField\(max_length=100, validators=\[<django.core.validators.RegexValidator object.*>\]\)
date_field = DateField\(\)
datetime_field = DateTimeField\(\)
decimal_field = DecimalField\(decimal_places=1, max_digits=3\)
Expand All @@ -186,14 +212,15 @@ class Meta:
positive_small_integer_field = IntegerField\(.*\)
slug_field = SlugField\(allow_unicode=False, max_length=100\)
small_integer_field = IntegerField\(.*\)
text_field = CharField\(max_length=100, style={'base_template': 'textarea.html'}\)
text_field = CharField\(max_length=100, style=\{.*\}\)
file_field = FileField\(max_length=100\)
time_field = TimeField\(\)
url_field = URLField\(max_length=100\)
custom_field = ModelField\(model_field=<tests.test_model_serializer.CustomField: custom_field>\)
file_path_field = FilePathField\(path=%r\)
""" % tempfile.gettempdir())
assert re.search(expected, repr(TestSerializer())) is not None
custom_field = ModelField\(model_field=<.*CustomField: custom_field>\)
file_path_field = FilePathField\(path='%s'\)
""") % escaped_temp_path

assert re.search(expected, repr(TestSerializer()), re.DOTALL) is not None

def test_field_options(self):
class TestSerializer(serializers.ModelSerializer):
Expand Down