From 9f947b0385fab4ac06d605813db8830fb81b929e Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Fri, 9 Feb 2024 23:26:29 +0100 Subject: [PATCH 1/2] Chore: Update .gitignore --- .gitignore | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index efc0473d..190912d0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,11 @@ -.idea -.venv* *.egg-info .eggs -__pycache__ +.env +.idea *.pyc +.venv* +__pycache__ dist .coverage* coverage.xml +/tmp From 93252b545d39934a92e06ffdfb4806786d009889 Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Fri, 9 Feb 2024 22:35:23 +0100 Subject: [PATCH 2/2] 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 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..91945e87 --- /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"