]> cloud.milkyroute.net Git - dolphin.git/commitdiff
test(search): Add test case for baloo parsing model
authorIsmael Asensio <isma.af@gmail.com>
Thu, 14 Nov 2019 21:48:26 +0000 (22:48 +0100)
committerIsmael Asensio <isma.af@gmail.com>
Thu, 14 Nov 2019 21:51:22 +0000 (22:51 +0100)
Summary:
Adds a new test unit for the model which parses baloo search URLs
14/19 tests are set to `XFAIL` on current implementation, as they will be fixed in a final revision.

Supersedes D25135.

Depends on: D25257

Test Plan: `bin/dolphinquerytest`

Reviewers: elvisangelaccio, bruns, #dolphin

Reviewed By: elvisangelaccio, bruns, #dolphin

Subscribers: kfm-devel

Tags: #dolphin

Differential Revision: https://phabricator.kde.org/D25258

src/tests/CMakeLists.txt
src/tests/dolphinquerytest.cpp [new file with mode: 0644]

index 6ecac1f1e8b431e15abc4aef8e354df448a21006..8d4498675881910ceeec68bcb137042b5b16b4a3 100644 (file)
@@ -49,6 +49,13 @@ if (KF5Baloo_FOUND)
   LINK_LIBRARIES dolphinprivate dolphinstatic Qt5::Test)
 endif()
 
