File indexing completed on 2024-05-12 05:22:06

0001 /*
0002  * SPDX-FileCopyrightText: 2018 Daniel Vrátil <dvratil@kde.org>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005  */
0006 
0007 #include <QObject>
0008 #include <QTest>
0009 
0010 #include "fakenetworkaccessmanagerfactory.h"
0011 #include "testutils.h"
0012 
0013 #include "account.h"
0014 #include "fetchjob.h"
0015 
0016 Q_DECLARE_METATYPE(QList<FakeNetworkAccessManager::Scenario>)
0017 
0018 using Scenarios = QList<FakeNetworkAccessManager::Scenario>;
0019 
0020 using namespace KGAPI2;
0021 
0022 class TestFetchJob : public FetchJob
0023 {
0024     Q_OBJECT
0025 
0026 public:
0027     explicit TestFetchJob(const QUrl &url, QObject *parent = nullptr)
0028         : FetchJob(parent)
0029         , mUrl(url)
0030     {
0031     }
0032 
0033     TestFetchJob(const AccountPtr &account, const QUrl &url, QObject *parent = nullptr)
0034         : FetchJob(account, parent)
0035         , mUrl(url)
0036     {
0037     }
0038 
0039     void start() override
0040     {
0041         QNetworkRequest request(mUrl);
0042         enqueueRequest(request);
0043     }
0044 
0045     QByteArray response()
0046     {
0047         return mResponse;
0048     }
0049 
0050     void handleReply(const QNetworkReply *, const QByteArray &rawData) override
0051     {
0052         mResponse = rawData;
0053         emitFinished();
0054     }
0055 
0056 private:
0057     QUrl mUrl;
0058     QByteArray mResponse;
0059 };
0060 
0061 class FetchJobTest : public QObject
0062 {
0063     Q_OBJECT
0064 private Q_SLOTS:
0065     void initTestCase()
0066     {
0067         NetworkAccessManagerFactory::setFactory(new FakeNetworkAccessManagerFactory);
0068     }
0069 
0070     void testUnauthenticatedFetch_data()
0071     {
0072         QTest::addColumn<QList<FakeNetworkAccessManager::Scenario>>("scenarios");
0073 
0074         QTest::newRow("success") << Scenarios{{QUrl(QStringLiteral("https://example.test/request/data?prettyPrint=false")),
0075                                                QNetworkAccessManager::GetOperation,
0076                                                {},
0077                                                200,
0078                                                "Test Response",
0079                                                false}};
0080 
0081         QTest::newRow("not found") << Scenarios{{QUrl(QStringLiteral("https://example.test/does/not/exist?prettyPrint=false")),
0082                                                  QNetworkAccessManager::GetOperation,
0083                                                  {},
0084                                                  KGAPI2::NotFound,
0085                                                  {},
0086                                                  false}};
0087 
0088         QTest::newRow("redirect") << Scenarios{{QUrl(QStringLiteral("https://example.test/request/data?prettyPrint=false")),
0089                                                 QNetworkAccessManager::GetOperation,
0090                                                 {},
0091                                                 KGAPI2::TemporarilyMoved,
0092                                                 "https://example.test/moved/data",
0093                                                 false},
0094                                                {QUrl(QStringLiteral("https://example.test/moved/data?prettyPrint=false")),
0095                                                 QNetworkAccessManager::GetOperation,
0096                                                 {},
0097                                                 KGAPI2::OK,
0098                                                 "Here's your data",
0099                                                 false}};
0100     }
0101 
0102     void testUnauthenticatedFetch()
0103     {
0104         QFETCH(QList<FakeNetworkAccessManager::Scenario>, scenarios);
0105 
0106         FakeNetworkAccessManagerFactory::get()->setScenarios(scenarios);
0107 
0108         auto job = new TestFetchJob(scenarios.first().requestUrl);
0109         QVERIFY(execJob(job));
0110         QCOMPARE(static_cast<int>(job->error()), scenarios.last().responseCode == 200 ? KGAPI2::NoError : scenarios.last().responseCode);
0111         QCOMPARE(job->response(), scenarios.last().responseData);
0112 
0113         QVERIFY(!FakeNetworkAccessManagerFactory::get()->hasScenario());
0114     }
0115 
0116     void testAuthenticatedFetch_data()
0117     {
0118         QTest::addColumn<QList<FakeNetworkAccessManager::Scenario>>("scenarios");
0119 
0120         QTest::newRow("success") << Scenarios{
0121             {QUrl(QStringLiteral("https://example.test/request/data?prettyPrint=false")), QNetworkAccessManager::GetOperation, {}, 200, "Response"}};
0122 
0123         QTest::newRow("token expired") << Scenarios{
0124             {QUrl(QStringLiteral("https://example.test/request/data?prettyPrint=false")), QNetworkAccessManager::GetOperation, {}, KGAPI2::Unauthorized, {}}};
0125     }
0126 
0127     void testAuthenticatedFetch()
0128     {
0129         QFETCH(QList<FakeNetworkAccessManager::Scenario>, scenarios);
0130 
0131         FakeNetworkAccessManagerFactory::get()->setScenarios(scenarios);
0132 
0133         auto account = AccountPtr::create(QStringLiteral("MockAccount"), QStringLiteral("MockToken"));
0134         auto job = new TestFetchJob(account, scenarios.first().requestUrl);
0135         QVERIFY(execJob(job));
0136         QCOMPARE(static_cast<int>(job->error()), scenarios.last().responseCode == 200 ? KGAPI2::NoError : scenarios.last().responseCode);
0137         QCOMPARE(job->response(), scenarios.last().responseData);
0138 
0139         QVERIFY(!FakeNetworkAccessManagerFactory::get()->hasScenario());
0140     }
0141 };
0142 
0143 QTEST_GUILESS_MAIN(FetchJobTest)
0144 
0145 #include "fetchjobtest.moc"