From 3f73bde49580121859ebb60443660e536d3af0f9 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 | 13 +++++++++++++ 4 files changed, 35 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 00000000..8e3ed7a2 --- /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 6460f30b..ddd02b2c 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 637e1529..20d25502 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 00000000..a5633d8c --- /dev/null +++ b/tests/testing/test_pytest.py @@ -0,0 +1,13 @@ +import re + + +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"