From f36c28f41eace147f032df545c2f7a8ab745063d Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Mon, 11 May 2026 09:05:32 -0500 Subject: [PATCH 1/2] TST: Pytest-mpl for confusion matrix --- .github/workflows/tests.yml | 2 +- tests/test_confusion_matrix.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cfeacfc..489ac47 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -24,7 +24,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install pytest pytest-asyncio openai python-dotenv Pillow matplotlib pandas aiohttp scikit-learn + pip install pytest pytest-asyncio openai python-dotenv Pillow matplotlib pandas aiohttp scikit-learn pytest-mpl pip install -e . - name: Run tests diff --git a/tests/test_confusion_matrix.py b/tests/test_confusion_matrix.py index 7e1a9e8..366123d 100644 --- a/tests/test_confusion_matrix.py +++ b/tests/test_confusion_matrix.py @@ -26,6 +26,14 @@ def close_figures(): plt.close("all") +@pytest.mark.mpl_image_compare(tolerance=60) +def test_plotting(sample_df): + from lars.util.confusion_matrix import plot_confusion_matrix + + fig, ax = plt.subplots() + plot_confusion_matrix(sample_df, ax=ax) + return fig + def test_title_is_set(sample_df): from lars.util.confusion_matrix import plot_confusion_matrix From 449e1155533601203f01c2ed4af0ba92c12d7bcb Mon Sep 17 00:00:00 2001 From: Robert Jackson Date: Mon, 11 May 2026 09:08:19 -0500 Subject: [PATCH 2/2] ADD: PNG file --- tests/baseline/test_plotting.png | Bin 0 -> 23150 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/baseline/test_plotting.png diff --git a/tests/baseline/test_plotting.png b/tests/baseline/test_plotting.png new file mode 100644 index 0000000000000000000000000000000000000000..c20f410a4d657f2601479ee9d87a49772d95b530 GIT binary patch literal 23150 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