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"