pyPhotoAlbum/tests/test_loading_widget.py
Duncan Tourolle b18a780a33
All checks were successful
Python CI / test (push) Successful in 1m28s
Lint / lint (push) Successful in 1m4s
Tests / test (3.11) (push) Successful in 1m41s
Tests / test (3.12) (push) Successful in 1m42s
Tests / test (3.13) (push) Successful in 1m35s
Tests / test (3.14) (push) Successful in 1m15s
increase test coverage
2025-11-28 19:54:41 +01:00

392 lines
11 KiB
Python

"""
Tests for loading_widget module
"""
import pytest
from unittest.mock import Mock, patch
from PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QWidget
class TestLoadingWidget:
"""Tests for LoadingWidget class"""
def test_init(self, qtbot):
"""Test LoadingWidget initialization"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
assert widget.isHidden()
assert widget.width() == 280
assert widget.height() == 80
def test_init_with_parent(self, qtbot):
"""Test LoadingWidget initialization with parent"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
assert widget.parent() == parent
def test_opacity_property(self, qtbot):
"""Test opacity property getter and setter"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
# Test getter
assert widget.opacity == 1.0
# Test setter
widget.opacity = 0.5
assert widget.opacity == 0.5
def test_show_loading(self, qtbot):
"""Test showing the loading widget"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
widget.show_loading("Processing...")
assert widget.isVisible()
assert widget._status_label.text() == "Processing..."
assert widget._progress_bar.value() == 0
def test_show_loading_default_message(self, qtbot):
"""Test showing loading widget with default message"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
widget.show_loading()
assert widget._status_label.text() == "Loading..."
def test_hide_loading(self, qtbot):
"""Test hiding the loading widget"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
# Show first
widget.show_loading()
assert widget.isVisible()
# Then hide
widget.hide_loading()
# Animation starts but widget may not be immediately hidden
# Just verify the method runs without error
def test_set_status(self, qtbot):
"""Test setting status message"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
widget.set_status("Processing files...")
assert widget._status_label.text() == "Processing files..."
def test_set_progress(self, qtbot):
"""Test setting progress value"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
widget.set_progress(50)
assert widget._progress_bar.value() == 50
assert widget._progress_bar.maximum() == 100
def test_set_progress_with_custom_maximum(self, qtbot):
"""Test setting progress with custom maximum"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
widget.set_progress(75, maximum=200)
assert widget._progress_bar.value() == 75
assert widget._progress_bar.maximum() == 200
def test_set_indeterminate_true(self, qtbot):
"""Test setting indeterminate mode to True"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
widget.set_indeterminate(True)
assert widget._progress_bar.minimum() == 0
assert widget._progress_bar.maximum() == 0
def test_set_indeterminate_false(self, qtbot):
"""Test setting indeterminate mode to False"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
# First set to indeterminate
widget.set_indeterminate(True)
# Then set back to normal
widget.set_indeterminate(False)
assert widget._progress_bar.minimum() == 0
assert widget._progress_bar.maximum() == 100
def test_reposition_with_parent(self, qtbot):
"""Test repositioning in lower-right corner of parent"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
widget._reposition()
# Should be in lower-right corner with 20px margin
expected_x = 800 - 280 - 20
expected_y = 600 - 80 - 20
assert widget.x() == expected_x
assert widget.y() == expected_y
def test_reposition_no_parent(self, qtbot):
"""Test repositioning when there's no parent"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
# Should not crash
widget._reposition()
def test_show_event(self, qtbot):
"""Test show event triggers repositioning"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
with patch.object(widget, '_reposition') as mock_reposition:
widget.show()
mock_reposition.assert_called()
def test_resize_parent(self, qtbot):
"""Test resizeParent method"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
widget.show_loading()
# Resize parent
parent.resize(1000, 800)
with patch.object(widget, '_reposition') as mock_reposition:
widget.resizeParent()
mock_reposition.assert_called_once()
def test_resize_parent_when_hidden(self, qtbot):
"""Test resizeParent when widget is hidden"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
# Widget is hidden by default
with patch.object(widget, '_reposition') as mock_reposition:
widget.resizeParent()
# Should not call reposition when hidden
mock_reposition.assert_not_called()
def test_fade_animation_on_show(self, qtbot):
"""Test fade animation starts on show_loading"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
widget.show_loading("Test")
# Animation should be running
assert widget._fade_animation.state() != 0 # Not stopped
def test_fade_animation_on_hide(self, qtbot):
"""Test fade animation starts on hide_loading"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
widget.show_loading()
widget.hide_loading()
# Animation should be running
assert widget._fade_animation.state() != 0 # Not stopped
def test_progress_bar_format(self, qtbot):
"""Test progress bar displays percentage format"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
assert widget._progress_bar.format() == "%p%"
def test_progress_bar_text_visible(self, qtbot):
"""Test progress bar text is visible"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
assert widget._progress_bar.isTextVisible() is True
def test_window_flags(self, qtbot):
"""Test widget has correct window flags"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
flags = widget.windowFlags()
assert Qt.WindowType.ToolTip in Qt.WindowType(flags)
assert Qt.WindowType.FramelessWindowHint in Qt.WindowType(flags)
def test_fixed_size(self, qtbot):
"""Test widget has fixed size"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
assert widget.minimumWidth() == 280
assert widget.maximumWidth() == 280
assert widget.minimumHeight() == 80
assert widget.maximumHeight() == 80
def test_sequential_show_hide(self, qtbot):
"""Test showing and hiding widget multiple times"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
# First cycle
widget.show_loading("Task 1")
widget.set_progress(50)
widget.hide_loading()
# Second cycle
widget.show_loading("Task 2")
widget.set_progress(25)
assert widget._status_label.text() == "Task 2"
assert widget._progress_bar.value() == 25
def test_update_progress_while_visible(self, qtbot):
"""Test updating progress while widget is visible"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
widget.show_loading("Processing")
# Update progress multiple times
for i in range(0, 101, 10):
widget.set_progress(i)
assert widget._progress_bar.value() == i
def test_status_label_alignment(self, qtbot):
"""Test status label is left-aligned"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
assert widget._status_label.alignment() == Qt.AlignmentFlag.AlignLeft
def test_initial_opacity(self, qtbot):
"""Test initial opacity value"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
assert widget._opacity == 1.0
def test_fade_animation_duration(self, qtbot):
"""Test fade animation has correct duration"""
from pyPhotoAlbum.loading_widget import LoadingWidget
widget = LoadingWidget()
qtbot.addWidget(widget)
assert widget._fade_animation.duration() == 300
def test_show_loading_resets_progress(self, qtbot):
"""Test that show_loading resets progress to 0"""
from pyPhotoAlbum.loading_widget import LoadingWidget
parent = QWidget()
parent.resize(800, 600)
qtbot.addWidget(parent)
widget = LoadingWidget(parent)
# Set some progress
widget.set_progress(75)
# Show loading should reset to 0
widget.show_loading("New task")
assert widget._progress_bar.value() == 0