aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/integration/conftest.py62
1 files changed, 44 insertions, 18 deletions
diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py
index 2977ca9..4274233 100644
--- a/tests/integration/conftest.py
+++ b/tests/integration/conftest.py
@@ -1,8 +1,11 @@
"""Module that holds fixtures for integration tests"""
+import os
+import re
+import json
import pytest
-import MySQLdb
from gn3.app import create_app
+from gn3.settings import SQL_URI
from gn3.random import random_string
from gn3.db_utils import parse_db_url, database_connector
@@ -17,33 +20,56 @@ def client():
# Do some teardown/cleanup
+def table_structure_queries(conn):
+ """Retrieves the table structures from the given database connection"""
+ with conn.cursor() as cursor:
+ cursor.execute("SHOW TABLES;")
+ tables = tuple(row[0] for row in cursor.fetchall())
+ queries = []
+ for table in tables:
+ cursor.execute(f"SHOW CREATE TABLE {table}")
+ query = cursor.fetchone()
+ queries.append(re.sub(
+ r" AUTO_INCREMENT=[0-9]* ", r" AUTO_INCREMENT=0 ",
+ query[1]))
+
+ return queries
+
@pytest.fixture(scope="session")
def db_conn():
"""Create a db connection fixture for tests"""
# 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()
+ live_db_details = parse_db_url(SQL_URI)
+ test_db_host = os.environ.get("TEST_DB_HOST", live_db_details[0])
+ test_db_port = int(os.environ.get("TEST_DB_PORT", live_db_details[4]))
+ test_db_user = os.environ.get("TEST_DB_USER", live_db_details[1])
+ test_db_passwd = os.environ.get("TEST_DB_PASSWD", live_db_details[2])
test_db_name = f"test_{live_db_details[3]}_{rand_str}"
+ test_sql_uri_prefix = (
+ f"mysql://{test_db_user}:{test_db_passwd}@{test_db_host}"
+ f"{':' + str(test_db_port) if test_db_port else ''}")
#
# 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}")
+ # * Connect to the test db host
+ # * Use context manager to ensure the connection is automatically closed
+ # on exit
+ with database_connector(test_sql_uri_prefix) as prefix_db_conn:
+ with prefix_db_conn.cursor() as db_cursor:
+ 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)
+ # 03) Copy over table structure from source db
+ with database_connector() as src_db_conn:
+ queries = table_structure_queries(src_db_conn)
#
# 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)
+ test_db_conn = database_connector(
+ f"{test_sql_uri_prefix}/{test_db_name}")
+ with test_db_conn.cursor() as temp_cur:
+ # dump copied structure to test db
+ for query in queries:
+ temp_cur.execute(query)
+
yield test_db_conn
#
# 05) Clean up after ourselves
@@ -51,4 +77,4 @@ def db_conn():
test_db_conn.close()
#
# b.) Delete the test database
- live_db_cursor.execute(f"DROP DATABASE IF EXISTS {test_db_name}")
+ db_cursor.execute(f"DROP DATABASE IF EXISTS {test_db_name}")