69 lines
2.2 KiB
Python
69 lines
2.2 KiB
Python
import asyncpg # type: ignore
|
|
import databases
|
|
import pytest
|
|
import sqlalchemy
|
|
|
|
import ormar.fields.constraints
|
|
from tests.settings import DATABASE_URL
|
|
|
|
database = databases.Database(DATABASE_URL, force_rollback=True)
|
|
metadata = sqlalchemy.MetaData()
|
|
|
|
|
|
class Product(ormar.Model):
|
|
class Meta:
|
|
tablename = "products"
|
|
metadata = metadata
|
|
database = database
|
|
constraints = [
|
|
ormar.fields.constraints.IndexColumns("company", "name", name="my_index"),
|
|
ormar.fields.constraints.IndexColumns("location", "company_type"),
|
|
]
|
|
|
|
id: int = ormar.Integer(primary_key=True)
|
|
name: str = ormar.String(max_length=100)
|
|
company: str = ormar.String(max_length=200)
|
|
location: str = ormar.String(max_length=200)
|
|
company_type: str = ormar.String(max_length=200)
|
|
|
|
|
|
@pytest.fixture(autouse=True, scope="module")
|
|
def create_test_database():
|
|
engine = sqlalchemy.create_engine(DATABASE_URL)
|
|
metadata.drop_all(engine)
|
|
metadata.create_all(engine)
|
|
yield
|
|
metadata.drop_all(engine)
|
|
|
|
|
|
def test_table_structure():
|
|
assert len(Product.Meta.table.indexes) > 0
|
|
indexes = sorted(
|
|
list(Product.Meta.table.indexes), key=lambda x: x.name, reverse=True
|
|
)
|
|
test_index = indexes[0]
|
|
assert test_index.name == "my_index"
|
|
assert [col.name for col in test_index.columns] == ["company", "name"]
|
|
|
|
test_index = indexes[1]
|
|
assert test_index.name == "ix_products_location_company_type"
|
|
assert [col.name for col in test_index.columns] == ["location", "company_type"]
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_index_is_not_unique():
|
|
async with database:
|
|
async with database.transaction(force_rollback=True):
|
|
await Product.objects.create(
|
|
name="Cookies", company="Nestle", location="A", company_type="B"
|
|
)
|
|
await Product.objects.create(
|
|
name="Mars", company="Mars", location="B", company_type="Z"
|
|
)
|
|
await Product.objects.create(
|
|
name="Mars", company="Nestle", location="C", company_type="X"
|
|
)
|
|
await Product.objects.create(
|
|
name="Mars", company="Mars", location="D", company_type="Y"
|
|
)
|