From 4aa0194b722bd25a52189997230817209b9e0e0b Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sat, 16 Jan 2021 11:06:39 +0100 Subject: tests: Add question/signal support to messagemock --- tests/helpers/messagemock.py | 48 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/tests/helpers/messagemock.py b/tests/helpers/messagemock.py index 8eae9129c..a5642ef4d 100644 --- a/tests/helpers/messagemock.py +++ b/tests/helpers/messagemock.py @@ -23,6 +23,7 @@ import logging import dataclasses import pytest +from PyQt5.QtCore import pyqtSlot, pyqtSignal, QObject from qutebrowser.utils import usertypes, message @@ -36,19 +37,28 @@ class Message: text: str -class MessageMock: +class MessageMock(QObject): """Helper object for message_mock. Attributes: - Message: A object representing a message. messages: A list of Message objects. + questions: A list of Question objects. + _logger: The logger to use for messages/questions. """ - def __init__(self): + got_message = pyqtSignal(usertypes.MessageLevel, str) + got_question = pyqtSignal(usertypes.Question) + + def __init__(self, parent=None): + super().__init__(parent) self.messages = [] + self.questions = [] + self._logger = logging.getLogger('messagemock') + @pyqtSlot(usertypes.MessageLevel, str) def _record_message(self, level, text): + self.got_message.emit(level, text) log_levels = { usertypes.MessageLevel.error: logging.ERROR, usertypes.MessageLevel.info: logging.INFO, @@ -56,13 +66,19 @@ class MessageMock: } log_level = log_levels[level] - logging.getLogger('messagemock').log(log_level, text) + self._logger.log(log_level, text) self.messages.append(Message(level, text)) + @pyqtSlot(usertypes.Question) + def _record_question(self, question): + self.got_question.emit(question) + self._logger.debug(question) + self.questions.append(question) + def getmsg(self, level=None): """Get the only message in self.messages. - Raises ValueError if there are multiple or no messages. + Raises AssertionError if there are multiple or no messages. Args: level: The message level to check against, or None. @@ -73,20 +89,30 @@ class MessageMock: assert msg.level == level return msg - def patch(self): - """Start recording messages.""" + def get_question(self): + """Get the only question in self.questions. + + Raises AssertionError if there are multiple or no questions. + """ + assert len(self.questions) == 1 + return self.questions[0] + + def connect(self): + """Start recording messages / questions.""" message.global_bridge.show_message.connect(self._record_message) + message.global_bridge.ask_question.connect(self._record_question) message.global_bridge._connected = True - def unpatch(self): - """Stop recording messages.""" + def disconnect(self): + """Stop recording messages/questions.""" message.global_bridge.show_message.disconnect(self._record_message) + message.global_bridge.ask_question.disconnect(self._record_question) @pytest.fixture def message_mock(): """Fixture to get a MessageMock.""" mmock = MessageMock() - mmock.patch() + mmock.connect() yield mmock - mmock.unpatch() + mmock.disconnect() -- cgit v1.2.3-54-g00ecf