+# DolphinQuery
+if (KF5Baloo_FOUND)
+  ecm_add_test(dolphinquerytest.cpp
+  TEST_NAME dolphinquerytest
+  LINK_LIBRARIES dolphinprivate dolphinstatic Qt5::Test)
+endif()
+
 # KStandardItemModelTest
 ecm_add_test(kstandarditemmodeltest.cpp
 TEST_NAME kstandarditemmodeltest
diff --git a/src/tests/dolphinquerytest.cpp b/src/tests/dolphinquerytest.cpp
new file mode 100644 (file)
index 0000000..14eb036
--- /dev/null
@@ -0,0 +1,147 @@
+/***************************************************************************
+ *   Copyright (C) 2019 by Ismael Asensio <isma.af@gmail.com>              *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) any later version.                                   *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
+ ***************************************************************************/
+
+#include "search/dolphinquery.h"
+
+#include <QTest>
+
+#include <QJsonDocument>
+#include <QJsonObject>
+#include <QStringList>
+#include <QUrl>
+#include <QUrlQuery>
+
+class DolphinSearchBoxTest : public QObject
+{
+    Q_OBJECT
+
+private slots:
+    void testBalooSearchParsing_data();
+    void testBalooSearchParsing();
+};
+
+/**
+ * Defines the parameters for the test cases in testBalooSearchParsing()
+ */
+void DolphinSearchBoxTest::testBalooSearchParsing_data()
+{
+    const QString text = QStringLiteral("xyz");
+    const QString filename = QStringLiteral("filename:\"xyz\"");
+    const QString rating = QStringLiteral("rating>=2");
+    const QString modified = QString("modified>=2019-08-07");
+
+    QTest::addColumn<QString>("searchString");
+    QTest::addColumn<QString>("expectedText");
+    QTest::addColumn<QStringList>("expectedTerms");
+
+    // Test for "Content"
+    QTest::newRow("content")              << text    << text << QStringList();
+    QTest::newRow("content/empty")        << ""      << ""   << QStringList();
+    QTest::newRow("content/singleQuote")  << "\""    << ""   << QStringList();
+    QTest::newRow("content/doubleQuote")  << "\"\""  << ""   << QStringList();
+    // Test for empty `filename`
+    QTest::newRow("filename")             << filename         << text << QStringList();
+    QTest::newRow("filename/empty")       << "filename:"      << ""   << QStringList();
+    QTest::newRow("filename/singleQuote") << "filename:\""    << ""   << QStringList();
+    QTest::newRow("filename/doubleQuote") << "filename:\"\""  << ""   << QStringList();
+
+    // Test for rating
+    QTest::newRow("rating")          << rating                  << ""   << QStringList({rating});
+    QTest::newRow("rating+content")  << rating + " " + text     << text << QStringList({rating});
+    QTest::newRow("rating+filename") << rating + " " + filename << text << QStringList({rating});
+    // Test for modified date
+    QTest::newRow("modified")          << modified                  << ""   << QStringList({modified});
+    QTest::newRow("modified+content")  << modified + " " + text     << text << QStringList({modified});
+    QTest::newRow("modified+filename") << modified + " " + filename << text << QStringList({modified});
+    // Combined tests
+    QTest::newRow("rating+modified")          << rating + " AND " + modified                  << ""   << QStringList({modified, rating});
+    QTest::newRow("rating+modified+content")  << rating + " AND " + modified + " " + text     << text << QStringList({modified, rating});
+    QTest::newRow("rating+modified+filename") << rating + " AND " + modified + " " + filename << text << QStringList({modified, rating});
+}
+
+/**
+ * Helper function to compose the baloo query URL used for searching
+ */
+QUrl composeQueryUrl(const QString& searchString)
+{
+    const QJsonObject jsonObject {
+        {"searchString", searchString}
+    };
+
+    const QJsonDocument doc(jsonObject);
+    const QString queryString = QString::fromUtf8(doc.toJson(QJsonDocument::Compact));
+
+    QUrlQuery urlQuery;
+    urlQuery.addQueryItem(QStringLiteral("json"), queryString);
+
+    QUrl searchUrl;
+    searchUrl.setScheme(QLatin1String("baloosearch"));
+    searchUrl.setQuery(urlQuery);
+
+    return searchUrl;
+}
+
+/**
+ * The test verifies whether the different terms of a Baloo search URL ("baloosearch:") are
+ * properly handled by the searchbox, and only "user" or filename terms are added to the
+ * text bar of the searchbox.
+ */
+void DolphinSearchBoxTest::testBalooSearchParsing()
+{
+    QFETCH(QString, searchString);
+    QFETCH(QString, expectedText);
+    QFETCH(QStringList, expectedTerms);
+
+    const QUrl testUrl = composeQueryUrl(searchString);
+    const DolphinQuery query = DolphinQuery::fromBalooSearchUrl(testUrl);
+
+    QStringList searchTerms = query.searchTerms();
+    searchTerms.sort();
+
+    // FIXME: Current parsing bugs
+    QEXPECT_FAIL("content/singleQuote", "Quotes around text are shown", Continue);
+    QEXPECT_FAIL("content/doubleQuote", "Quotes around text are shown", Continue);
+
+    QEXPECT_FAIL("filename",             "Quotes around text are shown", Continue);
+    QEXPECT_FAIL("filename/singleQuote", "Quotes around text are shown", Continue);
+    QEXPECT_FAIL("filename/doubleQuote", "Quotes around text are shown", Continue);
+
+    QEXPECT_FAIL("rating"                  , "Text includes also search terms", Continue);
+    QEXPECT_FAIL("rating+content"          , "Text includes also search terms", Continue);
+    QEXPECT_FAIL("rating+filename"         , "Text includes also search terms", Continue);
+    QEXPECT_FAIL("modified"                , "Text includes also search terms", Continue);
+    QEXPECT_FAIL("modified+content"        , "Text includes also search terms", Continue);
+    QEXPECT_FAIL("modified+filename"       , "Text includes also search terms", Continue);
+    QEXPECT_FAIL("rating+modified"         , "Text includes also search terms", Continue);
+    QEXPECT_FAIL("rating+modified+content" , "Text includes also search terms", Continue);
+    QEXPECT_FAIL("rating+modified+filename", "Text includes also search terms", Continue);
+
+    // Check for parsed text (would be displayed on the input search bar)
+    QCOMPARE(query.text(), expectedText);
+
+    // Check for parsed search terms (would be displayed by the facetsWidget)
+    QCOMPARE(searchTerms.count(), expectedTerms.count());
+    for (int i = 0; i < expectedTerms.count(); i++) {
+        QCOMPARE(searchTerms.at(i), expectedTerms.at(i));
+    }
+}
+
+QTEST_MAIN(DolphinSearchBoxTest)
+
+#include "dolphinquerytest.moc"