Will list: context menu actions and will-executor bulk tools
PreviewList: right-click menu with sign / details / broadcast / check / copy id / copy / merge from txn / delete, with multi-selection support and availability rules (broadcast force-repushes, delete restricted to invalid or unsigned txs, sign skips non-valid txs). WillExecutorWidget: Export, Ping All and Select All become dropdown buttons (export all/selected/valid, ping all/selected, select all/only valid, deselect all/only invalid). WillExecutorListWidget: single-cell Copy action. BalWindow: txids-scoped sign/broadcast plumbing and merge_single_transaction.
This commit is contained in:
150
tests/test_gui_will_menu.py
Normal file
150
tests/test_gui_will_menu.py
Normal file
@@ -0,0 +1,150 @@
|
||||
"""
|
||||
Tests for the Will-tab context menu and Will-Executor bulk-selection helpers
|
||||
in ``bal.gui.qt.lists``.
|
||||
|
||||
Covers ``_can_sign`` / ``_can_broadcast`` / ``_can_delete`` and
|
||||
``_apply_select_all`` (the pure logic behind the new context-menu actions and
|
||||
the "Select All" dropdown).
|
||||
|
||||
Run:
|
||||
QT_QPA_PLATFORM=offscreen python3 tests/test_gui_will_menu.py
|
||||
"""
|
||||
|
||||
import sys
|
||||
|
||||
sys.path.insert(0, __file__.rsplit("/", 2)[0])
|
||||
|
||||
from bal.gui.qt.lists import (
|
||||
_apply_select_all,
|
||||
_can_broadcast,
|
||||
_can_delete,
|
||||
_can_sign,
|
||||
)
|
||||
|
||||
|
||||
class FakeWillItem:
|
||||
"""Minimal stand-in for ``bal.core.will.WillItem`` (get_status only)."""
|
||||
|
||||
def __init__(self, **status_flags):
|
||||
self._status = dict(status_flags)
|
||||
|
||||
def get_status(self, name):
|
||||
return self._status.get(name, False)
|
||||
|
||||
|
||||
def _we(selected=False):
|
||||
return {"selected": selected}
|
||||
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
# _can_sign / _can_broadcast
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
def test_can_sign_unsigned():
|
||||
assert _can_sign(FakeWillItem()) is True
|
||||
|
||||
|
||||
def test_can_sign_partially_signed():
|
||||
assert _can_sign(FakeWillItem(PARTIALLY_SIGNED=True)) is True
|
||||
|
||||
|
||||
def test_can_sign_complete_false():
|
||||
assert _can_sign(FakeWillItem(COMPLETE=True)) is False
|
||||
|
||||
|
||||
def test_can_sign_none_false():
|
||||
assert _can_sign(None) is False
|
||||
|
||||
|
||||
def test_can_broadcast_complete():
|
||||
assert _can_broadcast(FakeWillItem(COMPLETE=True)) is True
|
||||
|
||||
|
||||
def test_can_broadcast_unsigned_false():
|
||||
assert _can_broadcast(FakeWillItem()) is False
|
||||
|
||||
|
||||
def test_can_broadcast_none_false():
|
||||
assert _can_broadcast(None) is False
|
||||
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
# _can_delete
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
def test_can_delete_invalid():
|
||||
assert _can_delete(FakeWillItem(VALID=False, COMPLETE=True)) is True
|
||||
|
||||
|
||||
def test_can_delete_unsigned():
|
||||
assert _can_delete(FakeWillItem(VALID=True)) is True
|
||||
|
||||
|
||||
def test_can_delete_invalid_and_unsigned():
|
||||
assert _can_delete(FakeWillItem(VALID=False)) is True
|
||||
|
||||
|
||||
def test_can_delete_valid_and_complete_false():
|
||||
assert _can_delete(FakeWillItem(VALID=True, COMPLETE=True)) is False
|
||||
|
||||
|
||||
def test_can_delete_none_false():
|
||||
assert _can_delete(None) is False
|
||||
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
# _apply_select_all
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
def test_select_all_sets_everything():
|
||||
wes = {"a": _we(False), "b": _we(False)}
|
||||
_apply_select_all(wes, True)
|
||||
assert wes["a"]["selected"] is True
|
||||
assert wes["b"]["selected"] is True
|
||||
|
||||
|
||||
def test_deselect_all_clears_everything():
|
||||
wes = {"a": _we(True), "b": _we(True)}
|
||||
_apply_select_all(wes, False)
|
||||
assert wes["a"]["selected"] is False
|
||||
assert wes["b"]["selected"] is False
|
||||
|
||||
|
||||
def test_select_only_valid():
|
||||
wes = {"a": _we(False), "b": _we(True), "c": _we(True)}
|
||||
valid = {"a": True, "b": True, "c": False}
|
||||
_apply_select_all(wes, True, valid)
|
||||
# a, b are valid -> selected; c is invalid -> deselected
|
||||
assert wes["a"]["selected"] is True
|
||||
assert wes["b"]["selected"] is True
|
||||
assert wes["c"]["selected"] is False
|
||||
|
||||
|
||||
def test_deselect_only_invalid():
|
||||
wes = {"a": _we(True), "b": _we(True), "c": _we(True)}
|
||||
valid = {"a": True, "b": False, "c": True}
|
||||
_apply_select_all(wes, False, valid)
|
||||
# b is invalid -> deselected; a, c are valid -> keep their state
|
||||
assert wes["a"]["selected"] is True
|
||||
assert wes["b"]["selected"] is False
|
||||
assert wes["c"]["selected"] is True
|
||||
|
||||
|
||||
def test_select_only_valid_missing_url_treated_invalid():
|
||||
wes = {"a": _we(False), "b": _we(True)}
|
||||
valid = {"a": True}
|
||||
_apply_select_all(wes, True, valid)
|
||||
assert wes["a"]["selected"] is True
|
||||
assert wes["b"]["selected"] is False
|
||||
|
||||
|
||||
# ------------------------------------------------------------------ #
|
||||
# Main
|
||||
# ------------------------------------------------------------------ #
|
||||
|
||||
if __name__ == "__main__":
|
||||
for name in sorted(dir()):
|
||||
if name.startswith("test_"):
|
||||
globals()[name]()
|
||||
print(f" [OK] {name}")
|
||||
print("[OK] All will-menu tests passed")
|
||||
Reference in New Issue
Block a user