aboutsummaryrefslogtreecommitdiff
path: root/tests/unit/conftest.py
blob: dd6abb4698228cfa73818cdbb8ce9103ed6705df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
"""Fixtures for unit tests."""
import sqlite3
from typing import Union
from pathlib import Path
from datetime import datetime
from contextlib import closing
from tempfile import TemporaryDirectory

import pytest
from yoyo import get_backend, read_migrations
from yoyo.migrations import Migration, MigrationList

from gn3.app import create_app
from gn3.migrations import apply_migrations, rollback_migrations

@pytest.fixture(scope="session")
def client():
    """Create a test client fixture for tests"""
    # Do some setup
    with TemporaryDirectory() as testdir:
        testdb = Path(testdir).joinpath(
            f'testdb_{datetime.now().strftime("%Y%m%dT%H%M%S")}')
        app = create_app({"AUTH_DB": testdb})
        app.config.update({"TESTING": True})
        app.testing = True
        yield app.test_client()
        # Clean up after ourselves
        testdb.unlink(missing_ok=True)

@pytest.fixture(scope="session")
def test_app_config(client): # pylint: disable=redefined-outer-name
    """Return the test application's configuration object"""
    return client.application.config

@pytest.fixture(scope="session")
def auth_testdb_path(test_app_config): # pylint: disable=redefined-outer-name
    """Get the test application's auth database file"""
    return test_app_config["AUTH_DB"]

@pytest.fixture(scope="session")
def auth_migrations_dir(test_app_config): # pylint: disable=redefined-outer-name
    """Get the test application's auth database file"""
    return test_app_config["AUTH_MIGRATIONS"]

def apply_single_migration(db_uri: Union[Path, str], migration: Migration):
    """Utility to apply a single migration"""
    apply_migrations(get_backend(f"sqlite:///{db_uri}"), MigrationList([migration]))

def rollback_single_migration(db_uri: Union[Path, str], migration: Migration):
    """Utility to rollback a single migration"""
    rollback_migrations(get_backend(f"sqlite:///{db_uri}"), MigrationList([migration]))

@pytest.fixture(scope="function")
def conn_after_auth_migrations(auth_testdb_path, auth_migrations_dir):
    """Run all migrations and return a connection to the database after"""
    backend = get_backend(f"sqlite:///{auth_testdb_path}")
    migrations = read_migrations(auth_migrations_dir)
    apply_migrations(backend, migrations)
    with closing(sqlite3.connect(auth_testdb_path)) as conn:
        yield conn

    rollback_migrations(backend, migrations)