🐛 | Make SearchWorker tests robust to Qt fallback environments
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:
2026-06-04 21:29:33 +03:00
parent dc3c735655
commit 37d4a7d47e

View File

@@ -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