Description: * Fixed github actions; * Removed requirements.txt; * Fixed CONTRIBUTING.md; * Fixed black and flake8. Signed-off-by: Pavel <win10@list.ru>
213 lines
6.5 KiB
Python
213 lines
6.5 KiB
Python
from typing import List, Optional
|
|
|
|
import databases
|
|
import sqlalchemy
|
|
|
|
import ormar
|
|
from ormar.models.excludable import ExcludableItems
|
|
from tests.settings import DATABASE_URL
|
|
|
|
database = databases.Database(DATABASE_URL, force_rollback=True)
|
|
metadata = sqlalchemy.MetaData()
|
|
|
|
|
|
class BaseMeta(ormar.ModelMeta):
|
|
database = database
|
|
metadata = metadata
|
|
|
|
|
|
class NickNames(ormar.Model):
|
|
class Meta(BaseMeta):
|
|
tablename = "nicks"
|
|
|
|
id: int = ormar.Integer(primary_key=True)
|
|
name: str = ormar.String(max_length=100, nullable=False, name="hq_name")
|
|
is_lame: bool = ormar.Boolean(nullable=True)
|
|
|
|
|
|
class NicksHq(ormar.Model):
|
|
class Meta(BaseMeta):
|
|
tablename = "nicks_x_hq"
|
|
|
|
|
|
class HQ(ormar.Model):
|
|
class Meta(BaseMeta):
|
|
pass
|
|
|
|
id: int = ormar.Integer(primary_key=True)
|
|
name: str = ormar.String(max_length=100, nullable=False, name="hq_name")
|
|
nicks: List[NickNames] = ormar.ManyToMany(NickNames, through=NicksHq)
|
|
|
|
|
|
class Company(ormar.Model):
|
|
class Meta(BaseMeta):
|
|
tablename = "companies"
|
|
|
|
id: int = ormar.Integer(primary_key=True)
|
|
name: str = ormar.String(max_length=100, nullable=False, name="company_name")
|
|
founded: int = ormar.Integer(nullable=True)
|
|
hq: HQ = ormar.ForeignKey(HQ)
|
|
|
|
|
|
class Car(ormar.Model):
|
|
class Meta(BaseMeta):
|
|
pass
|
|
|
|
id: int = ormar.Integer(primary_key=True)
|
|
manufacturer: Optional[Company] = ormar.ForeignKey(Company)
|
|
name: str = ormar.String(max_length=100)
|
|
year: int = ormar.Integer(nullable=True)
|
|
gearbox_type: str = ormar.String(max_length=20, nullable=True)
|
|
gears: int = ormar.Integer(nullable=True)
|
|
aircon_type: str = ormar.String(max_length=20, nullable=True)
|
|
|
|
|
|
def compare_results(excludable):
|
|
car_excludable = excludable.get(Car)
|
|
assert car_excludable.exclude == {"year", "gearbox_type", "gears", "aircon_type"}
|
|
assert car_excludable.include == set()
|
|
|
|
assert car_excludable.is_excluded("year")
|
|
|
|
alias = Company.Meta.alias_manager.resolve_relation_alias(Car, "manufacturer")
|
|
manu_excludable = excludable.get(Company, alias=alias)
|
|
assert manu_excludable.exclude == {"founded"}
|
|
assert manu_excludable.include == set()
|
|
|
|
assert manu_excludable.is_excluded("founded")
|
|
|
|
|
|
def compare_results_include(excludable):
|
|
manager = Company.Meta.alias_manager
|
|
car_excludable = excludable.get(Car)
|
|
assert car_excludable.include == {"id", "name"}
|
|
assert car_excludable.exclude == set()
|
|
|
|
assert car_excludable.is_included("name")
|
|
assert not car_excludable.is_included("gears")
|
|
|
|
alias = manager.resolve_relation_alias(Car, "manufacturer")
|
|
manu_excludable = excludable.get(Company, alias=alias)
|
|
assert manu_excludable.include == {"name"}
|
|
assert manu_excludable.exclude == set()
|
|
|
|
assert manu_excludable.is_included("name")
|
|
assert not manu_excludable.is_included("founded")
|
|
|
|
alias = manager.resolve_relation_alias(Company, "hq")
|
|
hq_excludable = excludable.get(HQ, alias=alias)
|
|
assert hq_excludable.include == {"name"}
|
|
assert hq_excludable.exclude == set()
|
|
|
|
alias = manager.resolve_relation_alias(NicksHq, "nicknames")
|
|
nick_excludable = excludable.get(NickNames, alias=alias)
|
|
assert nick_excludable.include == {"name"}
|
|
assert nick_excludable.exclude == set()
|
|
|
|
|
|
def test_excluding_fields_from_list():
|
|
fields = ["gearbox_type", "gears", "aircon_type", "year", "manufacturer__founded"]
|
|
excludable = ExcludableItems()
|
|
excludable.build(items=fields, model_cls=Car, is_exclude=True)
|
|
compare_results(excludable)
|
|
|
|
|
|
def test_excluding_fields_from_dict():
|
|
fields = {
|
|
"gearbox_type": ...,
|
|
"gears": ...,
|
|
"aircon_type": ...,
|
|
"year": ...,
|
|
"manufacturer": {"founded": ...},
|
|
}
|
|
excludable = ExcludableItems()
|
|
excludable.build(items=fields, model_cls=Car, is_exclude=True)
|
|
compare_results(excludable)
|
|
|
|
|
|
def test_excluding_fields_from_dict_with_set():
|
|
fields = {
|
|
"gearbox_type": ...,
|
|
"gears": ...,
|
|
"aircon_type": ...,
|
|
"year": ...,
|
|
"manufacturer": {"founded"},
|
|
}
|
|
excludable = ExcludableItems()
|
|
excludable.build(items=fields, model_cls=Car, is_exclude=True)
|
|
compare_results(excludable)
|
|
|
|
|
|
def test_gradual_build_from_lists():
|
|
fields_col = [
|
|
"year",
|
|
["gearbox_type", "gears"],
|
|
"aircon_type",
|
|
["manufacturer__founded"],
|
|
]
|
|
excludable = ExcludableItems()
|
|
for fields in fields_col:
|
|
excludable.build(items=fields, model_cls=Car, is_exclude=True)
|
|
compare_results(excludable)
|
|
|
|
|
|
def test_nested_includes():
|
|
fields = [
|
|
"id",
|
|
"name",
|
|
"manufacturer__name",
|
|
"manufacturer__hq__name",
|
|
"manufacturer__hq__nicks__name",
|
|
]
|
|
excludable = ExcludableItems()
|
|
excludable.build(items=fields, model_cls=Car, is_exclude=False)
|
|
compare_results_include(excludable)
|
|
|
|
|
|
def test_nested_includes_from_dict():
|
|
fields = {
|
|
"id": ...,
|
|
"name": ...,
|
|
"manufacturer": {"name": ..., "hq": {"name": ..., "nicks": {"name": ...}}},
|
|
}
|
|
excludable = ExcludableItems()
|
|
excludable.build(items=fields, model_cls=Car, is_exclude=False)
|
|
compare_results_include(excludable)
|
|
|
|
|
|
def test_nested_includes_from_dict_with_set():
|
|
fields = {
|
|
"id": ...,
|
|
"name": ...,
|
|
"manufacturer": {"name": ..., "hq": {"name": ..., "nicks": {"name"}}},
|
|
}
|
|
excludable = ExcludableItems()
|
|
excludable.build(items=fields, model_cls=Car, is_exclude=False)
|
|
compare_results_include(excludable)
|
|
|
|
|
|
def test_includes_and_excludes_combo():
|
|
fields_inc1 = ["id", "name", "year", "gearbox_type", "gears"]
|
|
fields_inc2 = {"manufacturer": {"name"}}
|
|
fields_exc1 = {"manufacturer__founded"}
|
|
fields_exc2 = "aircon_type"
|
|
excludable = ExcludableItems()
|
|
excludable.build(items=fields_inc1, model_cls=Car, is_exclude=False)
|
|
excludable.build(items=fields_inc2, model_cls=Car, is_exclude=False)
|
|
excludable.build(items=fields_exc1, model_cls=Car, is_exclude=True)
|
|
excludable.build(items=fields_exc2, model_cls=Car, is_exclude=True)
|
|
|
|
car_excludable = excludable.get(Car)
|
|
assert car_excludable.include == {"id", "name", "year", "gearbox_type", "gears"}
|
|
assert car_excludable.exclude == {"aircon_type"}
|
|
|
|
assert car_excludable.is_excluded("aircon_type")
|
|
assert car_excludable.is_included("name")
|
|
|
|
alias = Company.Meta.alias_manager.resolve_relation_alias(Car, "manufacturer")
|
|
manu_excludable = excludable.get(Company, alias=alias)
|
|
assert manu_excludable.include == {"name"}
|
|
assert manu_excludable.exclude == {"founded"}
|
|
|
|
assert manu_excludable.is_excluded("founded")
|