From ad5c7d252bb84b51ede54b0d0ef2820e62595172 Mon Sep 17 00:00:00 2001
From: Pavel Kirilin <win10@list.ru>
Date: Tue, 6 Oct 2020 16:35:52 +0400
Subject: [PATCH] Updated automatic test database creation.

Signed-off-by: Pavel Kirilin <win10@list.ru>
---
 .../tests/conftest.py                         | 39 ++++++++++++++++++-
 .../tests/dummy_db_test.py                    |  9 +++--
 2 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/{{cookiecutter.project_name}}/tests/conftest.py b/{{cookiecutter.project_name}}/tests/conftest.py
index 4135f16..9513830 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 561e6e5..4c09785 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()
-- 
GitLab