test relation inheritance

This commit is contained in:
collerek
2020-12-15 17:14:58 +01:00
parent 3cb3afb042
commit 4de030b5e0
4 changed files with 167 additions and 89 deletions

View File

@ -82,6 +82,44 @@ class Subject(DateFieldsModel):
category: Optional[Category] = ormar.ForeignKey(Category)
class Person(ormar.Model):
class Meta:
metadata = metadata
database = db
id: int = ormar.Integer(primary_key=True)
name: str = ormar.String(max_length=100)
class Car(ormar.Model):
class Meta:
abstract = True
metadata = metadata
database = db
id: int = ormar.Integer(primary_key=True)
name: str = ormar.String(max_length=50)
owner: Person = ormar.ForeignKey(Person)
co_owner: Person = ormar.ForeignKey(Person, related_name='coowned')
class Truck(Car):
class Meta:
metadata = metadata
database = db
max_capacity: int = ormar.Integer()
class Bus(Car):
class Meta:
tablename = 'buses'
metadata = metadata
database = db
max_persons: int = ormar.Integer()
@pytest.fixture(autouse=True, scope="module")
def create_test_database():
metadata.create_all(engine)
@ -96,7 +134,6 @@ def test_init_of_abstract_model():
def test_field_redefining_raises_error():
with pytest.raises(ModelDefinitionError):
class WrongField(DateFieldsModel): # pragma: no cover
class Meta(ormar.ModelMeta):
tablename = "wrongs"
@ -109,7 +146,6 @@ def test_field_redefining_raises_error():
def test_model_subclassing_non_abstract_raises_error():
with pytest.raises(ModelDefinitionError):
class WrongField2(DateFieldsModelNoSubclass): # pragma: no cover
class Meta(ormar.ModelMeta):
tablename = "wrongs"
@ -127,7 +163,7 @@ def test_params_are_inherited():
def round_date_to_seconds(
date: datetime.datetime,
date: datetime.datetime,
) -> datetime.datetime: # pragma: no cover
if date.microsecond >= 500000:
date = date + datetime.timedelta(seconds=1)
@ -170,9 +206,9 @@ async def test_fields_inherited_from_mixin():
sub2 = (
await Subject.objects.select_related("category")
.order_by("-created_date")
.exclude_fields("updated_date")
.get()
.order_by("-created_date")
.exclude_fields("updated_date")
.get()
)
assert round_date_to_seconds(sub2.created_date) == round_date_to_seconds(
sub.created_date
@ -187,9 +223,9 @@ async def test_fields_inherited_from_mixin():
sub3 = (
await Subject.objects.prefetch_related("category")
.order_by("-created_date")
.exclude_fields({"updated_date": ..., "category": {"updated_date"}})
.get()
.order_by("-created_date")
.exclude_fields({"updated_date": ..., "category": {"updated_date"}})
.get()
)
assert round_date_to_seconds(sub3.created_date) == round_date_to_seconds(
sub.created_date
@ -201,3 +237,21 @@ async def test_fields_inherited_from_mixin():
assert sub3.updated_date is None
assert sub3.category.created_by == "Sam"
assert sub3.category.updated_by == cat.updated_by
@pytest.mark.asyncio
async def test_inheritance_with_relation():
async with db:
async with db.transaction(force_rollback=True):
sam = await Person(name='Sam').save()
joe = await Person(name='Joe').save()
await Truck(name='Shelby wanna be', max_capacity=1400, owner=sam, co_owner=joe).save()
shelby = await Truck.objects.select_related(['owner', 'co_owner']).get()
assert shelby.name == 'Shelby wanna be'
assert shelby.owner.name == 'Sam'
assert shelby.co_owner.name == 'Joe'
joe_check = await Person.objects.select_related('coowned_trucks').get(name='Joe')
assert joe_check.pk == joe.pk
assert joe_check.coowned_trucks[0] == shelby