diff --git a/tests/helpers/messagemock.py b/tests/helpers/messagemock.py index ede0fa10d..b1a74fe48 100644 --- a/tests/helpers/messagemock.py +++ b/tests/helpers/messagemock.py @@ -43,8 +43,11 @@ class MessageMock: Message: A namedtuple representing a message. messages: A list of Message tuples. caplog: The pytest-capturelog fixture. + Level: The Level type for easier usage as a fixture. """ + Level = Level + def __init__(self, monkeypatch, caplog): self._monkeypatch = monkeypatch self._caplog = caplog @@ -72,15 +75,25 @@ class MessageMock: def _handle_warning(self, *args, **kwargs): self._handle(Level.warning, *args, **kwargs) - def getmsg(self): + def getmsg(self, level=None, *, win_id=0, immediate=False): """Get the only message in self.messages. Raises ValueError if there are multiple or no messages. + + Args: + level: The message level to check against, or None. + win_id: The window id to check against. + immediate: If the message has the immediate flag set. """ - if len(self.messages) != 1: - raise ValueError("Got {} messages but expected a single " - "one.".format(len(self.messages))) - return self.messages[0] + assert len(self.messages) == 1 + msg = self.messages[0] + + if level is not None: + assert msg.level == level + assert msg.win_id == win_id + assert msg.immediate == immediate + + return msg def patch(self, module_path): """Patch message.* in the given module (as a string).""" diff --git a/tests/unit/misc/test_editor.py b/tests/unit/misc/test_editor.py index 7eaeec8a7..24d9b8903 100644 --- a/tests/unit/misc/test_editor.py +++ b/tests/unit/misc/test_editor.py @@ -26,7 +26,6 @@ from unittest import mock from PyQt5.QtCore import QProcess import pytest -from helpers import messagemock from qutebrowser.misc import editor as editormod @@ -116,8 +115,7 @@ class TestFileHandling: os.chmod(filename, 0o077) editor._proc.finished.emit(0, QProcess.NormalExit) assert not os.path.exists(filename) - msg = message_mock.getmsg() - assert msg.level == messagemock.Level.error + msg = message_mock.getmsg(message_mock.Level.error) assert msg.text.startswith("Failed to read back edited file: ") def test_unwritable(self, monkeypatch, message_mock, editor, tmpdir): @@ -126,8 +124,7 @@ class TestFileHandling: monkeypatch.setattr('qutebrowser.misc.editor.tempfile.tempdir', str(tmpdir)) editor.edit("") - msg = message_mock.getmsg() - assert msg.level == messagemock.Level.error + msg = message_mock.getmsg(message_mock.Level.error) assert msg.text.startswith("Failed to create initial file: ") assert editor._proc is None diff --git a/tests/unit/misc/test_guiprocess.py b/tests/unit/misc/test_guiprocess.py index 84c868b4f..9f972b82f 100644 --- a/tests/unit/misc/test_guiprocess.py +++ b/tests/unit/misc/test_guiprocess.py @@ -28,13 +28,9 @@ import logging import pytest from PyQt5.QtCore import QProcess, QIODevice -from helpers import messagemock # pylint: disable=import-error from qutebrowser.misc import guiprocess -# FIXME check statusbar messages - - def _py_proc(code): """Get a python executable and args list which executes the given code.""" return (sys.executable, ['-c', textwrap.dedent(code.strip('\n'))]) @@ -92,8 +88,8 @@ def test_start_verbose(proc, qtbot, guiprocess_message_mock): proc.start(*argv) msgs = guiprocess_message_mock.messages - assert msgs[0].level == messagemock.Level.info - assert msgs[1].level == messagemock.Level.info + assert msgs[0].level == guiprocess_message_mock.Level.info + assert msgs[1].level == guiprocess_message_mock.Level.info assert msgs[0].text.startswith("Executing:") assert msgs[1].text == "Testprocess exited successfully." assert bytes(proc._proc.readAll()).rstrip() == b'test' @@ -151,8 +147,8 @@ def test_start_detached_error(fake_proc, guiprocess_message_mock): fake_proc._proc.startDetached.return_value = (False, 0) fake_proc._proc.error.return_value = "Error message" fake_proc.start_detached(*argv) - msg = guiprocess_message_mock.getmsg() - assert msg.level == messagemock.Level.error + msg = guiprocess_message_mock.getmsg(guiprocess_message_mock.Level.error, + immediate=True) assert msg.text == "Error while spawning testprocess: Error message." @@ -193,8 +189,8 @@ def test_error(qtbot, proc, caplog, guiprocess_message_mock): with qtbot.waitSignal(proc.error, raising=True): proc.start('this_does_not_exist_either', []) - msg = guiprocess_message_mock.getmsg() - assert msg.level == messagemock.Level.error + msg = guiprocess_message_mock.getmsg(guiprocess_message_mock.Level.error, + immediate=True) expected_msg = ("Error while spawning testprocess: The process failed to " "start.") assert msg.text == expected_msg @@ -205,6 +201,5 @@ def test_exit_unsuccessful(qtbot, proc, guiprocess_message_mock): with qtbot.waitSignal(proc.finished, raising=True, timeout=10000): proc.start(*_py_proc('import sys; sys.exit(1)')) - msg = guiprocess_message_mock.getmsg() - assert msg.level == messagemock.Level.error + msg = guiprocess_message_mock.getmsg(guiprocess_message_mock.Level.error) assert msg.text == "Testprocess exited with status 1." diff --git a/tests/unit/utils/test_urlutils.py b/tests/unit/utils/test_urlutils.py index cff406a6c..f3d8e13d2 100644 --- a/tests/unit/utils/test_urlutils.py +++ b/tests/unit/utils/test_urlutils.py @@ -384,9 +384,7 @@ def test_invalid_url_error(urlutils_message_mock, url, valid, has_err_string): assert bool(qurl.errorString()) == has_err_string urlutils.invalid_url_error(0, qurl, 'frozzle') - msg = urlutils_message_mock.getmsg() - assert msg.win_id == 0 - assert not msg.immediate + msg = urlutils_message_mock.getmsg(urlutils_message_mock.Level.error) if has_err_string: expected_text = ("Trying to frozzle with invalid URL - " + qurl.errorString())