pyPhotoAlbum/tests/test_distribution_ops_mixin.py
Duncan Tourolle f6ed11b0bc
All checks were successful
Python CI / test (push) Successful in 1m20s
Lint / lint (push) Successful in 1m4s
Tests / test (3.11) (push) Successful in 1m27s
Tests / test (3.12) (push) Successful in 2m25s
Tests / test (3.13) (push) Successful in 2m52s
Tests / test (3.14) (push) Successful in 1m9s
black formatting
2025-11-27 23:07:16 +01:00

195 lines
7.1 KiB
Python
Executable File

"""
Tests for DistributionOperationsMixin
"""
import pytest
from unittest.mock import Mock, patch
from PyQt6.QtWidgets import QMainWindow
from pyPhotoAlbum.mixins.operations.distribution_ops import DistributionOperationsMixin
from pyPhotoAlbum.models import ImageData
from pyPhotoAlbum.commands import CommandHistory
class TestDistributionWindow(DistributionOperationsMixin, QMainWindow):
"""Test window with distribution operations mixin"""
def __init__(self):
super().__init__()
self.gl_widget = Mock()
self.gl_widget.selected_elements = set()
self.project = Mock()
self.project.history = CommandHistory()
self._update_view_called = False
self._status_message = None
self._require_selection_count = None
def require_selection(self, min_count=1):
self._require_selection_count = min_count
return len(self.gl_widget.selected_elements) >= min_count
def update_view(self):
self._update_view_called = True
def show_status(self, message, timeout=0):
self._status_message = message
class TestGetSelectedElementsList:
"""Test _get_selected_elements_list helper"""
def test_get_selected_elements_list(self, qtbot):
window = TestDistributionWindow()
qtbot.addWidget(window)
element1 = ImageData(image_path="/test1.jpg", x=0, y=0, width=100, height=100)
element2 = ImageData(image_path="/test2.jpg", x=100, y=100, width=100, height=100)
element3 = ImageData(image_path="/test3.jpg", x=200, y=200, width=100, height=100)
window.gl_widget.selected_elements = {element1, element2, element3}
result = window._get_selected_elements_list()
assert isinstance(result, list)
assert len(result) == 3
class TestDistributeHorizontally:
"""Test distribute_horizontally method"""
@patch("pyPhotoAlbum.mixins.operations.distribution_ops.AlignmentManager")
def test_distribute_horizontally_success(self, mock_manager, qtbot):
window = TestDistributionWindow()
qtbot.addWidget(window)
element1 = ImageData(image_path="/test1.jpg", x=0, y=0, width=100, height=100)
element2 = ImageData(image_path="/test2.jpg", x=150, y=0, width=100, height=100)
element3 = ImageData(image_path="/test3.jpg", x=500, y=0, width=100, height=100)
window.gl_widget.selected_elements = {element1, element2, element3}
mock_manager.distribute_horizontally.return_value = [
(element1, (0, 0)),
(element2, (150, 0)),
(element3, (500, 0)),
]
window.distribute_horizontally()
assert mock_manager.distribute_horizontally.called
assert window._update_view_called
assert "distributed" in window._status_message.lower()
assert "horizontally" in window._status_message.lower()
def test_distribute_horizontally_insufficient_selection(self, qtbot):
window = TestDistributionWindow()
qtbot.addWidget(window)
element1 = ImageData(image_path="/test1.jpg", x=0, y=0, width=100, height=100)
element2 = ImageData(image_path="/test2.jpg", x=100, y=100, width=100, height=100)
window.gl_widget.selected_elements = {element1, element2}
window.distribute_horizontally()
assert window._require_selection_count == 3
assert not window._update_view_called
class TestDistributeVertically:
"""Test distribute_vertically method"""
@patch("pyPhotoAlbum.mixins.operations.distribution_ops.AlignmentManager")
def test_distribute_vertically_success(self, mock_manager, qtbot):
window = TestDistributionWindow()
qtbot.addWidget(window)
element1 = ImageData(image_path="/test1.jpg", x=0, y=0, width=100, height=100)
element2 = ImageData(image_path="/test2.jpg", x=0, y=150, width=100, height=100)
element3 = ImageData(image_path="/test3.jpg", x=0, y=500, width=100, height=100)
window.gl_widget.selected_elements = {element1, element2, element3}
mock_manager.distribute_vertically.return_value = [
(element1, (0, 0)),
(element2, (0, 150)),
(element3, (0, 500)),
]
window.distribute_vertically()
assert mock_manager.distribute_vertically.called
assert window._update_view_called
assert "vertically" in window._status_message.lower()
class TestSpaceHorizontally:
"""Test space_horizontally method"""
@patch("pyPhotoAlbum.mixins.operations.distribution_ops.AlignmentManager")
def test_space_horizontally_success(self, mock_manager, qtbot):
window = TestDistributionWindow()
qtbot.addWidget(window)
element1 = ImageData(image_path="/test1.jpg", x=0, y=0, width=100, height=100)
element2 = ImageData(image_path="/test2.jpg", x=100, y=0, width=100, height=100)
element3 = ImageData(image_path="/test3.jpg", x=200, y=0, width=100, height=100)
window.gl_widget.selected_elements = {element1, element2, element3}
mock_manager.space_horizontally.return_value = [(element1, (0, 0)), (element2, (100, 0)), (element3, (200, 0))]
window.space_horizontally()
assert mock_manager.space_horizontally.called
assert window._update_view_called
assert "spaced" in window._status_message.lower()
class TestSpaceVertically:
"""Test space_vertically method"""
@patch("pyPhotoAlbum.mixins.operations.distribution_ops.AlignmentManager")
def test_space_vertically_success(self, mock_manager, qtbot):
window = TestDistributionWindow()
qtbot.addWidget(window)
element1 = ImageData(image_path="/test1.jpg", x=0, y=0, width=100, height=100)
element2 = ImageData(image_path="/test2.jpg", x=0, y=100, width=100, height=100)
element3 = ImageData(image_path="/test3.jpg", x=0, y=200, width=100, height=100)
window.gl_widget.selected_elements = {element1, element2, element3}
mock_manager.space_vertically.return_value = [(element1, (0, 0)), (element2, (0, 100)), (element3, (0, 200))]
window.space_vertically()
assert mock_manager.space_vertically.called
assert window._update_view_called
class TestDistributionCommandPattern:
"""Test distribution operations with command pattern"""
@patch("pyPhotoAlbum.mixins.operations.distribution_ops.AlignmentManager")
def test_distribution_creates_command(self, mock_manager, qtbot):
window = TestDistributionWindow()
qtbot.addWidget(window)
element1 = ImageData(image_path="/test1.jpg", x=0, y=0, width=100, height=100)
element2 = ImageData(image_path="/test2.jpg", x=100, y=0, width=100, height=100)
element3 = ImageData(image_path="/test3.jpg", x=200, y=0, width=100, height=100)
window.gl_widget.selected_elements = {element1, element2, element3}
mock_manager.distribute_horizontally.return_value = [
(element1, (0, 0)),
(element2, (100, 0)),
(element3, (200, 0)),
]
assert not window.project.history.can_undo()
window.distribute_horizontally()
assert window.project.history.can_undo()