From 9be3c4af48e190327f0c6cd1245355078fcacc8b Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 27 Oct 2026 18:46:38 +0100 Subject: [PATCH] Reproduce ordinary draft loss and missing cancellation acknowledgments --- tools/chatgui/tests/test_file_drop.cpp | 41 +++++++++++++++++++++ tools/chatgui/tests/test_message_events.cpp | 14 +++++++ 2 files changed, 55 insertions(+) diff --git a/tools/chatgui/tests/test_file_drop.cpp b/tools/chatgui/tests/test_file_drop.cpp index 76b1b6d9..b0de1e88 100644 --- a/tools/chatgui/tests/test_file_drop.cpp +++ b/tools/chatgui/tests/test_file_drop.cpp @@ -54,6 +54,47 @@ static bool dropUrls(QWidget* target, const QList& urls, bool process = tr class FileDropTest : public QObject { Q_OBJECT private slots: + void ordinaryTextWaitsForResultAndCanRetry() { + InputBar bar(nullptr, nullptr); bar.setRecordingContext("/tmp", "123"); + auto* editor = bar.findChild(); QVERIFY(editor); + QSignalSpy sends(&bar, &InputBar::sendMessage), errors(&bar, &InputBar::attachmentRejected); + editor->setPlainText("ordinary"); + QVERIFY(QMetaObject::invokeMethod(&bar, "onSendClicked", Qt::DirectConnection)); + QCOMPARE(sends.size(), 1); const auto request = sends[0][2].toULongLong(); QVERIFY(request); + QCOMPARE(editor->toPlainText(), QString("ordinary")); + QVERIFY(QMetaObject::invokeMethod(&bar, "onSendClicked", Qt::DirectConnection)); QCOMPARE(sends.size(), 1); + bar.submissionResult(request, false); QCOMPARE(errors.size(), 1); QCOMPARE(editor->toPlainText(), QString("ordinary")); + QVERIFY(QMetaObject::invokeMethod(&bar, "onSendClicked", Qt::DirectConnection)); QCOMPARE(sends.size(), 2); + QVERIFY(sends[1][2].toULongLong() != request); bar.submissionResult(sends[1][2].toULongLong(), true); + QVERIFY(editor->toPlainText().isEmpty()); + } + + void ordinaryResultPreservesNewDraftAndContext() { + InputBar bar(nullptr, nullptr); bar.setRecordingContext("/tmp", "123"); + auto* editor = bar.findChild(); QVERIFY(editor); QSignalSpy sends(&bar, &InputBar::sendMessage); + editor->setPlainText("first"); QVERIFY(QMetaObject::invokeMethod(&bar, "onSendClicked", Qt::DirectConnection)); + editor->setPlainText("second"); bar.submissionResult(sends[0][2].toULongLong(), true); + QCOMPARE(editor->toPlainText(), QString("second")); + QVERIFY(QMetaObject::invokeMethod(&bar, "onSendClicked", Qt::DirectConnection)); + bar.setRecordingContext("/tmp", "456"); bar.setRecordingContext("/tmp", "123"); + editor->setPlainText("returned to channel"); bar.submissionResult(sends[1][2].toULongLong(), true); + QCOMPARE(editor->toPlainText(), QString("returned to channel")); + } + + void submissionIdsOutliveComposer() { + quint64 oldRequest = 0; + { + InputBar bar(nullptr, nullptr); bar.setRecordingContext("/tmp", "123"); + QSignalSpy sends(&bar, &InputBar::sendMessage); bar.findChild()->setPlainText("old"); + QVERIFY(QMetaObject::invokeMethod(&bar, "onSendClicked", Qt::DirectConnection)); oldRequest = sends[0][2].toULongLong(); + } + InputBar bar(nullptr, nullptr); bar.setRecordingContext("/tmp", "123"); + auto* editor = bar.findChild(); editor->setPlainText("new"); QSignalSpy sends(&bar, &InputBar::sendMessage); + QVERIFY(QMetaObject::invokeMethod(&bar, "onSendClicked", Qt::DirectConnection)); + QVERIFY(oldRequest); QVERIFY(sends[0][2].toULongLong() != oldRequest); + bar.submissionResult(oldRequest, true); QCOMPARE(editor->toPlainText(), QString("new")); + } + void emojiSelectionInsertsCorrectTextAtCursor() { EmojiPanel panel; InputBar input(&panel, nullptr); diff --git a/tools/chatgui/tests/test_message_events.cpp b/tools/chatgui/tests/test_message_events.cpp index e839868d..4e6632d0 100644 --- a/tools/chatgui/tests/test_message_events.cpp +++ b/tools/chatgui/tests/test_message_events.cpp @@ -35,6 +35,7 @@ static QList cpuLoads; static bool cpuOnGuiThread = true; static QStringList changedChannels; static QList edits; +static QList submitted; static int readyEvents; struct BoundCore { @@ -211,6 +212,19 @@ private slots: QCOMPARE(u_get_allocated_count(), before); } + void cancelledSubmissionReturnsOneFailureAndFreesRequest() { + BoundCore core; QVERIFY(core.ua); core.attach(); submitted.clear(); + gui_bridge_set_msg_submitted_cb([](const uint8_t* data, int len) { submitted.append(QByteArray((const char*)data, len)); }); + const size_t before = u_get_allocated_count(); + auto* request = static_cast(u_calloc(1, sizeof(chat_msg_submit))); QVERIFY(request); + request->request_id = UINT64_C(0x0102030405060708); + QCOMPARE(gui_bridge_submit_message(request), 0); gui_bridge_set_inst(nullptr); + QCoreApplication::processEvents(); + QCOMPARE(submitted, QList({QByteArray::fromHex("080706050403020100")})); + uasync_poll(core.ua, 0); QCoreApplication::processEvents(); QCOMPARE(submitted.size(), 1); + QCOMPARE(u_get_allocated_count(), before); gui_bridge_set_msg_submitted_cb(nullptr); + } + void invalidPostArgumentsDoNotTurnIntoEmptyEvents() { readyEvents = 0; gui_bridge_set_db_ready_cb([] { readyEvents++; });