From f216b4cf7978c9ef98367852da9516ddfc07444f Mon Sep 17 00:00:00 2001 From: Florin Barbu Date: Fri, 24 May 2024 12:36:13 +0300 Subject: [PATCH] postgress test --- .github/workflows/test_common.yml | 2 +- .gitignore | 1 + src/env_vars.py | 2 ++ src/postgres_setup.py | 44 +++++++++++++++++++++++++++++++ tests/conftest.py | 8 ++++++ tests/store/test_external_db.py | 18 +++++++++++++ 6 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/postgres_setup.py create mode 100644 tests/store/test_external_db.py diff --git a/.github/workflows/test_common.yml b/.github/workflows/test_common.yml index 21e5a757..571d5285 100644 --- a/.github/workflows/test_common.yml +++ b/.github/workflows/test_common.yml @@ -50,7 +50,7 @@ jobs: - name: Run tests run: | - pytest -n 4 --dist loadgroup --reruns 2 --alluredir=allure-results + pytest -n 4 --dist loadgroup --alluredir=allure-results -k "test_postgres_db" - name: Get allure history if: always() diff --git a/.gitignore b/.gitignore index 5c9dbc1a..546d9936 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ log/ .vscode allure-results/ +postgresql # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/src/env_vars.py b/src/env_vars.py index a5881856..9217af52 100644 --- a/src/env_vars.py +++ b/src/env_vars.py @@ -29,6 +29,8 @@ RUNNING_IN_CI = get_env_var("CI") NODEKEY = get_env_var("NODEKEY", "30348dd51465150e04a5d9d932c72864c8967f806cce60b5d26afeca1e77eb68") API_REQUEST_TIMEOUT = get_env_var("API_REQUEST_TIMEOUT", 20) RLN_CREDENTIALS = get_env_var("RLN_CREDENTIALS") +PG_USER = get_env_var("POSTGRES_USER", "postgres") +PG_PASS = get_env_var("POSTGRES_PASSWORD", "test123") # example for .env file # RLN_CREDENTIALS = {"rln-relay-cred-password": "password", "rln-relay-eth-client-address": "wss://sepolia.infura.io/ws/v3/api_key", "rln-relay-eth-contract-address": "0xF471d71E9b1455bBF4b85d475afb9BB0954A29c4", "rln-relay-eth-private-key-1": "1111111111111111111111111111111111111111111111111111111111111111", "rln-relay-eth-private-key-2": "1111111111111111111111111111111111111111111111111111111111111111"} diff --git a/src/postgres_setup.py b/src/postgres_setup.py new file mode 100644 index 00000000..97d47c95 --- /dev/null +++ b/src/postgres_setup.py @@ -0,0 +1,44 @@ +import docker +import os +from src.env_vars import NETWORK_NAME, PG_PASS, PG_USER +from src.libs.custom_logger import get_custom_logger + +logger = get_custom_logger(__name__) + + +def start_postgres(): + pg_env = {"POSTGRES_USER": PG_USER, "POSTGRES_PASSWORD": PG_PASS} + + base_path = os.path.abspath(".") + volumes = {os.path.join(base_path, "postgresql"): {"bind": "/var/lib/postgresql/data", "mode": "Z"}} + + client = docker.from_env() + + postgres_container = client.containers.run( + "postgres:15.4-alpine3.18", + name="postgres", + environment=pg_env, + volumes=volumes, + command="postgres", + ports={"5432/tcp": ("127.0.0.1", 5432)}, + restart_policy={"Name": "on-failure", "MaximumRetryCount": 5}, + healthcheck={ + "Test": ["CMD-SHELL", "pg_isready -U postgres -d postgres"], + "Interval": 30000000000, # 30 seconds in nanoseconds + "Timeout": 60000000000, # 60 seconds in nanoseconds + "Retries": 5, + "StartPeriod": 80000000000, # 80 seconds in nanoseconds + }, + detach=True, + network_mode=NETWORK_NAME, + ) + + logger.debug("Postgres container started") + + return postgres_container + + +def stop_postgres(postgres_container): + postgres_container.stop() + postgres_container.remove() + logger.debug("Postgres container stopped and removed.") diff --git a/tests/conftest.py b/tests/conftest.py index 2e26b97c..4e9ede25 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -10,6 +10,7 @@ from uuid import uuid4 from src.libs.common import attach_allure_file import src.env_vars as env_vars from src.data_storage import DS +from src.postgres_setup import start_postgres, stop_postgres logger = get_custom_logger(__name__) @@ -37,6 +38,13 @@ def set_allure_env_variables(): outfile.write(f"{attribute_name}={attribute_value}\n") +@pytest.fixture(scope="class", autouse=False) +def start_postgres_container(): + pg_container = start_postgres() + yield + stop_postgres(pg_container) + + @pytest.fixture(scope="function", autouse=True) def test_id(request): # setting up an unique test id to be used where needed diff --git a/tests/store/test_external_db.py b/tests/store/test_external_db.py new file mode 100644 index 00000000..a6239bbd --- /dev/null +++ b/tests/store/test_external_db.py @@ -0,0 +1,18 @@ +import pytest +from src.libs.custom_logger import get_custom_logger +from src.steps.store import StepsStore +from src.env_vars import PG_PASS, PG_USER + +logger = get_custom_logger(__name__) + + +@pytest.mark.usefixtures("start_postgres_container") +class TestExternalDb(StepsStore): + def test_postgres_db(self): + self.setup_first_publishing_node(store="true", relay="true", store_message_db_url=f"postgres://{PG_USER}:{PG_PASS}@postgres:5432/postgres") + self.setup_first_store_node(store="true", relay="true") + self.subscribe_to_pubsub_topics_via_relay() + message = self.create_message() + self.publish_message(message=message) + self.check_published_message_is_stored(page_size=5, ascending="true") + assert len(self.store_response.messages) == 1