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
392 lines
11 KiB
Python
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
|