diff --git a/tools/chatgui/tests/test_channel_settings.cpp b/tools/chatgui/tests/test_channel_settings.cpp index 8467ed73..a8a075be 100644 --- a/tools/chatgui/tests/test_channel_settings.cpp +++ b/tools/chatgui/tests/test_channel_settings.cpp @@ -122,6 +122,25 @@ private slots: gui_bridge_set_inst(nullptr); QCOMPARE(u_get_allocated_count(), baseline); auto* status = dialog.findChild("channelSettingsStatus"); QVERIFY(status && !status->text().isEmpty()); } + + void retryAfterPartialQueueAcceptance() { + SettingsCore core; QVERIFY(core.start()); + ChannelSettingsDialog dialog(core.channel, &core.db); + const auto checks = dialog.findChildren(); QCOMPARE(checks.size(), 2); + checks[0]->setChecked(true); checks[1]->setChecked(false); + QSignalSpy accepted(&dialog, &QDialog::accepted); + allocationFile = "gui_bridge_impl.cpp"; failAllocation = 2; + auto reset = qScopeGuard([] { failAllocation = 0; allocationFile = nullptr; }); + QVERIFY(QMetaObject::invokeMethod(&dialog, "onSave", Qt::DirectConnection)); + QCOMPARE(failAllocation, 0); QVERIFY(accepted.isEmpty()); + uasync_poll(core.ua, 0); + QCOMPARE(core.db.getUiStateInt("ch_" + core.channel + "_auto_play_voice", -1), 1); + QCOMPARE(chat_core_get_sound_on_message(core.inst, qPrintable(core.channel)), 1); + QVERIFY(QMetaObject::invokeMethod(&dialog, "onSave", Qt::DirectConnection)); + QCOMPARE(accepted.count(), 1); uasync_poll(core.ua, 0); + QCOMPARE(core.db.getUiStateInt("ch_" + core.channel + "_auto_play_voice", -1), 1); + QCOMPARE(chat_core_get_sound_on_message(core.inst, qPrintable(core.channel)), 0); + } #endif void invalidChannel_data() { @@ -159,6 +178,42 @@ private slots: QVERIFY(!dialog); QCOMPARE(core.db.getChannels().size(), 1); } + void confirmationOutcome_data() { + QTest::addColumn("change"); + QTest::newRow("confirm-owned-request") << 0; + QTest::newRow("cancel") << 1; + QTest::newRow("removed-during-confirmation") << 2; + QTest::newRow("core-stopped") << 3; +#ifdef UTUN_TEST_SETTINGS_ALLOC_FAILURES + QTest::newRow("queue-rejected") << 4; +#endif + } + void confirmationOutcome() { + QFETCH(int, change); + SettingsCore core; QVERIFY(core.start()); + ChannelSettingsDialog dialog(core.channel, &core.db); dialog.show(); + QSignalSpy accepted(&dialog, &QDialog::accepted); + const auto baseline = u_get_allocated_count(); +#ifdef UTUN_TEST_SETTINGS_ALLOC_FAILURES + auto reset = qScopeGuard([] { failAllocation = 0; allocationFile = nullptr; }); +#endif + QTimer::singleShot(0, &dialog, [&] { + auto* box = qobject_cast(QApplication::activeModalWidget()); QVERIFY(box); + if (change == 1) { box->button(QMessageBox::Cancel)->click(); return; } + if (change == 2) chat_core_delete_channel(core.inst, qPrintable(core.channel)); + if (change == 3) gui_bridge_set_inst(nullptr); +#ifdef UTUN_TEST_SETTINGS_ALLOC_FAILURES + if (change == 4) { allocationFile = "gui_bridge_impl.cpp"; failAllocation = 1; } +#endif + auto* button = box->findChild("confirmDeleteChannel"); QVERIFY(button); button->click(); + }); + QVERIFY(QMetaObject::invokeMethod(&dialog, "onDelete", Qt::DirectConnection)); + QCOMPARE(accepted.count(), int(change == 0)); + gui_bridge_set_inst(nullptr); + if (change != 2) QCOMPARE(u_get_allocated_count(), baseline); + QCOMPARE(core.db.getChannels().size(), change == 2 ? 0 : 1); + } + void avatarChooserSurvivesOwnerDeletion() { SettingsCore core; QVERIFY(core.start()); GroupAvatarManager avatars(&core.db); QPointer dialog = new ChannelSettingsDialog(core.channel, &core.db); @@ -166,6 +221,17 @@ private slots: QTimer::singleShot(0, [&] { QVERIFY(qobject_cast(QApplication::activeModalWidget())); delete dialog.data(); }); upload->click(); QVERIFY(!dialog); } + + void avatarManagerDisappearsDuringChoice() { + SettingsCore core; QVERIFY(core.start()); + QPointer avatars = new GroupAvatarManager(&core.db); + auto release = qScopeGuard([&] { delete avatars.data(); }); + ChannelSettingsDialog dialog(core.channel, &core.db); dialog.show(); + auto* upload = dialog.findChild("uploadGroupAvatar"); QVERIFY(upload && upload->isEnabled()); + QTimer::singleShot(0, [&] { QVERIFY(qobject_cast(QApplication::activeModalWidget())); delete avatars.data(); }); + upload->click(); QVERIFY(!avatars); QVERIFY(!upload->isEnabled()); + QVERIFY(!dialog.findChild("removeGroupAvatar")->isEnabled()); + } }; QTEST_MAIN(ChannelSettingsTest)