summaryrefslogtreecommitdiffstats
path: root/tests/test_mainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_mainwindow.cpp')
-rw-r--r--tests/test_mainwindow.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/tests/test_mainwindow.cpp b/tests/test_mainwindow.cpp
index ab904f9..a66e1c2 100644
--- a/tests/test_mainwindow.cpp
+++ b/tests/test_mainwindow.cpp
@@ -19,7 +19,10 @@
#include <QtTest>
#include <QAction>
+#include <QApplication>
#include <QDir>
+#include <QKeyEvent>
+#include <QLineEdit>
#include <QFile>
#include <QSettings>
#include <QStandardPaths>
@@ -51,6 +54,7 @@ private slots:
void uiStateSurvivesARestart();
void missingUiStateLeavesTheDefaults();
void headerStateFromADifferentColumnLayoutIsDiscarded();
+ void returnInTheQueryBarRunsTheQueryNotOpenThread();
};
void TestMainWindow::everyKnownActionIsRegistered()
@@ -266,6 +270,47 @@ void TestMainWindow::headerStateFromADifferentColumnLayoutIsDiscarded()
QStandardPaths::setTestModeEnabled(false);
}
+void TestMainWindow::returnInTheQueryBarRunsTheQueryNotOpenThread()
+{
+ // Return is bound to open_thread as a WindowShortcut, and the query bar has
+ // to win it back while it has focus. Qt withholds a plain-LETTER shortcut
+ // from an editable widget, but Return is not a letter and gets no such
+ // protection, so without an explicit override the action fires, the query
+ // never runs, and focus jumps to the thread list.
+ //
+ // The delivery order matters and is the reason this bug survived earlier
+ // tests: real input sends ShortcutOverride first and only dispatches the
+ // shortcut if nothing accepts it. QTest::keyClick() skips that round trip,
+ // so a test written with it passes against the broken code.
+ const Config config;
+ MainWindow window(config);
+ window.show();
+ QVERIFY(QTest::qWaitForWindowExposed(&window));
+
+ auto *edit = window.findChild<QLineEdit *>();
+ QVERIFY(edit);
+ edit->setFocus();
+ QTRY_COMPARE(QApplication::focusWidget(), edit);
+ edit->setText(QStringLiteral("tag:unread"));
+
+ QAction *openThread = window.findChild<QAction *>(QStringLiteral("open_thread"));
+ QVERIFY(openThread);
+ bool actionFired = false;
+ connect(openThread, &QAction::triggered, &window, [&actionFired]() {
+ actionFired = true;
+ });
+
+ // The query bar must claim the override, which is what stops the shortcut
+ // from ever being dispatched.
+ QKeyEvent override(QEvent::ShortcutOverride, Qt::Key_Return, Qt::NoModifier);
+ override.ignore();
+ QApplication::sendEvent(edit, &override);
+ QVERIFY2(override.isAccepted(),
+ "the query bar let Return through to the open_thread shortcut");
+
+ QVERIFY(!actionFired);
+}
+
// Constructing a MainWindow needs a QApplication and a platform plugin. The
// test has no display under ctest, so it runs offscreen unless the caller
// asked for something else.