Reproduce member selection jumping back while its context menu is open

This commit is contained in:
evgeny committed 2026-11-03 00:22:29 +01:00
1 parent f29554f92b
commit 913e4dfbd4
1 file changed
+37
@@ -136,6 +136,43 @@ class MemberDetailTest : public QObject {
return invoked && clicked;
}
private slots:
void contextKeepsClickedMemberSelected_data() {
QTest::addColumn<bool>("previousGroup");
QTest::newRow("previous-member") << false;
QTest::newRow("previous-subgroup") << true;
}
void contextKeepsClickedMemberSelected() {
QFETCH(bool, previousGroup);
AccountList panel; panel.resize(420, 600); panel.show();
auto first = row(7), target = row(8), extra = row(9);
if (previousGroup) {
memset(first.data() + 164, 42, 32); memcpy(first.data() + 196, "Devices", 8);
}
const auto snapshot = first + target + extra; fill(panel, "123", snapshot);
auto* view = panel.findChild<QListView*>(); QVERIFY(view);
QTest::mouseClick(view->viewport(), Qt::LeftButton, Qt::NoModifier,
view->visualRect(view->model()->index(0, 0)).topLeft() + QPoint(100, 16));
const QPoint point = view->visualRect(view->model()->index(1, 0)).topLeft() + QPoint(100, 16);
// Правый press меняет Qt selection, но не обязан посылать clicked для обновления карточки.
QTest::mousePress(view->viewport(), Qt::RightButton, Qt::NoModifier, point);
bool inspected = false;
QTimer::singleShot(0, &panel, [&] {
auto* menu = qobject_cast<QMenu*>(QApplication::activePopupWidget());
if (!menu) { QTest::qFail("member context menu missing", __FILE__, __LINE__); return; }
const auto close = qScopeGuard([menu] { menu->close(); });
// Полный снимок во вложенном event loop меню должен восстановить именно выбранный правой кнопкой узел.
panel.onMemberList("123", 3, reinterpret_cast<const uint8_t*>(snapshot.constData()), snapshot.size());
DEBUG_DEBUG(DEBUG_CATEGORY_CONNECTION, "context selection after snapshot: previous_group=%d node=%llu header=%s",
previousGroup, view->currentIndex().data(MemberListModel::NodeIdRole).toULongLong(), qPrintable(header(panel)));
QCOMPARE(view->currentIndex().data(MemberListModel::NodeIdRole).toULongLong(), quint64(8));
QVERIFY(header(panel).contains("peer8")); inspected = true;
});
QVERIFY(QMetaObject::invokeMethod(view, "customContextMenuRequested", Qt::DirectConnection, Q_ARG(QPoint, point)));
QTest::mouseRelease(view->viewport(), Qt::RightButton, Qt::NoModifier, point);
QVERIFY(inspected);
QCOMPARE(view->currentIndex().data(MemberListModel::NodeIdRole).toULongLong(), quint64(8));
}
void init() {
requests.clear(); memberRequests.clear(); connectRequests.clear(); muteRequests.clear(); ownedPosts = 0; rejectOwned = false; ready = true;
devgroupRequests.clear();