# Standard library imports import unittest from unittest.mock import patch # PyQt imports # Third party imports import pytest from pytestqt.plugin import QtBot # type: ignore # App imports from config import Config from app.models import ( db, Playlists, ) from app import musicmuster # Custom fixture to adapt qtbot for use with unittest.TestCase @pytest.fixture(scope="class") def qtbot_adapter(qapp, request): """Adapt qtbot fixture for usefixtures and unittest.TestCase""" request.cls.qtbot = QtBot(request) # Wrapper to handle setup/teardown operations def with_updown(function): def test_wrapper(self, *args, **kwargs): if callable(getattr(self, "up", None)): self.up() try: function(self, *args, **kwargs) finally: if callable(getattr(self, "down", None)): self.down() test_wrapper.__doc__ = function.__doc__ return test_wrapper # Apply the custom fixture to the test class @pytest.mark.usefixtures("qtbot_adapter") class MyTestCase(unittest.TestCase): def up(self): db.create_all() self.widget = musicmuster.Window() playlist_name = "file importer playlist" with db.Session() as session: playlist = Playlists(session, playlist_name) self.widget.create_playlist_tab(playlist) with self.qtbot.waitExposed(self.widget): self.widget.show() def down(self): db.drop_all() @with_updown @patch("file_importer.show_OK") def test_import_no_files(self, mock_show_ok): """Try importing with no files to import""" self.widget.import_files_wrapper() mock_show_ok.assert_called_once_with( "File import", f"No files in {Config.REPLACE_FILES_DEFAULT_SOURCE} to import", None, ) # @with_updown # def test_import_no_files(self): # """Try importing with no files to import""" # with patch("file_importer.show_OK") as mock_show_ok: # self.widget.import_files_wrapper() # mock_show_ok.assert_called_once_with( # "File import", # f"No files in {Config.REPLACE_FILES_DEFAULT_SOURCE} to import", # None, # )