Reproduce ordinary draft loss and missing cancellation acknowledgments

This commit is contained in:
evgeny committed 2026-10-28 00:58:59 +01:00
1 parent 88760510da
commit 9be3c4af48
2 files changed
+55

No files matched your search

+41
View File
@@ -54,6 +54,47 @@ static bool dropUrls(QWidget* target, const QList<QUrl>& 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<QTextEdit*>(); 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<QTextEdit*>(); 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<QTextEdit*>()->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<QTextEdit*>(); 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);
@@ -35,6 +35,7 @@ static QList<int> cpuLoads;
static bool cpuOnGuiThread = true;
static QStringList changedChannels;
static QList<QByteArray> edits;
static QList<QByteArray> 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<chat_msg_submit*>(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>({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++; });