diff --git a/tools/chatgui/tests/test_member_detail.cpp b/tools/chatgui/tests/test_member_detail.cpp index 31f5913c6..ece2374af 100644 --- a/tools/chatgui/tests/test_member_detail.cpp +++ b/tools/chatgui/tests/test_member_detail.cpp @@ -136,6 +136,43 @@ class MemberDetailTest : public QObject { return invoked && clicked; } private slots: + void contextKeepsClickedMemberSelected_data() { + QTest::addColumn("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(); 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(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(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();