about summary refs log tree commit diff
path: root/tests/integration
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2022-02-22 13:35:28 +0300
committerFrederick Muriuki Muriithi2022-03-24 13:11:13 +0300
commit5906098d32e7aa1ab155d5dd49cd3b04b06684eb (patch)
treef85f34af56bb6f9adf9719ae421fee83f9bb0b39 /tests/integration
parentf8897da6e4069b592ca5846156e472b76a235724 (diff)
downloadgenenetwork3-5906098d32e7aa1ab155d5dd49cd3b04b06684eb.tar.gz
Test Fixture: Create new test database and get connection to it
Implement a fixture that:

* Creates a new test database
* Copies over table structure from existing database
* Gets connection to new test database and returns it
* Cleans up after itself when the tests have run
Diffstat (limited to 'tests/integration')
-rw-r--r--tests/integration/conftest.py42
-rw-r--r--tests/integration/test_partial_correlations.py1
2 files changed, 36 insertions, 7 deletions
diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py
index be927a4..2977ca9 100644
--- a/tests/integration/conftest.py
+++ b/tests/integration/conftest.py
@@ -1,8 +1,10 @@
 """Module that holds fixtures for integration tests"""
 import pytest
+import MySQLdb
 
 from gn3.app import create_app
-from gn3.db_utils import database_connector
+from gn3.random import random_string
+from gn3.db_utils import parse_db_url, database_connector
 
 @pytest.fixture(scope="session")
 def client():
@@ -15,10 +17,38 @@ def client():
     # Do some teardown/cleanup
 
 
-@pytest.fixture
+@pytest.fixture(scope="session")
 def db_conn():
     """Create a db connection fixture for tests"""
-    ## Update this to use temp db once that is in place
-    conn = database_connector()
-    yield conn
-    conn.close()
+    # 01) Generate random string to append to all test db artifacts for the session
+    rand_str = random_string(15)
+    live_db_details = parse_db_url()
+    test_db_name = f"test_{live_db_details[3]}_{rand_str}"
+    #
+    # 02) Create new test db
+    #     Use context manager to ensure the live connection is automatically
+    #     closed on exit
+    with database_connector() as live_db_conn:
+        with live_db_conn.cursor() as live_db_cursor:
+            live_db_cursor.execute(f"CREATE DATABASE {test_db_name}")
+            #
+            # 03) Copy over table structure from source db into test db
+            live_db_cursor.execute("SHOW TABLES;")
+            queries = (
+                f"CREATE TABLE {test_db_name}.{row[0]} AS SELECT * FROM {row[0]} WHERE 1=0;"
+                for row in live_db_cursor.fetchall())
+            for query in queries:
+                live_db_cursor.execute(query)
+            #
+            # 04) get database connection to test db and yield it up
+            test_db_conn = MySQLdb.connect(
+                live_db_details[0], live_db_details[1], live_db_details[2],
+                test_db_name)
+            yield test_db_conn
+            #
+            # 05) Clean up after ourselves
+            #   a.) Close the test db connection
+            test_db_conn.close()
+            #
+            #   b.) Delete the test database
+            live_db_cursor.execute(f"DROP DATABASE IF EXISTS {test_db_name}")
diff --git a/tests/integration/test_partial_correlations.py b/tests/integration/test_partial_correlations.py
index 4bf352a..d249b42 100644
--- a/tests/integration/test_partial_correlations.py
+++ b/tests/integration/test_partial_correlations.py
@@ -212,7 +212,6 @@ def test_partial_correlation_api_with_non_existent_control_traits(client, post_d
     #         difficult to test for these without a temp database with the temp
     #         traits data set to something we are in control of
      )
-
 def test_part_corr_api_with_mix_of_existing_and_non_existing_control_traits(
         db_conn, primary, controls, method, target):
     """