File indexing completed on 2024-05-12 05:17:11

0001 /*
0002     SPDX-FileCopyrightText: 2016 Daniel Vrátil <dvratil@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include <QTest>
0008 
0009 #include "kimap/loginjob.h"
0010 #include "kimap/session.h"
0011 #include "kimap/statusjob.h"
0012 #include "kimaptest/fakeserver.h"
0013 
0014 using StatusMap = QList<QPair<QByteArray, qint64>>;
0015 Q_DECLARE_METATYPE(StatusMap)
0016 
0017 class StatusJobTest : public QObject
0018 {
0019     Q_OBJECT
0020 
0021 private Q_SLOTS:
0022 
0023     void testStatus_data()
0024     {
0025         QTest::addColumn<QList<QByteArray>>("scenario");
0026         QTest::addColumn<QList<QByteArray>>("dataItems");
0027         QTest::addColumn<StatusMap>("results");
0028 
0029         QList<QByteArray> scenario;
0030         QList<QByteArray> dataItems;
0031         StatusMap results;
0032         scenario << FakeServer::preauth() << "C: A000001 STATUS \"INBOX\" (MESSAGES RECENT UIDNEXT UIDVALIDITY UNSEEN)"
0033                  << "S: * STATUS \"INBOX\" (MESSAGES 294 RECENT 1 UIDNEXT 295 UIDVALIDITY 458587604 UNSEEN 181)"
0034                  << "S: A000001 OK STATUS Completed";
0035         dataItems = {"MESSAGES", "RECENT", "UIDNEXT", "UIDVALIDITY", "UNSEEN"};
0036         results = {{"MESSAGES", 294}, {"RECENT", 1}, {"UIDNEXT", 295}, {"UIDVALIDITY", 458587604}, {"UNSEEN", 181}};
0037         QTest::newRow("good") << scenario << dataItems << results;
0038 
0039         scenario.clear();
0040         results.clear();
0041         scenario << FakeServer::preauth() << "C: A000001 STATUS \"INBOX\" (MESSAGES UIDNEXT HIGHESTMODSEQ)"
0042                  << "S: * STATUS \"INBOX\" (MESSAGES 294 UIDNEXT 295)"
0043                  << "S: A000001 OK STATUS Completed";
0044         dataItems = {"MESSAGES", "UIDNEXT", "HIGHESTMODSEQ"};
0045         results = {{"MESSAGES", 294}, {"UIDNEXT", 295}};
0046         QTest::newRow("incomplete") << scenario << dataItems << results;
0047 
0048         scenario.clear();
0049         results.clear();
0050         scenario << FakeServer::preauth() << "C: A000001 STATUS \"INBOX\" (HIGHESTMODSEQ)"
0051                  << "S: * STATUS \"INBOX\" ()"
0052                  << "S: A000001 OK STATUS Completed";
0053         dataItems = {"HIGHESTMODSEQ"};
0054         QTest::newRow("empty response") << scenario << dataItems << results;
0055 
0056         scenario.clear();
0057         results.clear();
0058         scenario << FakeServer::preauth() << "C: A000001 STATUS \"INBOX\" (MESSAGES HIGHESTMODSEQ)"
0059                  << "S: A000001 NO status failure";
0060         dataItems = {"MESSAGES", "HIGHESTMODSEQ"};
0061         results.clear();
0062         QTest::newRow("no") << scenario << dataItems << results;
0063 
0064         scenario.clear();
0065         results.clear();
0066         scenario << FakeServer::preauth() << "C: A000001 STATUS \"INBOX\" (UIDNEXT)"
0067                  << "S: A000001 NO bad command";
0068         dataItems = {"UIDNEXT"};
0069         QTest::newRow("bad") << scenario << dataItems << results;
0070     }
0071 
0072     void testStatus()
0073     {
0074         QFETCH(QList<QByteArray>, scenario);
0075         QFETCH(QList<QByteArray>, dataItems);
0076         QFETCH(StatusMap, results);
0077 
0078         FakeServer fakeServer;
0079         fakeServer.setScenario(scenario);
0080         fakeServer.startAndWait();
0081 
0082         KIMAP::Session session(QStringLiteral("127.0.0.1"), 5989);
0083         auto job = new KIMAP::StatusJob(&session);
0084         job->setMailBox(QStringLiteral("INBOX"));
0085         job->setDataItems(dataItems);
0086         bool result = job->exec();
0087 
0088         QEXPECT_FAIL("bad", "Expected failure on BAD scenario", Continue);
0089         QEXPECT_FAIL("no", "Expected failure on NO scenario", Continue);
0090         QVERIFY(result);
0091 
0092         if (result) {
0093             const StatusMap status = job->status();
0094             QCOMPARE(status.count(), results.count());
0095             for (int i = 0; i < results.count(); ++i) {
0096                 QCOMPARE(results[i].first, status[i].first);
0097                 QCOMPARE(results[i].second, status[i].second);
0098             }
0099         }
0100 
0101         fakeServer.quit();
0102     }
0103 };
0104 
0105 QTEST_GUILESS_MAIN(StatusJobTest)
0106 
0107 #include "statusjobtest.moc"