Test explicit self pairing menu, resume, and both PIN input steps

This commit is contained in:
evgeny committed 2026-11-03 01:35:19 +01:00
1 parent f2a2983986
commit e36e16f139
1 file changed
+37 -13
+37 -13
View File
@@ -3,6 +3,7 @@
#include "../src/accountdelegate.h"
#include "../src/devgroupdialog.h"
#include <QInputDialog>
#include <QLineEdit>
#include <QDialogButtonBox>
#include <QLabel>
#include <QPushButton>
@@ -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<bool>("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<uint8_t*>(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<QInputDialog*>("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<QDialog*>("devgroupPairingDialog"));
QVERIFY(context(window, "Finish pairing"));
auto* dialog = window.findChild<QDialog*>("devgroupPairingDialog"); QVERIFY(dialog && dialog->isVisible());
auto* label = dialog->findChild<QLabel*>(); 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<QDialogButtonBox*>(); QVERIFY(box); QVERIFY(!box->button(QDialogButtonBox::Ok)->isEnabled());
dialog->setTextValue("1234"); QVERIFY(box->button(QDialogButtonBox::Ok)->isEnabled()); dialog->accept();
auto* edit = dialog->findChild<QLineEdit*>("devgroupPinInput"); QVERIFY(edit);
auto* check = dialog->findChild<QPushButton*>("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<QInputDialog*>("devgroupIncomingPin"); QVERIFY(dialog && dialog->isVisible());
dialog->reject();
devgroupCallback(nullptr, 0); respond(devgroupRequests.back().request_id, snapshot);
QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
QVERIFY(!window.findChild<QInputDialog*>("devgroupIncomingPin"));
QVERIFY(!window.findChild<QDialog*>("devgroupPairingDialog"));
QVERIFY(context(window, "Finish pairing"));
dialog = window.findChild<QDialog*>("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<QLabel*>()->text().contains("Return PIN: 5678"));
QVERIFY(!dialog->findChild<QLineEdit*>()->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<QLineEdit*>(); QVERIFY(edit->isVisible()); edit->setText("5678");
dialog->findChild<QPushButton*>("devgroupCheckPin")->click();
QCOMPARE(devgroupRequests.back().action, CHAT_DEVGROUP_ACCEPT);
QCOMPARE(QByteArray(devgroupRequests.back().pin), QByteArray("5678"));
}
void addMyDeviceImmediatelyRequestsInvitationAndShowsPin() {