diff --git a/tools/chatgui/tests/test_member_detail.cpp b/tools/chatgui/tests/test_member_detail.cpp index d64181444..99a1e3fc3 100644 --- a/tools/chatgui/tests/test_member_detail.cpp +++ b/tools/chatgui/tests/test_member_detail.cpp @@ -3,6 +3,7 @@ #include "../src/accountdelegate.h" #include "../src/devgroupdialog.h" #include +#include #include #include #include @@ -181,8 +182,16 @@ private slots: debug_config_init(); debug_set_level(DEBUG_LEVEL_WARN); } - void deviceInvitationOpensPinAutomaticallyAndReturnsEnteredPin() { - QWidget window; devgroupRequests.clear(); initDevgroupUi(&window); + void deviceInvitationWaitsForSelfMenuAndSupportsBothPins_data() { + QTest::addColumn("grouped"); + QTest::newRow("self") << false; QTest::newRow("collapsed-own-group") << true; + } + void deviceInvitationWaitsForSelfMenuAndSupportsBothPins() { + QFETCH(bool, grouped); + AccountList window; window.resize(420, 600); window.show(); + auto self = row(7, true, 5, 30, 255, 0, true); + if (grouped) { memset(self.data() + 164, 42, 32); memcpy(self.data() + 196, "Devices", 8); } + fill(window, "123", self); devgroupRequests.clear(); initDevgroupUi(&window); QVERIFY(devgroupCallback && !devgroupRequests.empty()); auto respond = [](quint64 request, const QByteArray& json) { QByteArray bytes(9, 0); mf_put64(reinterpret_cast(bytes.data()), request); bytes[8] = 1; bytes += json; @@ -190,24 +199,39 @@ private slots: }; const QByteArray invite = "0123456789abcdef0123456789abcdef"; const QByteArray snapshot = "{\"group\":\"\",\"name\":\"\",\"invitations\":[{\"id\":\"" + invite + - "\",\"peer\":\"0000000000000007\",\"channel\":\"123\",\"outgoing\":0,\"state\":1}]}"; + "\",\"peer\":\"0000000000000007\",\"channel\":\"123\",\"outgoing\":0,\"state\":1,\"input\":1}]}"; respond(devgroupRequests.back().request_id, snapshot); - auto* dialog = window.findChild("devgroupIncomingPin"); QVERIFY(dialog && dialog->isVisible()); - QVERIFY(dialog->labelText().contains("personal device subgroup")); - QVERIFY(dialog->labelText().contains("simply close this window")); + QVERIFY(hasPendingDevicePairing()); QVERIFY(!window.findChild("devgroupPairingDialog")); + QVERIFY(context(window, "Finish pairing")); + auto* dialog = window.findChild("devgroupPairingDialog"); QVERIFY(dialog && dialog->isVisible()); + auto* label = dialog->findChild(); QVERIFY(label->text().contains("personal device subgroup")); + QVERIFY(label->text().contains("simply close this window")); QVERIFY(dialog->grab().save(QDir::tempPath() + "/device-link-pin-help.png")); - auto* box = dialog->findChild(); QVERIFY(box); QVERIFY(!box->button(QDialogButtonBox::Ok)->isEnabled()); - dialog->setTextValue("1234"); QVERIFY(box->button(QDialogButtonBox::Ok)->isEnabled()); dialog->accept(); + auto* edit = dialog->findChild("devgroupPinInput"); QVERIFY(edit); + auto* check = dialog->findChild("devgroupCheckPin"); QVERIFY(check && !check->isEnabled()); + edit->setText("1234"); QVERIFY(check->isEnabled()); check->click(); QCOMPARE(devgroupRequests.back().action, CHAT_DEVGROUP_ACCEPT); QCOMPARE(QByteArray(devgroupRequests.back().text), invite); QCOMPARE(QByteArray(devgroupRequests.back().pin), QByteArray("1234")); - // Неверный PIN возвращает waiting: поле появляется повторно, сетевые повторы его не дублируют. + // Неверный PIN разрешает повтор в том же окне, а закрытие не открывает его автоматически. respond(devgroupRequests.back().request_id, snapshot); + QVERIFY(edit->isEnabled()); QVERIFY(!check->isEnabled()); dialog->close(); QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); - dialog = window.findChild("devgroupIncomingPin"); QVERIFY(dialog && dialog->isVisible()); - dialog->reject(); devgroupCallback(nullptr, 0); respond(devgroupRequests.back().request_id, snapshot); - QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete); - QVERIFY(!window.findChild("devgroupIncomingPin")); + QVERIFY(!window.findChild("devgroupPairingDialog")); + QVERIFY(context(window, "Finish pairing")); + dialog = window.findChild("devgroupPairingDialog"); QVERIFY(dialog && dialog->isVisible()); + const QByteArray second = "{\"group\":\"\",\"name\":\"\",\"invitations\":[{\"id\":\"" + invite + + "\",\"peer\":\"0000000000000007\",\"outgoing\":0,\"state\":8,\"pin\":\"5678\",\"input\":0}]}"; + respond(devgroupRequests.back().request_id, second); + QVERIFY(dialog->findChild()->text().contains("Return PIN: 5678")); + QVERIFY(!dialog->findChild()->isVisible()); + const QByteArray outgoing = "{\"group\":\"\",\"name\":\"\",\"invitations\":[{\"id\":\"" + invite + + "\",\"peer\":\"0000000000000007\",\"outgoing\":1,\"state\":8,\"input\":2}]}"; + devgroupCallback(nullptr, 0); respond(devgroupRequests.back().request_id, outgoing); + edit = dialog->findChild(); QVERIFY(edit->isVisible()); edit->setText("5678"); + dialog->findChild("devgroupCheckPin")->click(); + QCOMPARE(devgroupRequests.back().action, CHAT_DEVGROUP_ACCEPT); + QCOMPARE(QByteArray(devgroupRequests.back().pin), QByteArray("5678")); } void addMyDeviceImmediatelyRequestsInvitationAndShowsPin() {