diff --git a/{{cookiecutter.project_name}}/tests/conftest.py b/{{cookiecutter.project_name}}/tests/conftest.py index 4135f16c53927da137e8b76b51b412e9af6adeaf..9513830e95a6a5b1ffffd638c209f10589ad3fea 100644 --- a/{{cookiecutter.project_name}}/tests/conftest.py +++ b/{{cookiecutter.project_name}}/tests/conftest.py @@ -6,12 +6,47 @@ import pytest from fastapi.testclient import TestClient from sqlalchemy import create_engine from sqlalchemy.engine import Connection +from sqlalchemy.engine.url import URL, make_url +from sqlalchemy.exc import ProgrammingError from src.services.db import db_url +from src.settings import settings warnings.filterwarnings("ignore", category=DeprecationWarning) +def get_engine(): + pg_db_url = make_url( + URL( + drivername=settings.db_driver, + username=settings.postgres_user, + password=settings.postgres_password, + host=settings.postgres_host, + port=settings.postgres_port, + database="postgres", + ) + ) + engine = create_engine(str(pg_db_url)) + return engine + + +def run_psql_without_transaction(command: str): + engine = get_engine() + connection = engine.connect() + connection.connection.set_isolation_level(0) + connection.execute(command) + connection.connection.set_isolation_level(1) + connection.close() + + +@pytest.fixture(scope="session") +def create_database(): + try: + run_psql_without_transaction(f"CREATE DATABASE {settings.postgres_db}") + except ProgrammingError: + pass + + def prepare_db() -> None: alembic.config.main( [ @@ -33,7 +68,7 @@ def drop_db() -> None: @pytest.fixture(scope="function") -def create_db() -> Generator[None, None, None]: +def create_db(create_database: None) -> Generator[None, None, None]: prepare_db() yield drop_db() @@ -55,4 +90,4 @@ def pg_conn() -> Connection: yield conn - conn.close() \ No newline at end of file + conn.close() diff --git a/{{cookiecutter.project_name}}/tests/dummy_db_test.py b/{{cookiecutter.project_name}}/tests/dummy_db_test.py index 561e6e5d52bf972d2da1762fa184fb6b3084c2d7..4c097857803125ff4b8851e0b7a48d813a83bc72 100644 --- a/{{cookiecutter.project_name}}/tests/dummy_db_test.py +++ b/{{cookiecutter.project_name}}/tests/dummy_db_test.py @@ -20,16 +20,19 @@ test_data = [ @pytest.mark.parametrize("test_conf", test_data) -def test_delete_monitor( +def test_delete_dummy_obj( pg_conn: Connection, test_conf: TestSettings, app_fixture: TestClient ) -> None: with app_fixture as client: put_result = client.put( - f"/dummy_db/{test_conf.request_data['dummy_id']}", + f"/dummy_db_obj/", json=test_conf.request_data["json"], ) assert put_result.status_code == 200 - result = client.delete(f"/dummy_db/{test_conf.request_data['dummy_id']}") + with pg_conn.begin(): + result = pg_conn.execute(DummyDBModel.select_query(DummyDBModel.id)).first() + assert len(result) == 1 + result = client.delete(f"/dummy_db_obj/{result[0]}") assert result.status_code == 200 with pg_conn.begin(): result = pg_conn.execute(sa.func.count(DummyDBModel.id)).first()