From d8b069997a3790da23057e504bdf85c85d079c1e Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Fri, 9 Feb 2024 22:35:23 +0100 Subject: [PATCH] Testing: Export `cratedb_service` fixture as pytest11 entrypoint This way, for basic needs, corresponding boilerplate code does not need to be provided by downstream projects. When needing more configurability, you will need to define corresponding alternative fixtures, and not use the built-in provided from. --- cratedb_toolkit/testing/pytest.py | 16 ++++++++++++++++ pyproject.toml | 3 ++- tests/conftest.py | 8 ++++---- tests/testing/test_pytest.py | 16 ++++++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 cratedb_toolkit/testing/pytest.py create mode 100644 tests/testing/test_pytest.py diff --git a/cratedb_toolkit/testing/pytest.py b/cratedb_toolkit/testing/pytest.py new file mode 100644 index 0000000..8e3ed7a --- /dev/null +++ b/cratedb_toolkit/testing/pytest.py @@ -0,0 +1,16 @@ +from typing import Generator + +import pytest + +from cratedb_toolkit.testing.testcontainers.cratedb import CrateDBTestAdapter + + +@pytest.fixture(scope="session") +def cratedb_service() -> Generator[CrateDBTestAdapter, None, None]: + """ + Provide a CrateDB service instance to the test suite. + """ + db = CrateDBTestAdapter() + db.start() + yield db + db.stop() diff --git a/pyproject.toml b/pyproject.toml index 6460f30..ddd02b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -144,7 +144,6 @@ test = [ testing = [ "testcontainers<4", ] - [project.urls] changelog = "https://github.com/crate-workbench/cratedb-toolkit/blob/main/CHANGES.rst" documentation = "https://github.com/crate-workbench/cratedb-toolkit" @@ -155,6 +154,8 @@ cratedb-retention = "cratedb_toolkit.retention.cli:cli" cratedb-toolkit = "cratedb_toolkit.cli:cli" ctk = "cratedb_toolkit.cli:cli" migr8 = "cratedb_toolkit.io.mongodb.cli:main" +[project.entry-points.pytest11] +cratedb_service = "cratedb_toolkit.testing.pytest" [tool.black] line-length = 120 diff --git a/tests/conftest.py b/tests/conftest.py index 637e152..20d2550 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -55,7 +55,7 @@ def configure_database_schema(session_mocker, prune_environment): @pytest.fixture(scope="session") -def cratedb_service(): +def cratedb_custom_service(): """ Provide a CrateDB service instance to the test suite. """ @@ -67,12 +67,12 @@ def cratedb_service(): @pytest.fixture(scope="function") -def cratedb(cratedb_service): +def cratedb(cratedb_custom_service): """ Provide a fresh canvas to each test case invocation, by resetting database content. """ - cratedb_service.reset(tables=RESET_TABLES) - yield cratedb_service + cratedb_custom_service.reset(tables=RESET_TABLES) + yield cratedb_custom_service @pytest.fixture diff --git a/tests/testing/test_pytest.py b/tests/testing/test_pytest.py new file mode 100644 index 0000000..91945e8 --- /dev/null +++ b/tests/testing/test_pytest.py @@ -0,0 +1,16 @@ +import re + +import pytest + + +@pytest.mark.skip("Does not work, because something stalls when using multiple containers") +def test_cratedb_service(cratedb_service): + """ + Verify the exported pytest fixture `cratedb_service` works as intended. + """ + assert re.match(r"http://crate:@localhost:\d\d\d\d\d", cratedb_service.get_http_url()) + assert re.match(r"crate://crate:@localhost:\d\d\d\d\d", cratedb_service.get_connection_url()) + + sql = "SELECT mountain FROM sys.summits ORDER BY prominence DESC LIMIT 1;" + highest_summit = cratedb_service.database.run_sql(sql, records=True)[0] + assert highest_summit["mountain"] == "Mont Blanc"