From ce752057934668f77d437a854bcde8760ce1eecc Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Sat, 21 Mar 2026 21:04:06 +0100 Subject: [PATCH 1/2] Tests: Improve debugging test output --- tests/cfr/test_jobstats.py | 8 ++++---- tests/cfr/test_systable.py | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tests/cfr/test_jobstats.py b/tests/cfr/test_jobstats.py index bce40a85..37d8afbf 100644 --- a/tests/cfr/test_jobstats.py +++ b/tests/cfr/test_jobstats.py @@ -24,7 +24,7 @@ def test_cfr_jobstats_collect_self(cratedb, caplog): args="jobstats collect --once", catch_exceptions=False, ) - assert result.exit_code == 0 + assert result.exit_code == 0, result.output # Verify outcome: Log output. assert "Recording information snapshot" in caplog.messages @@ -57,7 +57,7 @@ def test_cfr_jobstats_collect_anonymized(cratedb, caplog): args="jobstats collect --once --anonymize", catch_exceptions=False, ) - assert result.exit_code == 0 + assert result.exit_code == 0, result.output # Verify outcome: Log output. assert "Recording information snapshot" in caplog.messages @@ -93,7 +93,7 @@ def test_cfr_jobstats_collect_reportdb(cratedb, caplog): args=f"jobstats collect --once --reportdb={dburi_report}", catch_exceptions=False, ) - assert result.exit_code == 0 + assert result.exit_code == 0, result.output # Verify outcome: Log output. assert "Recording information snapshot" in caplog.messages @@ -126,7 +126,7 @@ def test_cfr_jobstats_view(cratedb): args="jobstats view", catch_exceptions=False, ) - assert result.exit_code == 0 + assert result.exit_code == 0, result.output # Verify outcome. info = json.loads(result.output) diff --git a/tests/cfr/test_systable.py b/tests/cfr/test_systable.py index ad6144af..d9de80a0 100644 --- a/tests/cfr/test_systable.py +++ b/tests/cfr/test_systable.py @@ -43,7 +43,7 @@ def test_cfr_sys_export_success(cratedb, tmp_path, caplog): args="--debug sys-export", catch_exceptions=False, ) - assert result.exit_code == 0 + assert result.exit_code == 0, result.output # Verify log output. assert "Exporting system tables to" in caplog.text @@ -76,7 +76,7 @@ def test_cfr_sys_export_to_archive_file(cratedb, tmp_path, caplog): args=f"--debug sys-export {target}", catch_exceptions=False, ) - assert result.exit_code == 0 + assert result.exit_code == 0, result.output # Verify log output. assert "Exporting system tables to" in caplog.text @@ -112,7 +112,7 @@ def test_cfr_sys_export_failure(cratedb, tmp_path, caplog): args="--debug sys-export", catch_exceptions=False, ) - assert result.exit_code == 1 + assert result.exit_code == 1, result.output # Verify log output. assert "Failed to establish a new connection" in caplog.text or "Failed to resolve" in caplog.text @@ -128,7 +128,7 @@ def test_cfr_sys_export_ensure_table_name_is_quoted(cratedb, tmp_path, caplog): args="--debug sys-export", catch_exceptions=False, ) - assert result.exit_code == 0 + assert result.exit_code == 0, result.output path = Path(json.loads(result.stdout)["path"]) sys_cluster_table_schema = path / "schema" / "sys-cluster.sql" @@ -186,7 +186,7 @@ def test_cfr_sys_import_success(cratedb, tmp_path, caplog): args="--debug sys-import", catch_exceptions=False, ) - assert result.exit_code == 0 + assert result.exit_code == 0, result.output # Verify log output. assert "Importing system tables from" in caplog.text @@ -212,7 +212,7 @@ def test_cfr_sys_import_failure(cratedb, tmp_path, caplog): args="--debug sys-import", catch_exceptions=False, ) - assert result.exit_code == 1 + assert result.exit_code == 1, result.output # Verify log output. assert "Failed to establish a new connection" in caplog.text or "Failed to resolve" in caplog.text From 221b100168d7e940333a768da5d1e444eb081adf Mon Sep 17 00:00:00 2001 From: Andreas Motl Date: Sat, 21 Mar 2026 16:51:02 +0100 Subject: [PATCH 2/2] Dependencies: Permit installation of click 8.3 --- CHANGES.md | 2 ++ cratedb_toolkit/cfr/cli.py | 2 +- pyproject.toml | 2 +- tests/cfr/test_systable.py | 44 ++++++++++++++++++++++---------------- tests/settings/test_cli.py | 4 ++-- 5 files changed, 31 insertions(+), 23 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index d401152d..1813ed45 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,8 @@ ## Unreleased +- Dependencies: Permitted installation of click 8.3 + ## 2026/03/16 v0.0.46 - I/O: API improvements: `ctk {load,save} table` became `ctk {load,save}` Also, the `--cluster-url` option becomes optional. That's a much more diff --git a/cratedb_toolkit/cfr/cli.py b/cratedb_toolkit/cfr/cli.py index 5b818132..d8bceddc 100644 --- a/cratedb_toolkit/cfr/cli.py +++ b/cratedb_toolkit/cfr/cli.py @@ -109,7 +109,7 @@ def job_statistics(ctx: click.Context): @click.option( "--anonymize", type=str, - is_flag=False, + is_flag=True, flag_value="decoder_dictionary.json", # Use this value when flag is used without value default=None, # No anonymization by default help="Path to the decoder dictionary file for anonymizing SQL statements", diff --git a/pyproject.toml b/pyproject.toml index 891f698b..cc3fcb6a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -93,7 +93,7 @@ dependencies = [ "attrs<27", "boltons<26", "cattrs<27", - "click<8.2", + "click<8.4", "click-aliases>=1.0.4,<2", "colorama<1", "colorlog", diff --git a/tests/cfr/test_systable.py b/tests/cfr/test_systable.py index d9de80a0..aa99bdcf 100644 --- a/tests/cfr/test_systable.py +++ b/tests/cfr/test_systable.py @@ -1,4 +1,5 @@ # ruff: noqa: E402 +import importlib import json import os.path import re @@ -7,6 +8,7 @@ import tarfile import pytest +from verlib2 import Version pymongo = pytest.importorskip("polars", reason="Skipping tests because polars is not installed") @@ -29,15 +31,25 @@ def filenames(path: Path): return sorted([item.name for item in path.iterdir()]) -def test_cfr_sys_export_success(cratedb, tmp_path, caplog): +@pytest.fixture(scope="session") +def click_kwargs(): + """ + Click 8.2 no longer understands `mix_stderr`. + """ + kwargs = {} + click_version = importlib.metadata.version("click") + if Version(click_version) < Version("8.2"): + kwargs = {"mix_stderr": False} + return kwargs + + +def test_cfr_sys_export_success(cratedb, click_kwargs, tmp_path, caplog): """ Verify `ctk cfr sys-export` works. """ # Invoke command. - runner = CliRunner( - env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi, "CFR_TARGET": str(tmp_path)}, mix_stderr=False - ) + runner = CliRunner(env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi, "CFR_TARGET": str(tmp_path)}, **click_kwargs) result = runner.invoke( cli, args="--debug sys-export", @@ -60,7 +72,7 @@ def test_cfr_sys_export_success(cratedb, tmp_path, caplog): assert len(data_files) >= 10 -def test_cfr_sys_export_to_archive_file(cratedb, tmp_path, caplog): +def test_cfr_sys_export_to_archive_file(cratedb, click_kwargs, tmp_path, caplog): """ Verify `ctk cfr sys-export some-file.tgz` works. """ @@ -68,9 +80,7 @@ def test_cfr_sys_export_to_archive_file(cratedb, tmp_path, caplog): target = os.path.join(tmp_path, "cluster-data.tgz") # Invoke command. - runner = CliRunner( - env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi, "CFR_TARGET": str(tmp_path)}, mix_stderr=False - ) + runner = CliRunner(env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi, "CFR_TARGET": str(tmp_path)}, **click_kwargs) result = runner.invoke( cli, args=f"--debug sys-export {target}", @@ -100,13 +110,13 @@ def test_cfr_sys_export_to_archive_file(cratedb, tmp_path, caplog): assert len(data_files) >= 10 -def test_cfr_sys_export_failure(cratedb, tmp_path, caplog): +def test_cfr_sys_export_failure(cratedb, click_kwargs, tmp_path, caplog): """ Verify `ctk cfr sys-export` failure. """ # Invoke command. - runner = CliRunner(env={"CRATEDB_CLUSTER_URL": "crate://foo.bar/", "CFR_TARGET": str(tmp_path)}, mix_stderr=False) + runner = CliRunner(env={"CRATEDB_CLUSTER_URL": "crate://foo.bar/", "CFR_TARGET": str(tmp_path)}, **click_kwargs) result = runner.invoke( cli, args="--debug sys-export", @@ -119,10 +129,8 @@ def test_cfr_sys_export_failure(cratedb, tmp_path, caplog): assert result.output == "" -def test_cfr_sys_export_ensure_table_name_is_quoted(cratedb, tmp_path, caplog): - runner = CliRunner( - env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi, "CFR_TARGET": str(tmp_path)}, mix_stderr=False - ) +def test_cfr_sys_export_ensure_table_name_is_quoted(cratedb, click_kwargs, tmp_path, caplog): + runner = CliRunner(env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi, "CFR_TARGET": str(tmp_path)}, **click_kwargs) result = runner.invoke( cli, args="--debug sys-export", @@ -178,9 +186,7 @@ def test_cfr_sys_import_success(cratedb, tmp_path, caplog): shutil.copy(sys_operations_data, data_path) # Invoke command. - runner = CliRunner( - env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi, "CFR_SOURCE": str(tmp_path)}, mix_stderr=False - ) + runner = CliRunner(env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi, "CFR_SOURCE": str(tmp_path)}) result = runner.invoke( cli, args="--debug sys-import", @@ -200,13 +206,13 @@ def test_cfr_sys_import_success(cratedb, tmp_path, caplog): assert cratedb.database.count_records("sys-operations") == 1 -def test_cfr_sys_import_failure(cratedb, tmp_path, caplog): +def test_cfr_sys_import_failure(cratedb, click_kwargs, tmp_path, caplog): """ Verify `ctk cfr sys-import` failure. """ # Invoke command. - runner = CliRunner(env={"CRATEDB_CLUSTER_URL": "crate://foo.bar/", "CFR_SOURCE": str(tmp_path)}, mix_stderr=False) + runner = CliRunner(env={"CRATEDB_CLUSTER_URL": "crate://foo.bar/", "CFR_SOURCE": str(tmp_path)}, **click_kwargs) result = runner.invoke( cli, args="--debug sys-import", diff --git a/tests/settings/test_cli.py b/tests/settings/test_cli.py index cff157c1..54322344 100644 --- a/tests/settings/test_cli.py +++ b/tests/settings/test_cli.py @@ -9,7 +9,7 @@ def test_settings_list(cratedb, caplog): """ # Invoke command. - runner = CliRunner(env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi}, mix_stderr=False) + runner = CliRunner(env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi}) result = runner.invoke( cli, args="list", @@ -26,7 +26,7 @@ def test_settings_compare(cratedb, caplog): """ # Invoke command. - runner = CliRunner(env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi}, mix_stderr=False) + runner = CliRunner(env={"CRATEDB_CLUSTER_URL": cratedb.database.dburi}) result = runner.invoke( cli, args="compare --no-color",