Well, 95% test coverage is okay I guess
This commit is contained in:
parent
ab5ec2bfae
commit
db0476f9ad
15 changed files with 1851 additions and 78 deletions
|
|
@ -1,4 +1,4 @@
|
|||
from PySide6.QtWidgets import QWidget, QMessageBox
|
||||
from PySide6.QtWidgets import QWidget, QMessageBox, QApplication
|
||||
from PySide6.QtCore import Qt, QTimer
|
||||
|
||||
from bouquin.history_dialog import HistoryDialog
|
||||
|
|
@ -83,3 +83,87 @@ def test_history_dialog_revert_error_shows_message(qtbot, fresh_db):
|
|||
dlg._revert()
|
||||
finally:
|
||||
t.stop()
|
||||
|
||||
|
||||
def test_revert_returns_when_no_item_selected(qtbot, fresh_db):
|
||||
d = "2000-01-01"
|
||||
fresh_db.save_new_version(d, "v1", "first")
|
||||
w = QWidget()
|
||||
dlg = HistoryDialog(fresh_db, d, parent=w)
|
||||
qtbot.addWidget(dlg)
|
||||
dlg.show()
|
||||
# No selection at all -> early return
|
||||
dlg.list.clearSelection()
|
||||
dlg._revert() # should not raise
|
||||
|
||||
|
||||
def test_revert_returns_when_current_selected(qtbot, fresh_db):
|
||||
d = "2000-01-02"
|
||||
fresh_db.save_new_version(d, "v1", "first")
|
||||
# Create a second version so there is a 'current'
|
||||
fresh_db.save_new_version(d, "v2", "second")
|
||||
w = QWidget()
|
||||
dlg = HistoryDialog(fresh_db, d, parent=w)
|
||||
qtbot.addWidget(dlg)
|
||||
dlg.show()
|
||||
# Select the current item -> early return
|
||||
for i in range(dlg.list.count()):
|
||||
item = dlg.list.item(i)
|
||||
if item.data(Qt.UserRole) == dlg._current_id:
|
||||
dlg.list.setCurrentItem(item)
|
||||
break
|
||||
dlg._revert() # no-op
|
||||
|
||||
|
||||
def test_revert_exception_shows_message(qtbot, fresh_db, monkeypatch):
|
||||
"""
|
||||
Trigger the exception path in _revert() and auto-accept the modal
|
||||
QMessageBox that HistoryDialog pops so the test doesn't hang.
|
||||
"""
|
||||
d = "2000-01-03"
|
||||
fresh_db.save_new_version(d, "v1", "first")
|
||||
fresh_db.save_new_version(d, "v2", "second")
|
||||
|
||||
w = QWidget()
|
||||
dlg = HistoryDialog(fresh_db, d, parent=w)
|
||||
qtbot.addWidget(dlg)
|
||||
dlg.show()
|
||||
|
||||
# Select a non-current item
|
||||
for i in range(dlg.list.count()):
|
||||
item = dlg.list.item(i)
|
||||
if item.data(Qt.UserRole) != dlg._current_id:
|
||||
dlg.list.setCurrentItem(item)
|
||||
break
|
||||
|
||||
# Make revert raise to hit the except/critical message path.
|
||||
def boom(*_a, **_k):
|
||||
raise RuntimeError("nope")
|
||||
|
||||
monkeypatch.setattr(dlg._db, "revert_to_version", boom)
|
||||
|
||||
# Prepare a small helper that keeps trying to close an active modal box,
|
||||
# but gives up after a bounded number of attempts.
|
||||
def make_closer(max_tries=50, interval_ms=10):
|
||||
tries = {"n": 0}
|
||||
|
||||
def closer():
|
||||
tries["n"] += 1
|
||||
w = QApplication.activeModalWidget()
|
||||
if isinstance(w, QMessageBox):
|
||||
# Prefer clicking the OK button if present; otherwise accept().
|
||||
ok = w.button(QMessageBox.Ok)
|
||||
if ok is not None:
|
||||
ok.click()
|
||||
else:
|
||||
w.accept()
|
||||
elif tries["n"] < max_tries:
|
||||
QTimer.singleShot(interval_ms, closer)
|
||||
|
||||
return closer
|
||||
|
||||
# Schedule auto-close right before we trigger the modal dialog.
|
||||
QTimer.singleShot(0, make_closer())
|
||||
|
||||
# Should show the critical box, which our timer will accept; _revert returns.
|
||||
dlg._revert()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue