pyPhotoAlbum/tests/test_text_edit_dialog.py
Duncan Tourolle 8f1e906884
All checks were successful
Python CI / test (push) Successful in 1m27s
Lint / lint (push) Successful in 1m6s
Tests / test (3.11) (push) Successful in 1m42s
Tests / test (3.12) (push) Successful in 1m43s
Tests / test (3.13) (push) Successful in 1m37s
Tests / test (3.14) (push) Successful in 1m16s
justified test and two finger scrolling
2025-12-01 20:40:11 +01:00

416 lines
15 KiB
Python

"""
Tests for text_edit_dialog module
"""
import pytest
from unittest.mock import Mock, patch
from PyQt6.QtGui import QColor
class TestTextEditDialogInit:
"""Tests for TextEditDialog initialization"""
def test_init_basic(self, qtbot):
"""Test basic dialog initialization"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = "Hello World"
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
assert dialog.text_element == mock_text_element
assert dialog.windowTitle() == "Edit Text"
def test_init_loads_text_content(self, qtbot):
"""Test that init loads text content from element"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = "Test content here"
mock_text_element.font_settings = {"family": "Arial", "size": 14, "color": (0, 0, 0)}
mock_text_element.alignment = "center"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
assert dialog.text_edit.toPlainText() == "Test content here"
def test_init_loads_font_family(self, qtbot):
"""Test that init loads font family from element"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Georgia", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
assert dialog.font_combo.currentText() == "Georgia"
def test_init_loads_font_size(self, qtbot):
"""Test that init loads font size from element"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 24, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
assert dialog.font_size_spin.value() == 24
def test_init_loads_color_255_range(self, qtbot):
"""Test that init loads color in 0-255 range"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (255, 128, 64)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
assert dialog.current_color.red() == 255
assert dialog.current_color.green() == 128
assert dialog.current_color.blue() == 64
def test_init_loads_color_01_range(self, qtbot):
"""Test that init loads color in 0-1 range"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (1.0, 0.5, 0.0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
assert dialog.current_color.red() == 255
assert dialog.current_color.green() == 127
assert dialog.current_color.blue() == 0
def test_init_loads_alignment(self, qtbot):
"""Test that init loads alignment from element"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "right"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
assert dialog.alignment_combo.currentText() == "right"
def test_init_handles_unknown_font(self, qtbot):
"""Test that init handles unknown font family gracefully"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "UnknownFont", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
# Should not crash, will keep default selection
assert dialog.font_combo.currentIndex() >= 0
def test_init_handles_default_values(self, qtbot):
"""Test that init handles missing font settings"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {} # Empty settings
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
# Should use defaults
assert dialog.font_size_spin.value() == 12
class TestTextEditDialogUI:
"""Tests for TextEditDialog UI elements"""
def test_font_size_range(self, qtbot):
"""Test that font size spinner has correct range"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
assert dialog.font_size_spin.minimum() == 6
assert dialog.font_size_spin.maximum() == 72
def test_alignment_options(self, qtbot):
"""Test that alignment combo has correct options"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
options = [dialog.alignment_combo.itemText(i) for i in range(dialog.alignment_combo.count())]
assert "left" in options
assert "center" in options
assert "right" in options
assert "justify" in options
def test_font_options(self, qtbot):
"""Test that font combo has expected fonts"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
fonts = [dialog.font_combo.itemText(i) for i in range(dialog.font_combo.count())]
assert "Arial" in fonts
assert "Times New Roman" in fonts
assert "Courier New" in fonts
class TestChooseColor:
"""Tests for _choose_color method"""
def test_choose_color_updates_current_color(self, qtbot):
"""Test that choosing color updates current_color"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
# Mock QColorDialog to return a specific color
with patch("pyPhotoAlbum.text_edit_dialog.QColorDialog.getColor") as mock_get_color:
mock_color = QColor(255, 0, 0)
mock_get_color.return_value = mock_color
dialog._choose_color()
assert dialog.current_color.red() == 255
assert dialog.current_color.green() == 0
assert dialog.current_color.blue() == 0
def test_choose_color_invalid_does_not_update(self, qtbot):
"""Test that invalid color choice does not update current_color"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
original_color = QColor(dialog.current_color)
# Mock QColorDialog to return invalid color (user cancelled)
with patch("pyPhotoAlbum.text_edit_dialog.QColorDialog.getColor") as mock_get_color:
mock_get_color.return_value = QColor() # Invalid color
dialog._choose_color()
# Color should remain unchanged
assert dialog.current_color == original_color
class TestUpdateColorButton:
"""Tests for _update_color_button method"""
def test_update_color_button_dark_color(self, qtbot):
"""Test color button with dark color uses white text"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
dialog.current_color = QColor(0, 0, 0) # Black
dialog._update_color_button()
stylesheet = dialog.color_button.styleSheet()
assert "color: white" in stylesheet
def test_update_color_button_light_color(self, qtbot):
"""Test color button with light color uses black text"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (255, 255, 255)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
dialog.current_color = QColor(255, 255, 255) # White
dialog._update_color_button()
stylesheet = dialog.color_button.styleSheet()
assert "color: black" in stylesheet
class TestGetValues:
"""Tests for get_values method"""
def test_get_values_returns_text(self, qtbot):
"""Test get_values returns text content"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = "Original"
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
dialog.text_edit.setPlainText("New text content")
values = dialog.get_values()
assert values["text_content"] == "New text content"
def test_get_values_returns_font_settings(self, qtbot):
"""Test get_values returns font settings"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
dialog.font_combo.setCurrentText("Georgia")
dialog.font_size_spin.setValue(18)
dialog.current_color = QColor(100, 150, 200)
values = dialog.get_values()
assert values["font_settings"]["family"] == "Georgia"
assert values["font_settings"]["size"] == 18
assert values["font_settings"]["color"] == (100, 150, 200)
def test_get_values_returns_alignment(self, qtbot):
"""Test get_values returns alignment"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
dialog.alignment_combo.setCurrentText("center")
values = dialog.get_values()
assert values["alignment"] == "center"
def test_get_values_complete_structure(self, qtbot):
"""Test get_values returns complete structure"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
mock_text_element = Mock()
mock_text_element.text_content = "Test"
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
values = dialog.get_values()
# Check structure
assert "text_content" in values
assert "font_settings" in values
assert "alignment" in values
assert "family" in values["font_settings"]
assert "size" in values["font_settings"]
assert "color" in values["font_settings"]
class TestDialogButtons:
"""Tests for dialog buttons"""
def test_cancel_button_rejects(self, qtbot):
"""Test that cancel button rejects the dialog"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
from PyQt6.QtWidgets import QPushButton
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
# Find cancel button
buttons = dialog.findChildren(QPushButton)
cancel_button = next(b for b in buttons if b.text() == "Cancel")
# Click should reject
with qtbot.waitSignal(dialog.rejected, timeout=1000):
cancel_button.click()
def test_ok_button_accepts(self, qtbot):
"""Test that OK button accepts the dialog"""
from pyPhotoAlbum.text_edit_dialog import TextEditDialog
from PyQt6.QtWidgets import QPushButton
mock_text_element = Mock()
mock_text_element.text_content = ""
mock_text_element.font_settings = {"family": "Arial", "size": 12, "color": (0, 0, 0)}
mock_text_element.alignment = "left"
dialog = TextEditDialog(mock_text_element)
qtbot.addWidget(dialog)
# Find OK button
buttons = dialog.findChildren(QPushButton)
ok_button = next(b for b in buttons if b.text() == "OK")
# Click should accept
with qtbot.waitSignal(dialog.accepted, timeout=1000):
ok_button.click()