191 lines
4.9 KiB
Python
191 lines
4.9 KiB
Python
"""
|
|
Shared fixtures for GLWidget mixin tests
|
|
"""
|
|
|
|
import pytest
|
|
from unittest.mock import Mock, MagicMock, patch
|
|
from PyQt6.QtCore import Qt, QPointF
|
|
from PyQt6.QtGui import QMouseEvent, QWheelEvent
|
|
from pyPhotoAlbum.models import ImageData, PlaceholderData, TextBoxData
|
|
from pyPhotoAlbum.project import Project, Page
|
|
from pyPhotoAlbum.page_layout import PageLayout
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_main_window():
|
|
"""Create a mock main window with a basic project"""
|
|
window = Mock()
|
|
window.project = Project(name="Test Project")
|
|
|
|
# Add a test page
|
|
page = Page(
|
|
layout=PageLayout(width=210, height=297), # A4 size in mm
|
|
page_number=1
|
|
)
|
|
window.project.pages.append(page)
|
|
window.project.working_dpi = 96
|
|
window.project.page_size_mm = (210, 297)
|
|
window.project.page_spacing_mm = 10
|
|
|
|
# Mock status bar
|
|
window.status_bar = Mock()
|
|
window.status_bar.showMessage = Mock()
|
|
window.show_status = Mock()
|
|
|
|
return window
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_image_element():
|
|
"""Create a sample ImageData element for testing"""
|
|
return ImageData(
|
|
image_path="test.jpg",
|
|
x=100,
|
|
y=100,
|
|
width=200,
|
|
height=150,
|
|
z_index=1
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_placeholder_element():
|
|
"""Create a sample PlaceholderData element for testing"""
|
|
return PlaceholderData(
|
|
x=50,
|
|
y=50,
|
|
width=100,
|
|
height=100,
|
|
z_index=0
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_textbox_element():
|
|
"""Create a sample TextBoxData element for testing"""
|
|
return TextBoxData(
|
|
x=10,
|
|
y=10,
|
|
width=180,
|
|
height=50,
|
|
text_content="Test Text",
|
|
z_index=2
|
|
)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_page_renderer():
|
|
"""Create a mock PageRenderer"""
|
|
renderer = Mock()
|
|
renderer.screen_x = 50
|
|
renderer.screen_y = 50
|
|
renderer.zoom = 1.0
|
|
renderer.dpi = 96
|
|
|
|
# Mock coordinate conversion methods
|
|
def page_to_screen(x, y):
|
|
return (renderer.screen_x + x * renderer.zoom,
|
|
renderer.screen_y + y * renderer.zoom)
|
|
|
|
def screen_to_page(x, y):
|
|
return ((x - renderer.screen_x) / renderer.zoom,
|
|
(y - renderer.screen_y) / renderer.zoom)
|
|
|
|
def is_point_in_page(x, y):
|
|
# Simple bounds check (assume 210mm x 297mm page at 96 DPI)
|
|
page_width_px = 210 * 96 / 25.4
|
|
page_height_px = 297 * 96 / 25.4
|
|
return (renderer.screen_x <= x <= renderer.screen_x + page_width_px * renderer.zoom and
|
|
renderer.screen_y <= y <= renderer.screen_y + page_height_px * renderer.zoom)
|
|
|
|
renderer.page_to_screen = page_to_screen
|
|
renderer.screen_to_page = screen_to_page
|
|
renderer.is_point_in_page = is_point_in_page
|
|
|
|
return renderer
|
|
|
|
|
|
@pytest.fixture
|
|
def create_mouse_event():
|
|
"""Factory fixture for creating QMouseEvent objects"""
|
|
def _create_event(event_type, x, y, button=Qt.MouseButton.LeftButton,
|
|
modifiers=Qt.KeyboardModifier.NoModifier):
|
|
"""Create a QMouseEvent for testing
|
|
|
|
Args:
|
|
event_type: QEvent.Type (MouseButtonPress, MouseButtonRelease, MouseMove)
|
|
x, y: Position coordinates
|
|
button: Mouse button
|
|
modifiers: Keyboard modifiers
|
|
"""
|
|
pos = QPointF(x, y)
|
|
return QMouseEvent(
|
|
event_type,
|
|
pos,
|
|
button,
|
|
button,
|
|
modifiers
|
|
)
|
|
return _create_event
|
|
|
|
|
|
@pytest.fixture
|
|
def create_wheel_event():
|
|
"""Factory fixture for creating QWheelEvent objects"""
|
|
def _create_event(x, y, delta_y=120, modifiers=Qt.KeyboardModifier.NoModifier):
|
|
"""Create a QWheelEvent for testing
|
|
|
|
Args:
|
|
x, y: Position coordinates
|
|
delta_y: Wheel delta (positive = scroll up, negative = scroll down)
|
|
modifiers: Keyboard modifiers (e.g., ControlModifier for zoom)
|
|
"""
|
|
from PyQt6.QtCore import QPoint
|
|
pos = QPointF(x, y)
|
|
global_pos = QPoint(int(x), int(y))
|
|
angle_delta = QPoint(0, delta_y)
|
|
|
|
return QWheelEvent(
|
|
pos,
|
|
global_pos,
|
|
QPoint(0, 0),
|
|
angle_delta,
|
|
Qt.MouseButton.NoButton,
|
|
modifiers,
|
|
Qt.ScrollPhase.NoScrollPhase,
|
|
False
|
|
)
|
|
return _create_event
|
|
|
|
|
|
@pytest.fixture
|
|
def populated_page():
|
|
"""Create a page with multiple elements for testing"""
|
|
page = Page(
|
|
layout=PageLayout(width=210, height=297),
|
|
page_number=1
|
|
)
|
|
|
|
# Add various elements
|
|
page.layout.add_element(ImageData(
|
|
image_path="img1.jpg",
|
|
x=10, y=10,
|
|
width=100, height=75,
|
|
z_index=0
|
|
))
|
|
|
|
page.layout.add_element(PlaceholderData(
|
|
x=120, y=10,
|
|
width=80, height=60,
|
|
z_index=1
|
|
))
|
|
|
|
page.layout.add_element(TextBoxData(
|
|
x=10, y=100,
|
|
width=190, height=40,
|
|
text_content="Sample Text",
|
|
z_index=2
|
|
))
|
|
|
|
return page
|