From a8b7d49c200f93bbfdb96c131d20fbd9c57b9c7d Mon Sep 17 00:00:00 2001 From: Carson Sears Date: Mon, 25 Mar 2024 14:52:54 -0500 Subject: [PATCH 1/2] full test coverage --- pyproject.toml | 5 +++ tests/tabs/home/model/test_home_presenter.py | 40 +++++++++++++++++++ tests/tabs/home/views/test_home.py | 18 +++++++++ tests/utility/test_gui.py | 33 +++++++++++++++ tests/utility/test_logger.py | 14 +++++++ .../ui_elements/test_base_tablewidget.py | 3 +- 6 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 tests/tabs/home/model/test_home_presenter.py create mode 100644 tests/utility/test_gui.py create mode 100644 tests/utility/test_logger.py diff --git a/pyproject.toml b/pyproject.toml index 25f94cc..cbe77ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,11 @@ markers = [ "datarepo: Tests that require the test-data submodule" ] +[tool.coverage.run] +omit = ["src/garnet/_version.py", + "src/garnet/__init__.py", + "src/garnet/version.py",] + [tool.ruff] line-length = 119 diff --git a/tests/tabs/home/model/test_home_presenter.py b/tests/tabs/home/model/test_home_presenter.py new file mode 100644 index 0000000..2706245 --- /dev/null +++ b/tests/tabs/home/model/test_home_presenter.py @@ -0,0 +1,40 @@ +"""Unit test for the garnet.tabs.home.model.home_presenter.py HomePresenter.""" + +import unittest +from typing import Any +from unittest.mock import MagicMock + +# Import the HomePresenter class to be tested +from garnet.home.model import HomeModel +from garnet.home.presenter import HomePresenter +from garnet.home.view import HomeView + + +class TestHomePresenter(unittest.TestCase): + """Test the HomePresenter class.""" + + def test_init(self: Any) -> None: + """Test the HomePresenter constructor.""" + mock_view = MagicMock(spec=HomeView) + mock_model = MagicMock(spec=HomeModel) + + presenter = HomePresenter(mock_view, mock_model) + + assert presenter._view is mock_view + assert presenter._model is mock_model + + def test_view_property(self: Any) -> None: + """Test the view property.""" + mock_view = MagicMock(spec=HomeView) + mock_model = MagicMock(spec=HomeModel) + + presenter = HomePresenter(mock_view, mock_model) + assert presenter.view is mock_view + + def test_model_property(self: Any) -> None: + """Test the model property.""" + mock_view = MagicMock(spec=HomeView) + mock_model = MagicMock(spec=HomeModel) + + presenter = HomePresenter(mock_view, mock_model) + assert presenter.model is mock_model diff --git a/tests/tabs/home/views/test_home.py b/tests/tabs/home/views/test_home.py index 96ac4d8..7b5dd15 100644 --- a/tests/tabs/home/views/test_home.py +++ b/tests/tabs/home/views/test_home.py @@ -17,6 +17,10 @@ def test_plan_name(qtbot: pytest.fixture): qtbot.keyClicks(window.plan_name, "Plan Name") assert window.save_button.isEnabled() is True + for _ in range(10): + qtbot.keyClick(window.plan_name, QtCore.Qt.Key_Backspace) + assert window.save_button.isEnabled() is False + def test_wavelength(qtbot: pytest.fixture): """Test that the wavelength LineEdit is required and has default value""" @@ -33,3 +37,17 @@ def test_wavelength(qtbot: pytest.fixture): for _ in range(10): qtbot.keyClick(window.wavelength, QtCore.Qt.Key_Backspace) assert window.save_button.isEnabled() is False + + +def test_save_reduction_plan(qtbot: pytest.fixture): + """Test that the save button is enabled when both fields are filled""" + window = HomeView() + qtbot.addWidget(window) + window.show() + + assert window.save_button.isEnabled() is False + qtbot.keyClicks(window.plan_name, "Plan Name") + assert window.save_button.isEnabled() is True + + window.save_button.click() + assert window.save_button.isEnabled() is True diff --git a/tests/utility/test_gui.py b/tests/utility/test_gui.py new file mode 100644 index 0000000..2b0d4b8 --- /dev/null +++ b/tests/utility/test_gui.py @@ -0,0 +1,33 @@ +"""Test the garnet.garnet.gui function + +This is the entry point for the GUI application. +""" + +import sys +from unittest import mock +from unittest.mock import patch + +import pytest +from garnet.garnet import gui + + +def test_gui_version(): + """Test the version flag.""" + t_argv = sys.argv.copy() + sys.argv.append("--version") + with pytest.raises(SystemExit) as excinfo: + gui() + assert excinfo.value.code is None + sys.argv = t_argv + + +@patch("garnet.garnet.QApplication") +@patch("garnet.garnet.Garnet") +def test_gui(mock_garnet: mock, mock_qtapp: mock): + """Test the GUI entry point.""" + with pytest.raises(SystemExit) as excinfo: + gui() + + assert excinfo.type == SystemExit + assert mock_garnet.called + assert mock_qtapp.called diff --git a/tests/utility/test_logger.py b/tests/utility/test_logger.py new file mode 100644 index 0000000..dc9eaf8 --- /dev/null +++ b/tests/utility/test_logger.py @@ -0,0 +1,14 @@ +"""Tests for the Logger class in garnet/logger.py.""" + +from garnet.logger import Logger +from mantid.kernel import Logger as mantid_logger # noqa: N813 + + +def test_get_logger(): + """Test getting the logger.""" + logger_name = "custom_logger" + logger = Logger(logger_name) + logger.get(logger_name) + + # Assert that the returned logger instance is correct + assert isinstance(logger, mantid_logger) diff --git a/tests/utility/ui_elements/test_base_tablewidget.py b/tests/utility/ui_elements/test_base_tablewidget.py index f7bf117..f61694f 100644 --- a/tests/utility/ui_elements/test_base_tablewidget.py +++ b/tests/utility/ui_elements/test_base_tablewidget.py @@ -29,7 +29,8 @@ def test_with_args(): """Test setting the read only style.""" num_rows = 12 num_columns = 3 - base_table_widget = BaseTableWidget(num_rows, num_columns, required=True) + # QTableWidget(12, 3, parent=None) + base_table_widget = BaseTableWidget(num_rows, num_columns) assert base_table_widget.rowCount() == num_rows assert base_table_widget.columnCount() == num_columns From d65976b9ac358d31a1d18d266e168bfb42e83339 Mon Sep 17 00:00:00 2001 From: Carson Sears Date: Tue, 26 Mar 2024 14:05:00 -0500 Subject: [PATCH 2/2] Fixes from PR review --- pyproject.toml | 9 +++++---- .../home/{model => presenter}/test_home_presenter.py | 0 2 files changed, 5 insertions(+), 4 deletions(-) rename tests/tabs/home/{model => presenter}/test_home_presenter.py (100%) diff --git a/pyproject.toml b/pyproject.toml index cbe77ad..89f830b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,10 +47,11 @@ markers = [ "datarepo: Tests that require the test-data submodule" ] -[tool.coverage.run] -omit = ["src/garnet/_version.py", - "src/garnet/__init__.py", - "src/garnet/version.py",] +[tool.coverage.report] +exclude_lines = [ + "except ImportError:", + "except ModuleNotFoundError:", +] [tool.ruff] line-length = 119 diff --git a/tests/tabs/home/model/test_home_presenter.py b/tests/tabs/home/presenter/test_home_presenter.py similarity index 100% rename from tests/tabs/home/model/test_home_presenter.py rename to tests/tabs/home/presenter/test_home_presenter.py