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"