|
| 1 | +from PyQt5.QtCore import Qt |
| 2 | +from PyQt5.QtWidgets import ( |
| 3 | + QApplication, |
| 4 | + QDialogButtonBox as BB, |
| 5 | + QMessageBox, |
| 6 | +) |
| 7 | +from pytestqt.qtbot import QtBot |
| 8 | +import pytest |
| 9 | + |
| 10 | +from jenot.qt.pastewindow import ( |
| 11 | + InvalidDataError, |
| 12 | + NoDataError, |
| 13 | + PasteUrlDialog, |
| 14 | +) |
| 15 | + |
| 16 | +LMB = Qt.MouseButton.LeftButton |
| 17 | + |
| 18 | + |
| 19 | +def test_cancel(qtbot: QtBot) -> None: |
| 20 | + d = PasteUrlDialog(None) |
| 21 | + qtbot.addWidget(d) |
| 22 | + |
| 23 | + assert isinstance(d.result_data.value, NoDataError) |
| 24 | + |
| 25 | + qtbot.mouseClick(d.buttonBox.button(BB.StandardButton.Cancel), LMB) |
| 26 | + assert isinstance(d.result_data.value, NoDataError) |
| 27 | + |
| 28 | + |
| 29 | +@pytest.mark.parametrize('url', ['http://jenkins/job/somejob/1', 'http://jenkins/job/somejob/1/console', 'http://jenkins/job/somejob/1/consoleFull']) |
| 30 | +def test_accept_valid_url(qtbot: QtBot, url: str) -> None: |
| 31 | + # clear qt clipboard in case it contains something when pytest runs |
| 32 | + QApplication.clipboard().clear() |
| 33 | + d = PasteUrlDialog(None) |
| 34 | + qtbot.addWidget(d) |
| 35 | + |
| 36 | + assert d.result_data.is_failure |
| 37 | + assert isinstance(d.result_data.value, NoDataError) |
| 38 | + |
| 39 | + qtbot.keyClicks(d.textEdit, url) |
| 40 | + qtbot.mouseClick(d.buttonBox.button(BB.StandardButton.Ok), LMB) |
| 41 | + |
| 42 | + assert d.result_data.is_success |
| 43 | + assert isinstance(d.result_data.value, str) |
| 44 | + assert d.result_data.unwrap() == url |
| 45 | + |
| 46 | + |
| 47 | +def test_accept_clipboard(qtbot: QtBot) -> None: |
| 48 | + url = 'http://jenkins/job/somejob/1' |
| 49 | + QApplication.clipboard().setText(url) |
| 50 | + d = PasteUrlDialog(None) |
| 51 | + qtbot.addWidget(d) |
| 52 | + |
| 53 | + assert d.result_data.is_failure |
| 54 | + assert isinstance(d.result_data.value, NoDataError) |
| 55 | + |
| 56 | + qtbot.mouseClick(d.buttonBox.button(BB.StandardButton.Ok), LMB) |
| 57 | + |
| 58 | + assert d.result_data.is_success |
| 59 | + assert isinstance(d.result_data.value, str) |
| 60 | + assert d.result_data.unwrap() == url |
| 61 | + # without it test freezes at exit for some time and then says |
| 62 | + # QXcbClipboard: Unable to receive an event from the clipboard manager in a reasonable time |
| 63 | + QApplication.clipboard().clear() |
| 64 | + |
| 65 | + |
| 66 | +@pytest.mark.parametrize( |
| 67 | + 'url', [ |
| 68 | + '', |
| 69 | + 'abrakadabra', |
| 70 | + pytest.param('http://jenkins/1\nhttp://jenkins/2', marks=pytest.mark.xfail(reason='no multiline support')) |
| 71 | + ], |
| 72 | +) |
| 73 | +def test_invalid_data(qtbot: QtBot, url: str, monkeypatch: pytest.MonkeyPatch) -> None: |
| 74 | + QApplication.clipboard().setText(url) |
| 75 | + d = PasteUrlDialog(None) |
| 76 | + qtbot.addWidget(d) |
| 77 | + |
| 78 | + assert d.result_data.is_failure |
| 79 | + assert isinstance(d.result_data.value, NoDataError) |
| 80 | + |
| 81 | + monkeypatch.setattr( |
| 82 | + QMessageBox, 'warning', classmethod(lambda *a, **kw: None) |
| 83 | + ) |
| 84 | + qtbot.mouseClick(d.buttonBox.button(BB.StandardButton.Ok), LMB) |
| 85 | + |
| 86 | + assert d.result_data.is_failure |
| 87 | + assert isinstance(d.result_data.value, InvalidDataError) |
| 88 | + # see above |
| 89 | + QApplication.clipboard().clear() |
0 commit comments