From 942dca3444a3fe978074fa180ca9e1106ad7ae88 Mon Sep 17 00:00:00 2001 From: George Edward Bulmer Date: Tue, 13 Feb 2018 13:31:27 +0000 Subject: [PATCH 1/7] Add test for pastebin_version() --- qutebrowser/utils/version.py | 6 +-- tests/unit/utils/test_version.py | 67 ++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py index 09a1a6efa..71e33886f 100644 --- a/qutebrowser/utils/version.py +++ b/qutebrowser/utils/version.py @@ -453,7 +453,7 @@ def opengl_vendor(): # pragma: no cover old_context.makeCurrent(old_surface) -def pastebin_version(): +def pastebin_version(pbclient=None): """Pastebin the version and log the url to messages.""" def _yank_url(url): utils.set_clipboard(url) @@ -478,8 +478,8 @@ def pastebin_version(): http_client = httpclient.HTTPClient() misc_api = pastebin.PastebinClient.MISC_API_URL - pbclient = pastebin.PastebinClient(http_client, parent=app, - api_url=misc_api) + pbclient = pbclient or pastebin.PastebinClient(http_client, parent=app, + api_url=misc_api) pbclient.success.connect(_on_paste_version_success) pbclient.error.connect(_on_paste_version_err) diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index da65422a7..84d89680c 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -35,9 +35,11 @@ import datetime import attr import pkg_resources import pytest +from PyQt5.QtCore import pyqtSignal, QUrl, QObject import qutebrowser from qutebrowser.utils import version, usertypes, utils +from qutebrowser.misc import pastebin from qutebrowser.browser import pdfjs @@ -950,3 +952,68 @@ def test_opengl_vendor(): """Simply call version.opengl_vendor() and see if it doesn't crash.""" pytest.importorskip("PyQt5.QtOpenGL") return version.opengl_vendor() + + +class HTTPPostStub(QObject): + + """A stub class for HTTPClient. + + Attributes: + url: the last url send by post() + data: the last data send by post() + """ + + success = pyqtSignal(str) + error = pyqtSignal(str) + + def __init__(self, parent=None): + super().__init__(parent) + self.url = None + self.data = None + + def post(self, url, data=None): + self.url = url + self.data = data + + +@pytest.fixture +def pbclient(): + http_stub = HTTPPostStub() + client = pastebin.PastebinClient(http_stub) + return client + + +def test_pastebin_version(pbclient, monkeypatch): + """Test version.pastebin_version() twice.""" + patches = { + '_path_info': lambda: {'PATH DESC': 'PATH NAME'}, + '_uptime': lambda: datetime.timedelta(hours=1, minutes=23, seconds=45), + } + + for name, val in patches.items(): + monkeypatch.setattr('qutebrowser.utils.version.' + name, val) + + version.pastebin_version(pbclient) + pbclient.success.emit("test") + assert version.pastebin_url == "test" + + version.pastebin_version(pbclient) + assert version.pastebin_url == "test" + + +def test_pastebin_version_error(pbclient, monkeypatch): + """Test version.pastebin_version() with errors.""" + patches = { + '_path_info': lambda: {'PATH DESC': 'PATH NAME'}, + '_uptime': lambda: datetime.timedelta(hours=1, minutes=23, seconds=45), + } + + for name, val in patches.items(): + monkeypatch.setattr('qutebrowser.utils.version.' + name, val) + + version.pastebin_url = None + version.pastebin_version(pbclient) + try: + pbclient.error.emit("test") + except: + assert version.pastebin_url is None From e349af7524819cd6982b7721f3b987ddfd7f8206 Mon Sep 17 00:00:00 2001 From: George Edward Bulmer Date: Tue, 13 Feb 2018 14:49:15 +0000 Subject: [PATCH 2/7] Fix testing with error pastebin_version() --- tests/unit/utils/test_version.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index 84d89680c..cbe174b38 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -1001,7 +1001,7 @@ def test_pastebin_version(pbclient, monkeypatch): assert version.pastebin_url == "test" -def test_pastebin_version_error(pbclient, monkeypatch): +def test_pastebin_version_error(pbclient, caplog, monkeypatch): """Test version.pastebin_version() with errors.""" patches = { '_path_info': lambda: {'PATH DESC': 'PATH NAME'}, @@ -1012,8 +1012,8 @@ def test_pastebin_version_error(pbclient, monkeypatch): monkeypatch.setattr('qutebrowser.utils.version.' + name, val) version.pastebin_url = None - version.pastebin_version(pbclient) - try: - pbclient.error.emit("test") - except: - assert version.pastebin_url is None + with caplog.at_level(logging.ERROR): + version.pastebin_version(pbclient) + pbclient._client.error.emit("test") + assert version.pastebin_url is None + assert caplog.records[0].message == "Failed to pastebin version info: test" From b959e885fc8dd512bba52aee7c989bc915d36578 Mon Sep 17 00:00:00 2001 From: George Edward Bulmer Date: Tue, 13 Feb 2018 15:25:40 +0000 Subject: [PATCH 3/7] Pylint fix --- tests/unit/utils/test_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index cbe174b38..007171afc 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -35,7 +35,7 @@ import datetime import attr import pkg_resources import pytest -from PyQt5.QtCore import pyqtSignal, QUrl, QObject +from PyQt5.QtCore import pyqtSignal, QObject import qutebrowser from qutebrowser.utils import version, usertypes, utils From cfa779ecb7b417191f8596209a7f461a0d1f7317 Mon Sep 17 00:00:00 2001 From: George Edward Bulmer Date: Tue, 13 Feb 2018 16:02:20 +0000 Subject: [PATCH 4/7] Add trivial test for _uptime --- tests/unit/utils/test_version.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index 007171afc..96d0a5f4b 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -36,6 +36,7 @@ import attr import pkg_resources import pytest from PyQt5.QtCore import pyqtSignal, QObject +from PyQt5.QtWidgets import QApplication import qutebrowser from qutebrowser.utils import version, usertypes, utils @@ -1017,3 +1018,9 @@ def test_pastebin_version_error(pbclient, caplog, monkeypatch): pbclient._client.error.emit("test") assert version.pastebin_url is None assert caplog.records[0].message == "Failed to pastebin version info: test" + + +def test_uptime(monkeypatch): + """Test _uptime runs without failing. Its effects are tested elsewhere.""" + QApplication.instance().launch_time = datetime.datetime(1, 1, 1) + version._uptime() From ca8d935cf4ca581fdc16a705e0c4ea4e7d65aaaf Mon Sep 17 00:00:00 2001 From: George Edward Bulmer Date: Tue, 13 Feb 2018 18:38:27 +0000 Subject: [PATCH 5/7] Update tests as per code review --- tests/helpers/stubs.py | 32 ++++++++++++++ tests/unit/misc/test_pastebin.py | 26 +----------- tests/unit/utils/test_version.py | 73 ++++++++++++++------------------ 3 files changed, 66 insertions(+), 65 deletions(-) diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index 64bc793cb..ede322b74 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -563,3 +563,35 @@ class ApplicationStub(QObject): """Stub to insert as the app object in objreg.""" new_window = pyqtSignal(mainwindow.MainWindow) + + +class HTTPPostStub(QObject): + + """A stub class for HTTPClient. + + Attributes: + url: the last url send by post() + data: the last data send by post() + """ + + success = pyqtSignal(str) + error = pyqtSignal(str) + + def __init__(self, parent=None): + super().__init__(parent) + self.url = None + self.data = None + + def post(self, url, data=None): + self.url = url + self.data = data + + +@pytest.fixture +def pbclient(stubs): + http_stub = stubs.HTTPPostStub() + client = pastebin.PastebinClient(http_stub) + return client + + + diff --git a/tests/unit/misc/test_pastebin.py b/tests/unit/misc/test_pastebin.py index b352f52c8..9546bcf36 100644 --- a/tests/unit/misc/test_pastebin.py +++ b/tests/unit/misc/test_pastebin.py @@ -23,31 +23,9 @@ from PyQt5.QtCore import pyqtSignal, QUrl, QObject from qutebrowser.misc import httpclient, pastebin -class HTTPPostStub(QObject): - - """A stub class for HTTPClient. - - Attributes: - url: the last url send by post() - data: the last data send by post() - """ - - success = pyqtSignal(str) - error = pyqtSignal(str) - - def __init__(self, parent=None): - super().__init__(parent) - self.url = None - self.data = None - - def post(self, url, data=None): - self.url = url - self.data = data - - @pytest.fixture -def pbclient(): - http_stub = HTTPPostStub() +def pbclient(stubs): + http_stub = stubs.HTTPPostStub() client = pastebin.PastebinClient(http_stub) return client diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index 96d0a5f4b..f4f7270ba 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -955,62 +955,53 @@ def test_opengl_vendor(): return version.opengl_vendor() -class HTTPPostStub(QObject): - - """A stub class for HTTPClient. - - Attributes: - url: the last url send by post() - data: the last data send by post() - """ - - success = pyqtSignal(str) - error = pyqtSignal(str) - - def __init__(self, parent=None): - super().__init__(parent) - self.url = None - self.data = None - - def post(self, url, data=None): - self.url = url - self.data = data - - @pytest.fixture -def pbclient(): - http_stub = HTTPPostStub() +def pbclient(stubs): + http_stub = stubs.HTTPPostStub() client = pastebin.PastebinClient(http_stub) return client -def test_pastebin_version(pbclient, monkeypatch): - """Test version.pastebin_version() twice.""" - patches = { - '_path_info': lambda: {'PATH DESC': 'PATH NAME'}, - '_uptime': lambda: datetime.timedelta(hours=1, minutes=23, seconds=45), - } - - for name, val in patches.items(): - monkeypatch.setattr('qutebrowser.utils.version.' + name, val) +def test_pastebin_version(pbclient, message_mock, monkeypatch, qtbot): + """Test version.pastebin_version() sets the url.""" + monkeypatch.setattr('qutebrowser.utils.version.version', + lambda: "dummy") + monkeypatch.setattr('qutebrowser.utils.utils.log_clipboard', True) version.pastebin_version(pbclient) pbclient.success.emit("test") + + msg = message_mock.getmsg(usertypes.MessageLevel.info) + assert msg.text == "Version url test yanked to clipboard." assert version.pastebin_url == "test" + version.pastebin_url = None + + +def test_pastebin_version_twice(pbclient, monkeypatch): + """Test whether calling pastebin_version twice sends no data.""" + monkeypatch.setattr('qutebrowser.utils.version.version', + lambda: "dummy") + version.pastebin_version(pbclient) - assert version.pastebin_url == "test" + pbclient.success.emit("test") + + pbclient.url = None + pbclient.data = None + version.pastebin_url = "test2" + + version.pastebin_version(pbclient) + assert pbclient.url is None + assert pbclient.data is None + assert version.pastebin_url == "test2" + + version.pastebin_url = None def test_pastebin_version_error(pbclient, caplog, monkeypatch): """Test version.pastebin_version() with errors.""" - patches = { - '_path_info': lambda: {'PATH DESC': 'PATH NAME'}, - '_uptime': lambda: datetime.timedelta(hours=1, minutes=23, seconds=45), - } - - for name, val in patches.items(): - monkeypatch.setattr('qutebrowser.utils.version.' + name, val) + monkeypatch.setattr('qutebrowser.utils.version.version', + lambda: "dummy") version.pastebin_url = None with caplog.at_level(logging.ERROR): From 29ff4259d69f3e3c994c3e66e93350d78a5d972f Mon Sep 17 00:00:00 2001 From: George Edward Bulmer Date: Tue, 13 Feb 2018 20:09:19 +0000 Subject: [PATCH 6/7] Add test for _uptime() --- tests/helpers/stubs.py | 10 ---------- tests/unit/misc/test_pastebin.py | 2 +- tests/unit/utils/test_version.py | 17 +++++++++++------ 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/tests/helpers/stubs.py b/tests/helpers/stubs.py index ede322b74..27a23650d 100644 --- a/tests/helpers/stubs.py +++ b/tests/helpers/stubs.py @@ -585,13 +585,3 @@ class HTTPPostStub(QObject): def post(self, url, data=None): self.url = url self.data = data - - -@pytest.fixture -def pbclient(stubs): - http_stub = stubs.HTTPPostStub() - client = pastebin.PastebinClient(http_stub) - return client - - - diff --git a/tests/unit/misc/test_pastebin.py b/tests/unit/misc/test_pastebin.py index 9546bcf36..1d684dc4e 100644 --- a/tests/unit/misc/test_pastebin.py +++ b/tests/unit/misc/test_pastebin.py @@ -18,7 +18,7 @@ # along with qutebrowser. If not, see . import pytest -from PyQt5.QtCore import pyqtSignal, QUrl, QObject +from PyQt5.QtCore import QUrl from qutebrowser.misc import httpclient, pastebin diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index f4f7270ba..f6e7efb16 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -35,8 +35,6 @@ import datetime import attr import pkg_resources import pytest -from PyQt5.QtCore import pyqtSignal, QObject -from PyQt5.QtWidgets import QApplication import qutebrowser from qutebrowser.utils import version, usertypes, utils @@ -1011,7 +1009,14 @@ def test_pastebin_version_error(pbclient, caplog, monkeypatch): assert caplog.records[0].message == "Failed to pastebin version info: test" -def test_uptime(monkeypatch): - """Test _uptime runs without failing. Its effects are tested elsewhere.""" - QApplication.instance().launch_time = datetime.datetime(1, 1, 1) - version._uptime() +def test_uptime(monkeypatch, qapp): + """Test _uptime runs and check if microseconds are dropped.""" + launch_time = datetime.datetime(1, 1, 1, 1, 1, 1, 1) + qapp.launch_time = launch_time + + class FakeDateTime(datetime.datetime): + now = lambda x=datetime.datetime(1, 1, 1, 1, 1, 1, 2): x + monkeypatch.setattr('datetime.datetime', FakeDateTime) + + uptime_delta = version._uptime() + assert uptime_delta == datetime.timedelta(0) From 1893a33708152fb0c30bc273e5f41a5a705f4543 Mon Sep 17 00:00:00 2001 From: George Edward Bulmer Date: Tue, 13 Feb 2018 20:51:18 +0000 Subject: [PATCH 7/7] Monkeypatch qapp.launch_time too --- tests/unit/utils/test_version.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py index f6e7efb16..eff67dcd8 100644 --- a/tests/unit/utils/test_version.py +++ b/tests/unit/utils/test_version.py @@ -996,7 +996,7 @@ def test_pastebin_version_twice(pbclient, monkeypatch): version.pastebin_url = None -def test_pastebin_version_error(pbclient, caplog, monkeypatch): +def test_pastebin_version_error(pbclient, caplog, message_mock, monkeypatch): """Test version.pastebin_version() with errors.""" monkeypatch.setattr('qutebrowser.utils.version.version', lambda: "dummy") @@ -1005,14 +1005,17 @@ def test_pastebin_version_error(pbclient, caplog, monkeypatch): with caplog.at_level(logging.ERROR): version.pastebin_version(pbclient) pbclient._client.error.emit("test") + assert version.pastebin_url is None - assert caplog.records[0].message == "Failed to pastebin version info: test" + + msg = message_mock.getmsg(usertypes.MessageLevel.error) + assert msg.text == "Failed to pastebin version info: test" def test_uptime(monkeypatch, qapp): """Test _uptime runs and check if microseconds are dropped.""" launch_time = datetime.datetime(1, 1, 1, 1, 1, 1, 1) - qapp.launch_time = launch_time + monkeypatch.setattr(qapp, "launch_time", launch_time, raising=False) class FakeDateTime(datetime.datetime): now = lambda x=datetime.datetime(1, 1, 1, 1, 1, 1, 2): x