diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4feebf7..dbea4c2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -100,11 +100,15 @@ jobs: test_backend: name: Backend Tests - runs-on: ubuntu-20.04 strategy: fail-fast: false matrix: python-version: ["3.9", "3.10", "3.11"] + os: ["ubuntu-20.04"] + include: + - python-version: "3.9" + os: "windows-2022" + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} diff --git a/tests/backend/api_test.py b/tests/backend/api_test.py index 64c989a..72e6d89 100644 --- a/tests/backend/api_test.py +++ b/tests/backend/api_test.py @@ -14,7 +14,8 @@ @pytest.fixture(name="client") def fixture_client(tmp_path: Path) -> Generator[Client, None, None]: - app.config["DATABASE"] = f"sqlite:///{tmp_path}/valens.db" + test_db = tmp_path / "test.db" + app.config["DATABASE"] = f"sqlite:///{test_db}" app.config["SECRET_KEY"] = b"TEST_KEY" app.config["TESTING"] = True diff --git a/tests/backend/assets_test.py b/tests/backend/assets_test.py index 7ac556a..4ca3927 100644 --- a/tests/backend/assets_test.py +++ b/tests/backend/assets_test.py @@ -10,7 +10,8 @@ @pytest.fixture(name="client") def fixture_client(tmp_path: Path) -> Generator[Client, None, None]: - app.config["DATABASE"] = f"sqlite:///{tmp_path}/valens.db" + test_db = tmp_path / "test.db" + app.config["DATABASE"] = f"sqlite:///{test_db}" app.config["SECRET_KEY"] = b"TEST_KEY" app.config["TESTING"] = True diff --git a/tests/backend/demo_test.py b/tests/backend/demo_test.py index 9dc798e..3bde012 100644 --- a/tests/backend/demo_test.py +++ b/tests/backend/demo_test.py @@ -7,4 +7,4 @@ def test_run(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setattr(app, "run", lambda x, y: None) - demo.run(f"sqlite:///{tmp_path}/db") + demo.run(rf"sqlite:///{tmp_path}/db") diff --git a/tests/backend/migrations_test.py b/tests/backend/migrations_test.py index 5a2831a..90092da 100644 --- a/tests/backend/migrations_test.py +++ b/tests/backend/migrations_test.py @@ -89,7 +89,8 @@ def constraints(connection: sqlite3.Connection) -> list[str]: ) with app.app_context(): - migrations_db = f"{tmp_path}/migrations.db" + migrations_db = tmp_path / "migrations.db" + migrations_db.touch() app.config["DATABASE"] = f"sqlite:///{migrations_db}" connection = sqlite3.connect(migrations_db) @@ -99,7 +100,8 @@ def constraints(connection: sqlite3.Connection) -> list[str]: migrated_constraints = constraints(connection) - models_db = f"{tmp_path}/models.db" + models_db = tmp_path / "models.db" + models_db.touch() app.config["DATABASE"] = f"sqlite:///{models_db}" db.init() diff --git a/tests/conftest.py b/tests/conftest.py index 1b7d5b8..8f573c1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,7 @@ from __future__ import annotations +from pathlib import Path -from tempfile import NamedTemporaryFile +from tempfile import TemporaryDirectory import _pytest import pytest @@ -17,11 +18,15 @@ def alembic_config() -> dict[str, str]: @pytest.fixture() def alembic_engine() -> object: - with NamedTemporaryFile() as tmp_file: - app.config["DATABASE"] = f"sqlite:///{tmp_file.name}" + with TemporaryDirectory() as tmp_dir: + tmp_file = Path(tmp_dir) / "test.db" + tmp_file.touch() + app.config["DATABASE"] = f"sqlite:///{tmp_file}" + print("XXX", app.config["DATABASE"], repr(app.config["DATABASE"])) with app.app_context(): db.init() yield db.get_engine() + tmp_file.unlink() def pytest_addoption(parser: _pytest.config.argparsing.Parser) -> None: diff --git a/tests/e2e/web_test.py b/tests/e2e/web_test.py index 68adbc1..9d564c7 100644 --- a/tests/e2e/web_test.py +++ b/tests/e2e/web_test.py @@ -44,7 +44,7 @@ def _fixture_backend() -> Generator[None, None, None]: config = create_config_file(data_dir, db_file) with app.app_context(): - app.config["DATABASE"] = f"sqlite:///{db_file}" + app.config["DATABASE"] = rf"sqlite:///{db_file}" app.config["SECRET_KEY"] = b"TEST_KEY" tests.utils.init_db_data() diff --git a/valens/config.py b/valens/config.py index 96581c5..ef4556e 100644 --- a/valens/config.py +++ b/valens/config.py @@ -27,7 +27,7 @@ def check_config_file(environ: dict[str, str]) -> None: def create_config_file(config_directory: Path, database_file: Path) -> Path: config = config_directory / "config.py" config.write_text( - f"DATABASE = 'sqlite:///{database_file}'\nSECRET_KEY = {os.urandom(24)!r}\n", + f"DATABASE = r'sqlite:///{database_file}'\nSECRET_KEY = {os.urandom(24)!r}\n", encoding="utf-8", ) return config diff --git a/valens/database.py b/valens/database.py index 6d22381..2a55ebe 100644 --- a/valens/database.py +++ b/valens/database.py @@ -1,5 +1,7 @@ # ruff: noqa: T201 +from __future__ import annotations + import sqlite3 from datetime import datetime from pathlib import Path @@ -31,10 +33,17 @@ def upgrade_lock_file() -> Path: return db_dir() / "valens_upgrade.lock" +engines: dict[str, Engine] = {} + + def get_engine() -> Engine: + print("get_engine()", current_app.config["DATABASE"], repr(current_app.config["DATABASE"])) config.check_app_config() db_dir().mkdir(exist_ok=True) - return create_engine(current_app.config["DATABASE"]) + if current_app.config["DATABASE"] in engines: + return engines[current_app.config["DATABASE"]] + engines[current_app.config["DATABASE"]] = create_engine(current_app.config["DATABASE"]) + return engines[current_app.config["DATABASE"]] def get_scoped_session() -> scoped_session[Session]: @@ -64,6 +73,8 @@ def remove_session() -> None: def init() -> None: print("Creating database") + print("database.init()", current_app.config["DATABASE"], db_file().exists()) + print(db_file().read_text()) models.Base.query = get_scoped_session().query_property() models.Base.metadata.create_all(bind=get_engine())