File indexing completed on 2024-05-19 05:14:14
0001 /* 0002 SPDX-FileCopyrightText: 2023 Volker Krause <vkrause@kde.org> 0003 SPDX-License-Identifier: LGPL-2.0-or-later 0004 */ 0005 0006 #include "testhelper.h" 0007 #include "mocknetworkaccessmanager.h" 0008 0009 #include "downloadjob.h" 0010 0011 #include <QUrl> 0012 #include <QtTest/qtest.h> 0013 #include <QSignalSpy> 0014 #include <QStandardPaths> 0015 0016 class DownloadJobTest : public QObject 0017 { 0018 Q_OBJECT 0019 private Q_SLOTS: 0020 void initTestCase() 0021 { 0022 QStandardPaths::setTestModeEnabled(true); 0023 } 0024 0025 void testRegularDownload() 0026 { 0027 m_nam.requests.clear(); 0028 m_nam.replies.push({QNetworkReply::ContentNotFoundError, 404, QByteArray(), QString()}); 0029 m_nam.replies.push({QNetworkReply::NoError, 200, QByteArray("<html><body>Hello</body></html>"), QString()}); 0030 0031 DownloadJob job(QUrl(QStringLiteral("https://akademy.kde.org/2023/")), &m_nam); 0032 QSignalSpy finishedSpy(&job, &DownloadJob::finished); 0033 QVERIFY(finishedSpy.wait()); 0034 0035 QCOMPARE(m_nam.requests.size(), 2); // (failed) activity pub request and the actual download 0036 QCOMPARE(m_nam.requests[0].op, QNetworkAccessManager::GetOperation); 0037 QCOMPARE(m_nam.requests[0].request.url(), QUrl(QStringLiteral("https://akademy.kde.org/2023/"))); 0038 QVERIFY(m_nam.requests[0].request.rawHeader("Accept").contains("activitystreams")); 0039 0040 QCOMPARE(m_nam.requests[1].op, QNetworkAccessManager::GetOperation); 0041 QCOMPARE(m_nam.requests[1].request.url(), QUrl(QStringLiteral("https://akademy.kde.org/2023/"))); 0042 QVERIFY(!m_nam.requests[1].request.rawHeader("Accept").contains("activitystreams")); 0043 0044 QCOMPARE(job.hasError(), false); 0045 QCOMPARE(job.errorMessage(), QString()); 0046 QVERIFY(job.data().contains("Hello")); 0047 } 0048 0049 void testOnlineTicketDownload() 0050 { 0051 m_nam.requests.clear(); 0052 DownloadJob job(QUrl(QStringLiteral("http://dbnavigator.bahn.de/loadorder?&on=ABC123&name=Konqi&a.deeplink.id=&a.launch.campaign.trackingcode=ABC")), &m_nam); 0053 QSignalSpy finishedSpy(&job, &DownloadJob::finished); 0054 QVERIFY(finishedSpy.wait()); 0055 0056 QCOMPARE(m_nam.requests.size(), 1); 0057 QCOMPARE(m_nam.requests[0].op, QNetworkAccessManager::PostOperation); 0058 QCOMPARE(m_nam.requests[0].data, QByteArray("<rqorderdetails version=\"1.0\"><rqheader v=\"23040000\" os=\"KCI\" app=\"KCI-Webservice\"/><rqorder on=\"ABC123\"/><authname tln=\"KONQI\"/></rqorderdetails>")); 0059 } 0060 0061 void testActivityPubDownload() 0062 { 0063 m_nam.requests.clear(); 0064 m_nam.replies.push({QNetworkReply::NoError, 200, QByteArray("{\"@context\": \"https://www.w3.org/ns/activitystreams\"}"), QString()}); 0065 0066 DownloadJob job(QUrl(QStringLiteral("https://akademy.kde.org/2023/")), &m_nam); 0067 QSignalSpy finishedSpy(&job, &DownloadJob::finished); 0068 QVERIFY(finishedSpy.wait()); 0069 0070 QCOMPARE(m_nam.requests.size(), 1); 0071 QCOMPARE(m_nam.requests[0].op, QNetworkAccessManager::GetOperation); 0072 QCOMPARE(m_nam.requests[0].request.url(), QUrl(QStringLiteral("https://akademy.kde.org/2023/"))); 0073 QVERIFY(m_nam.requests[0].request.rawHeader("Accept").contains("activitystreams")); 0074 0075 QCOMPARE(job.hasError(), false); 0076 QCOMPARE(job.errorMessage(), QString()); 0077 QVERIFY(job.data().contains("@context")); 0078 } 0079 0080 void test404() 0081 { 0082 m_nam.requests.clear(); 0083 m_nam.replies.push({QNetworkReply::ContentNotFoundError, 404, QByteArray("garbage"), QStringLiteral("Invalid Request")}); 0084 m_nam.replies.push({QNetworkReply::ContentNotFoundError, 404, QByteArray("garbage"), QStringLiteral("File not found")}); 0085 0086 DownloadJob job(QUrl(QStringLiteral("https://akademy.kde.org/2023/")), &m_nam); 0087 QSignalSpy finishedSpy(&job, &DownloadJob::finished); 0088 QVERIFY(finishedSpy.wait()); 0089 0090 QCOMPARE(m_nam.requests.size(), 2); // (failed) activity pub request and the actual download 0091 QCOMPARE(m_nam.requests[0].op, QNetworkAccessManager::GetOperation); 0092 QCOMPARE(m_nam.requests[0].request.url(), QUrl(QStringLiteral("https://akademy.kde.org/2023/"))); 0093 QVERIFY(m_nam.requests[0].request.rawHeader("Accept").contains("activitystreams")); 0094 0095 QCOMPARE(m_nam.requests[1].op, QNetworkAccessManager::GetOperation); 0096 QCOMPARE(m_nam.requests[1].request.url(), QUrl(QStringLiteral("https://akademy.kde.org/2023/"))); 0097 QVERIFY(!m_nam.requests[1].request.rawHeader("Accept").contains("activitystreams")); 0098 0099 QCOMPARE(job.hasError(), true); 0100 QVERIFY(job.errorMessage().contains(QLatin1StringView("File not found"))); 0101 QCOMPARE(job.data(), QByteArray()); 0102 } 0103 0104 void testNetworkFailure() 0105 { 0106 m_nam.requests.clear(); 0107 0108 DownloadJob job(QUrl(QStringLiteral("https://akademy.kde.org/2023/")), &m_nam); 0109 QSignalSpy finishedSpy(&job, &DownloadJob::finished); 0110 QVERIFY(finishedSpy.wait()); 0111 0112 QCOMPARE(m_nam.requests.size(), 1); 0113 QCOMPARE(m_nam.requests[0].op, QNetworkAccessManager::GetOperation); 0114 QCOMPARE(m_nam.requests[0].request.url(), QUrl(QStringLiteral("https://akademy.kde.org/2023/"))); 0115 QVERIFY(job.hasError()); 0116 QVERIFY(!job.errorMessage().isEmpty()); 0117 QCOMPARE(job.data(), QByteArray()); 0118 } 0119 0120 private: 0121 MockNetworkAccessManager m_nam; 0122 }; 0123 0124 QTEST_GUILESS_MAIN(DownloadJobTest) 0125 0126 #include "downloadjobtest.moc"