initial config for multi db tests

This commit is contained in:
collerek
2020-09-16 12:33:12 +02:00
parent a5d9916575
commit 31096d3f93
5 changed files with 69 additions and 24 deletions

BIN
.coverage

Binary file not shown.

View File

@ -5,15 +5,28 @@ dist: xenial
cache: pip cache: pip
python: python:
- "3.6" - "3.6"
- "3.7" - "3.7"
- "3.8" - "3.8"
env:
- TEST_DATABASE_URLS="postgresql://localhost/test_database, mysql://localhost/test_database, sqlite:///test.db"
services:
- postgresql
- mysql
install: 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: script:
- scripts/test.sh - scripts/test.sh
after_script: after_script:
- codecov - codecov

View File

@ -1,7 +1,15 @@
databases[sqlite] databases[sqlite]
databases[postgresql]
databases[mysql]
pydantic pydantic
sqlalchemy sqlalchemy
# Async database drivers
aiomysql
aiosqlite
asyncpg
pymysql
# Testing # Testing
pytest pytest
pytest-cov pytest-cov

View File

@ -1,3 +1,5 @@
import os import os
os.environ['TEST_DATABASE_URLS'] = "sqlite:///test.db"
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///test.db") DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///test.db")

View File

@ -1,4 +1,5 @@
import datetime import datetime
import os
import databases import databases
import pytest import pytest
@ -7,6 +8,10 @@ import sqlalchemy
import ormar import ormar
from tests.settings import DATABASE_URL 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) database = databases.Database(DATABASE_URL, force_rollback=True)
metadata = sqlalchemy.MetaData() metadata = sqlalchemy.MetaData()
@ -33,28 +38,45 @@ class Example(ormar.Model):
@pytest.fixture(autouse=True, scope="module") @pytest.fixture(autouse=True, scope="module")
def create_test_database(): def create_test_database():
engine = sqlalchemy.create_engine(DATABASE_URL) for url in DATABASE_URLS:
metadata.create_all(engine) 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 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 @pytest.mark.asyncio
async def test_model_crud(): async def test_model_crud(database_url):
async with database: async with databases.Database(database_url) as database:
example = Example() async with database.transaction(force_rollback=True):
await example.save() Example.Meta.database = database
example = Example()
await example.save()
await example.load() await example.load()
assert example.created.year == datetime.datetime.now().year assert example.created.year == datetime.datetime.now().year
assert example.created_day == datetime.date.today() assert example.created_day == datetime.date.today()
assert example.description is None assert example.description is None
assert example.value is None assert example.value is None
assert example.data == {} assert example.data == {}
await example.update(data={"foo": 123}, value=123.456) await example.update(data={"foo": 123}, value=123.456)
await example.load() await example.load()
assert example.value == 123.456 assert example.value == 123.456
assert example.data == {"foo": 123} assert example.data == {"foo": 123}
await example.delete() await example.delete()