Skip to content

Commit

Permalink
Prepare test cases for RootModel issue
Browse files Browse the repository at this point in the history
  • Loading branch information
surenkov committed Mar 8, 2024
1 parent 8b987e6 commit 23701fb
Show file tree
Hide file tree
Showing 6 changed files with 98 additions and 1 deletion.
1 change: 1 addition & 0 deletions tests/settings/django_test_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"django.contrib.admin",
"tests.sample_app",
"tests.test_app",
]
Expand Down
18 changes: 18 additions & 0 deletions tests/test_app/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from django.contrib import admin

from . import models


@admin.register(models.SampleModel)
class SampleModelAdmin(admin.ModelAdmin):
pass


@admin.register(models.SampleForwardRefModel)
class SampleForwardRefModelAdmin(admin.ModelAdmin):
pass


@admin.register(models.ExampleModel)
class ExampleModelAdmin(admin.ModelAdmin):
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Generated by Django 5.0.1 on 2024-03-08 14:35

import django.core.serializers.json
import django_pydantic_field.compat.django
import django_pydantic_field.fields
import tests.test_app.models
import types
import typing
from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("test_app", "0002_examplemodel"),
]

operations = [
migrations.AddField(
model_name="samplemodel",
name="sample_null_root_schema",
field=django_pydantic_field.fields.PydanticSchemaField(
config=None,
default=None,
encoder=django.core.serializers.json.DjangoJSONEncoder,
null=True,
schema=django_pydantic_field.compat.django.GenericContainer(
typing.Union,
(
tests.test_app.models.RootSchema,
types.NoneType,
),
),
),
),
migrations.AddField(
model_name="samplemodel",
name="sample_root_schema",
field=django_pydantic_field.fields.PydanticSchemaField(
config=None,
default=[],
encoder=django.core.serializers.json.DjangoJSONEncoder,
schema=tests.test_app.models.RootSchema,
),
),
]
7 changes: 6 additions & 1 deletion tests/test_app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,16 @@ class FrozenInnerSchema(InnerSchema):
model_config = pydantic.ConfigDict({"frozen": True})


class RootSchema(pydantic.RootModel):
root: list[str]


class SampleModel(models.Model):
sample_field: InnerSchema = SchemaField()
sample_list: t.List[InnerSchema] = SchemaField()
sample_seq: t.Sequence[InnerSchema] = SchemaField(schema=t.List[InnerSchema], default=list)
sample_root_schema: RootSchema = SchemaField(default=[])
sample_null_root_schema: t.Optional[RootSchema] = SchemaField(null=True, default=None)

class Meta:
app_label = "test_app"
Expand All @@ -35,6 +41,5 @@ class SampleSchema(pydantic.BaseModel):
class ExampleSchema(pydantic.BaseModel):
count: int


class ExampleModel(models.Model):
example_field: ExampleSchema = SchemaField(default=ExampleSchema(count=1))
19 changes: 19 additions & 0 deletions tests/test_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@
from .test_app.models import SampleForwardRefModel, SampleModel, SampleSchema


class SampleRootModel(pydantic.RootModel):
root: list[str]


AnnotatedSampleRootModel = pydantic.RootModel[list[str]]


@pytest.mark.parametrize(
"exported_primitive_name",
["SchemaField"],
Expand Down Expand Up @@ -98,6 +105,18 @@ class Meta:
default={"stub_str": "abc", "stub_list": [date(2022, 7, 1)]},
),
fields.PydanticSchemaField(schema=ty.Optional[InnerSchema], null=True, default=None),
fields.PydanticSchemaField(schema=SampleRootModel, default=[""]),
fields.PydanticSchemaField(schema=AnnotatedSampleRootModel, default=[""]),
fields.PydanticSchemaField(schema=SampleRootModel, default=SampleRootModel([])),
fields.PydanticSchemaField(schema=AnnotatedSampleRootModel, default=AnnotatedSampleRootModel([])),
fields.PydanticSchemaField(schema=ty.Optional[SampleRootModel], default=[""]),
fields.PydanticSchemaField(schema=ty.Optional[AnnotatedSampleRootModel], default=[""]),
fields.PydanticSchemaField(schema=ty.Optional[SampleRootModel], default=SampleRootModel([])),
fields.PydanticSchemaField(schema=ty.Optional[AnnotatedSampleRootModel], default=AnnotatedSampleRootModel([])),
fields.PydanticSchemaField(schema=ty.Optional[SampleRootModel], null=True, default=None),
fields.PydanticSchemaField(schema=ty.Optional[AnnotatedSampleRootModel], null=True, default=None),
fields.PydanticSchemaField(schema=ty.Optional[SampleRootModel], null=True, blank=True),
fields.PydanticSchemaField(schema=ty.Optional[AnnotatedSampleRootModel], null=True, blank=True),
pytest.param(
fields.PydanticSchemaField(
schema=InnerSchema,
Expand Down
8 changes: 8 additions & 0 deletions tests/test_model_admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import pytest


def test_model_admin_not_failing():
try:
from .test_app import admin
except:
pytest.fail("Django admin handlers should not fail")

0 comments on commit 23701fb

Please sign in to comment.