🐛 | Make SearchWorker tests robust to Qt fallback environments
All checks were successful
SonarQube Code Quality Scan / SonarQube Scan (push) Successful in 1m46s
All checks were successful
SonarQube Code Quality Scan / SonarQube Scan (push) Successful in 1m46s
Replace SearchWorker signal .connect() with mock.MagicMock to handle the case where the player module Signal binding is a plain function (import fallback when PySide6 is unavailable in headless CI). The MagicMock captures .emit() calls and works across all environments: real Qt, conftest stubs, and player.py fallback paths.
This commit is contained in:
@@ -5,6 +5,7 @@ import struct
|
||||
import math
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
from unittest import mock
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -345,20 +346,28 @@ class TestTmpDir:
|
||||
# ── SearchWorker (TEST_MODE) ─────────────────────────────────────────────────
|
||||
|
||||
class TestSearchWorkerTestMode:
|
||||
"""Tests for SearchWorker.run() with TEST_MODE enabled."""
|
||||
"""Tests for SearchWorker.run() with TEST_MODE enabled.
|
||||
|
||||
Uses ``mock.MagicMock`` to capture signal emissions instead of
|
||||
``.connect()`` because the player module's ``Signal`` binding may
|
||||
be a plain function (the import fallback when PySide6 is unavailable)
|
||||
that does not have a ``.connect()`` method.
|
||||
"""
|
||||
|
||||
def test_returns_dummy_results_in_test_mode(self, monkeypatch):
|
||||
"""With TEST_MODE=True, SearchWorker returns 5 dummy songs."""
|
||||
monkeypatch.setattr("player.TEST_MODE", True)
|
||||
from player import SearchWorker
|
||||
|
||||
results = []
|
||||
worker = SearchWorker("test query")
|
||||
worker.results_ready.connect(results.append)
|
||||
# Use a MagicMock to capture signal emissions — works with both
|
||||
# real Signal, stub _Signal, and fallback lambda.
|
||||
mock_signal = mock.MagicMock()
|
||||
worker.results_ready = mock_signal
|
||||
worker.run()
|
||||
|
||||
assert len(results) == 1
|
||||
data = results[0]
|
||||
mock_signal.emit.assert_called_once()
|
||||
data = mock_signal.emit.call_args[0][0]
|
||||
assert "songs" in data
|
||||
assert "videos" in data
|
||||
assert len(data["songs"]) == 5
|
||||
@@ -370,12 +379,14 @@ class TestSearchWorkerTestMode:
|
||||
monkeypatch.setattr("player.TEST_MODE", True)
|
||||
from player import SearchWorker
|
||||
|
||||
results = []
|
||||
worker = SearchWorker("test query")
|
||||
worker.results_ready.connect(lambda r: results.append(r))
|
||||
mock_signal = mock.MagicMock()
|
||||
worker.results_ready = mock_signal
|
||||
worker.run()
|
||||
|
||||
song = results[0]["songs"][0]
|
||||
mock_signal.emit.assert_called_once()
|
||||
data = mock_signal.emit.call_args[0][0]
|
||||
song = data["songs"][0]
|
||||
assert "videoId" in song
|
||||
assert "title" in song
|
||||
assert "artists" in song
|
||||
|
||||
Reference in New Issue
Block a user