🐛 | 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 math
|
||||||
import tempfile
|
import tempfile
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
from unittest import mock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
@@ -345,20 +346,28 @@ class TestTmpDir:
|
|||||||
# ── SearchWorker (TEST_MODE) ─────────────────────────────────────────────────
|
# ── SearchWorker (TEST_MODE) ─────────────────────────────────────────────────
|
||||||
|
|
||||||
class TestSearchWorkerTestMode:
|
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):
|
def test_returns_dummy_results_in_test_mode(self, monkeypatch):
|
||||||
"""With TEST_MODE=True, SearchWorker returns 5 dummy songs."""
|
"""With TEST_MODE=True, SearchWorker returns 5 dummy songs."""
|
||||||
monkeypatch.setattr("player.TEST_MODE", True)
|
monkeypatch.setattr("player.TEST_MODE", True)
|
||||||
from player import SearchWorker
|
from player import SearchWorker
|
||||||
|
|
||||||
results = []
|
|
||||||
worker = SearchWorker("test query")
|
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()
|
worker.run()
|
||||||
|
|
||||||
assert len(results) == 1
|
mock_signal.emit.assert_called_once()
|
||||||
data = results[0]
|
data = mock_signal.emit.call_args[0][0]
|
||||||
assert "songs" in data
|
assert "songs" in data
|
||||||
assert "videos" in data
|
assert "videos" in data
|
||||||
assert len(data["songs"]) == 5
|
assert len(data["songs"]) == 5
|
||||||
@@ -370,12 +379,14 @@ class TestSearchWorkerTestMode:
|
|||||||
monkeypatch.setattr("player.TEST_MODE", True)
|
monkeypatch.setattr("player.TEST_MODE", True)
|
||||||
from player import SearchWorker
|
from player import SearchWorker
|
||||||
|
|
||||||
results = []
|
|
||||||
worker = SearchWorker("test query")
|
worker = SearchWorker("test query")
|
||||||
worker.results_ready.connect(lambda r: results.append(r))
|
mock_signal = mock.MagicMock()
|
||||||
|
worker.results_ready = mock_signal
|
||||||
worker.run()
|
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 "videoId" in song
|
||||||
assert "title" in song
|
assert "title" in song
|
||||||
assert "artists" in song
|
assert "artists" in song
|
||||||
|
|||||||
Reference in New Issue
Block a user