diff --git a/.coverage b/.coverage index 52f8587..befb8dd 100644 Binary files a/.coverage and b/.coverage differ diff --git a/.travis.yml b/.travis.yml index 416d999..95a55f6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,15 +5,28 @@ dist: xenial cache: pip python: - - "3.6" - - "3.7" - - "3.8" + - "3.6" + - "3.7" + - "3.8" + +env: + - TEST_DATABASE_URLS="postgresql://localhost/test_database, mysql://localhost/test_database, sqlite:///test.db" + +services: + - postgresql + - mysql + install: - - pip install -U -r requirements.txt + - pip install -U -r requirements.txt + +before_script: + - psql -c 'create database test_database;' -U postgres + - echo 'create database test_database;' | mysql + script: - - scripts/test.sh + - scripts/test.sh after_script: - - codecov \ No newline at end of file + - codecov \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 807e704..a9d7c03 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,15 @@ databases[sqlite] +databases[postgresql] +databases[mysql] pydantic sqlalchemy +# Async database drivers +aiomysql +aiosqlite +asyncpg +pymysql + # Testing pytest pytest-cov diff --git a/tests/settings.py b/tests/settings.py index 697acb0..3b01be1 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -1,3 +1,5 @@ import os +os.environ['TEST_DATABASE_URLS'] = "sqlite:///test.db" + DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///test.db") diff --git a/tests/test_columns.py b/tests/test_columns.py index 15382b0..07898cd 100644 --- a/tests/test_columns.py +++ b/tests/test_columns.py @@ -1,4 +1,5 @@ import datetime +import os import databases import pytest @@ -7,6 +8,10 @@ import sqlalchemy import ormar from tests.settings import DATABASE_URL +assert "TEST_DATABASE_URLS" in os.environ, "TEST_DATABASE_URLS is not set." + +DATABASE_URLS = [url.strip() for url in os.environ["TEST_DATABASE_URLS"].split(",")] + database = databases.Database(DATABASE_URL, force_rollback=True) metadata = sqlalchemy.MetaData() @@ -33,28 +38,45 @@ class Example(ormar.Model): @pytest.fixture(autouse=True, scope="module") def create_test_database(): - engine = sqlalchemy.create_engine(DATABASE_URL) - metadata.create_all(engine) + for url in DATABASE_URLS: + database_url = databases.DatabaseURL(url) + if database_url.scheme == "mysql": + url = str(database_url.replace(driver="pymysql")) + elif database_url.scheme == "postgresql+aiopg": + url = str(database_url.replace(driver=None)) + engine = sqlalchemy.create_engine(url) + metadata.create_all(engine) + yield - metadata.drop_all(engine) + for url in DATABASE_URLS: + database_url = databases.DatabaseURL(url) + if database_url.scheme == "mysql": + url = str(database_url.replace(driver="pymysql")) + elif database_url.scheme == "postgresql+aiopg": + url = str(database_url.replace(driver=None)) + engine = sqlalchemy.create_engine(url) + metadata.drop_all(engine) +@pytest.mark.parametrize("database_url", DATABASE_URLS) @pytest.mark.asyncio -async def test_model_crud(): - async with database: - example = Example() - await example.save() +async def test_model_crud(database_url): + async with databases.Database(database_url) as database: + async with database.transaction(force_rollback=True): + Example.Meta.database = database + example = Example() + await example.save() - await example.load() - assert example.created.year == datetime.datetime.now().year - assert example.created_day == datetime.date.today() - assert example.description is None - assert example.value is None - assert example.data == {} + await example.load() + assert example.created.year == datetime.datetime.now().year + assert example.created_day == datetime.date.today() + assert example.description is None + assert example.value is None + assert example.data == {} - await example.update(data={"foo": 123}, value=123.456) - await example.load() - assert example.value == 123.456 - assert example.data == {"foo": 123} + await example.update(data={"foo": 123}, value=123.456) + await example.load() + assert example.value == 123.456 + assert example.data == {"foo": 123} - await example.delete() + await example.delete()