From 04bbe13c09799cea8193439a4bd44c8bb7b14bee Mon Sep 17 00:00:00 2001 From: collerek Date: Mon, 1 Feb 2021 11:30:59 +0100 Subject: [PATCH] test cascade --- .github/workflows/test-package.yml | 8 ++-- tests/test_cascades.py | 73 ++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 tests/test_cascades.py diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml index 5b0ce2f..4d92a32 100644 --- a/.github/workflows/test-package.yml +++ b/.github/workflows/test-package.yml @@ -51,10 +51,6 @@ jobs: run: | python -m pip install --upgrade pip if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - - name: Run sqlite - env: - DATABASE_URL: "sqlite:///testsuite" - run: bash scripts/test.sh - name: Run postgres env: DATABASE_URL: "postgresql://username:password@localhost:5432/testsuite" @@ -63,6 +59,10 @@ jobs: env: DATABASE_URL: "mysql://username:password@127.0.0.1:3306/testsuite" run: bash scripts/test.sh + - name: Run sqlite + env: + DATABASE_URL: "sqlite:///testsuite" + run: bash scripts/test.sh - run: mypy --config-file mypy.ini ormar tests - name: Upload coverage uses: codecov/codecov-action@v1 diff --git a/tests/test_cascades.py b/tests/test_cascades.py new file mode 100644 index 0000000..c99c3a5 --- /dev/null +++ b/tests/test_cascades.py @@ -0,0 +1,73 @@ +from typing import Optional + +import databases +import pytest +import sqlalchemy +from sqlalchemy import create_engine +from sqlalchemy.dialects import postgresql + +import ormar +from tests.settings import DATABASE_URL + +database = databases.Database(DATABASE_URL, force_rollback=True) +metadata = sqlalchemy.MetaData() + + +class Artist(ormar.Model): + class Meta: + tablename = "artists" + metadata = metadata + database = database + + id: int = ormar.Integer(primary_key=True) + name: str = ormar.String(max_length=100) + + +class Album(ormar.Model): + class Meta: + tablename = "albums" + metadata = metadata + database = database + + id: int = ormar.Integer(primary_key=True) + name: str = ormar.String(max_length=100) + artist: Optional[Artist] = ormar.ForeignKey(Artist, ondelete='CASCADE') + + +class Track(ormar.Model): + class Meta: + tablename = "tracks" + metadata = metadata + database = database + + id: int = ormar.Integer(primary_key=True) + album: Optional[Album] = ormar.ForeignKey(Album, ondelete='CASCADE') + title: str = ormar.String(max_length=100) + + +@pytest.fixture(autouse=True, scope="module") +def create_test_database(): + engine = sqlalchemy.create_engine(DATABASE_URL) + if "sqlite" in DATABASE_URL: + with engine.connect() as connection: + connection.execute("PRAGMA foreign_keys = ON;") + metadata.drop_all(engine) + metadata.create_all(engine) + yield + # metadata.drop_all(engine) + + +# def test_table_structures(): +# col = Album.Meta.table.columns.get('artist') +# breakpoint() + + +@pytest.mark.asyncio +async def test_simple_cascade(): + async with database: + async with database.transaction(force_rollback=True): + artist = await Artist(name='Dr Alban').save() + await Album(name="Jamaica", artist=artist).save() + await Artist.objects.delete(id=artist.id) + albums = await Album.objects.all() + assert len(albums) == 0