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"