File indexing completed on 2025-03-09 04:47:30

0001 /*
0002    SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
0003    SPDX-FileContributor: Kevin Ottens <kevin@kdab.com>
0004 
0005    SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "imaptestbase.h"
0009 
0010 #include "retrieveitemtask.h"
0011 #include <QTest>
0012 class TestRetrieveItemTask : public ImapTestBase
0013 {
0014     Q_OBJECT
0015 
0016 private Q_SLOTS:
0017     void shouldFetchMessage_data()
0018     {
0019         QTest::addColumn<Akonadi::Item>("item");
0020         QTest::addColumn<QString>("message");
0021         QTest::addColumn<QList<QByteArray>>("scenario");
0022         QTest::addColumn<QString>("callName");
0023 
0024         Akonadi::Collection collection;
0025         Akonadi::Item item;
0026         QString message;
0027         QList<QByteArray> scenario;
0028 
0029         collection = createCollectionChain(QStringLiteral("/INBOX/Foo"));
0030         item = Akonadi::Item(2);
0031         item.setParentCollection(collection);
0032         item.setRemoteId(QStringLiteral("42"));
0033 
0034         message = QStringLiteral("From: ervin\nTo: someone\nSubject: foo\n\nSpeechless...");
0035 
0036         scenario.clear();
0037         scenario << defaultPoolConnectionScenario() << "C: A000003 SELECT \"INBOX/Foo\""
0038                  << "S: A000003 OK select done"
0039                  << "C: A000004 UID FETCH 42 (BODY.PEEK[] UID)"
0040                  << "S: * 10 FETCH (UID 42 BODY[] \"From: ervin\nTo: someone\nSubject: foo\n\nSpeechless...\")"
0041                  << "S: A000004 OK fetch done";
0042         QTest::newRow("normal case") << item << message << scenario << "itemRetrieved";
0043 
0044         scenario.clear();
0045         scenario << defaultPoolConnectionScenario() << "C: A000003 SELECT \"INBOX/Foo\""
0046                  << "S: A000003 NO select fail";
0047         QTest::newRow("select fail") << item << message << scenario << "cancelTask";
0048 
0049         scenario.clear();
0050         scenario << defaultPoolConnectionScenario() << "C: A000003 SELECT \"INBOX/Foo\""
0051                  << "S: A000003 OK select done"
0052                  << "C: A000004 UID FETCH 42 (BODY.PEEK[] UID)"
0053                  << "S: A000004 NO fetch failed";
0054         QTest::newRow("fetch fail") << item << message << scenario << "cancelTask";
0055     }
0056 
0057     void shouldFetchMessage()
0058     {
0059         QFETCH(Akonadi::Item, item);
0060         QFETCH(QString, message);
0061         QFETCH(QList<QByteArray>, scenario);
0062         QFETCH(QString, callName);
0063 
0064         FakeServer server;
0065         server.setScenario(scenario);
0066         server.startAndWait();
0067 
0068         SessionPool pool(1);
0069 
0070         pool.setPasswordRequester(createDefaultRequester());
0071         QVERIFY(pool.connect(createDefaultAccount()));
0072         QVERIFY(waitForSignal(&pool, SIGNAL(connectDone(int, QString))));
0073 
0074         DummyResourceState::Ptr state = DummyResourceState::Ptr(new DummyResourceState);
0075         state->setItem(item);
0076         auto task = new RetrieveItemTask(state);
0077         task->start(&pool);
0078 
0079         QTRY_COMPARE(state->calls().count(), 1);
0080 
0081         QString command = QString::fromUtf8(state->calls().first().first);
0082         if (command == QLatin1StringView("cancelTask") && callName != QLatin1StringView("cancelTask")) {
0083             qDebug() << "Got a cancel:" << state->calls().first().second.toString();
0084         }
0085         QCOMPARE(command, callName);
0086 
0087         QVariant parameter = state->calls().first().second;
0088 
0089         if (callName == QLatin1StringView("itemRetrieved")) {
0090             QCOMPARE(parameter.value<Akonadi::Item>().id(), item.id());
0091             QCOMPARE(parameter.value<Akonadi::Item>().remoteId(), item.remoteId());
0092 
0093             QString payload = QString::fromUtf8(parameter.value<Akonadi::Item>().payload<KMime::Message::Ptr>()->encodedContent());
0094 
0095             QCOMPARE(payload, message);
0096         } else if (callName == QLatin1StringView("cancelTask")) {
0097             QVERIFY(!parameter.toString().isEmpty());
0098         } else {
0099             QFAIL(QStringLiteral("Unexpected call type: %1").arg(callName).toUtf8().constData());
0100         }
0101 
0102         QVERIFY(server.isAllScenarioDone());
0103 
0104         server.quit();
0105     }
0106 };
0107 
0108 QTEST_GUILESS_MAIN(TestRetrieveItemTask)
0109 
0110 #include "testretrieveitemtask.moc"