File indexing completed on 2024-04-28 05:19:53
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 "fakenetworkaccessmanager.h" 0008 #include "fakenetworkaccessmanagerfactory.h" 0009 #include "fakenetworkreply.h" 0010 #include "testutils.h" 0011 0012 #include <QNetworkRequest> 0013 0014 #include <iostream> 0015 0016 FakeNetworkAccessManager::FakeNetworkAccessManager(QObject *parent) 0017 : QNetworkAccessManager(parent) 0018 { 0019 } 0020 0021 QNetworkReply *FakeNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &originalReq, QIODevice *outgoingData) 0022 { 0023 auto namFactory = dynamic_cast<FakeNetworkAccessManagerFactory *>(KGAPI2::NetworkAccessManagerFactory::instance()); 0024 VERIFY2_RET(namFactory, "NAMFactory is nto a FakeNetworkAccessManagerFactory!", new FakeNetworkReply(op, originalReq)); 0025 VERIFY2_RET(namFactory->hasScenario(), "No scenario for request!", new FakeNetworkReply(op, originalReq)); 0026 0027 const auto scenario = namFactory->nextScenario(); 0028 if (scenario.needsAuth) { 0029 VERIFY2_RET(originalReq.hasRawHeader("Authorization"), "Missing Auth token header!", new FakeNetworkReply(op, originalReq)); 0030 } 0031 0032 COMPARE_RET(scenario.requestUrl, originalReq.url(), new FakeNetworkReply(op, originalReq)); 0033 if (op != QNetworkAccessManager::CustomOperation) { 0034 COMPARE_RET(scenario.requestMethod, op, new FakeNetworkReply(op, originalReq)); 0035 } else { 0036 const auto verb = originalReq.attribute(QNetworkRequest::CustomVerbAttribute).toByteArray(); 0037 // In the People API some of the requests ask for a custom verb called "PATCH", so allow this. 0038 // Additionally we use a modify job for photo deletion requests, which return the modified person. 0039 // This uses the "DELETE" verb but, since it acts as a modification on the person itself, we use 0040 // a modify job and we should therefore accept this verb here. 0041 if (verb != QByteArray("PATCH") && verb != QByteArray("PUT") && verb != QByteArray("DELETE")) { 0042 FAIL_RET("Invalid verb", new FakeNetworkReply(op, originalReq)); 0043 } 0044 } 0045 for (const auto &requestHeader : std::as_const(scenario.requestHeaders)) { 0046 VERIFY2_RET(originalReq.hasRawHeader(requestHeader.first), 0047 qPrintable(QStringLiteral("Missing header '%1'").arg(QString::fromUtf8(requestHeader.first))), 0048 new FakeNetworkReply(op, originalReq)); 0049 COMPARE_RET(originalReq.rawHeader(requestHeader.first), requestHeader.second, new FakeNetworkReply(op, originalReq)); 0050 } 0051 0052 if (outgoingData) { 0053 const auto actualRequest = outgoingData->readAll(); 0054 if (actualRequest.startsWith('<')) { 0055 const auto formattedInput = reformatXML(actualRequest); 0056 const auto formattedExpected = reformatXML(scenario.requestData); 0057 if (formattedInput != formattedExpected) { 0058 std::cerr << diffData(formattedInput, formattedExpected).constData() << std::endl; 0059 FAIL_RET("Request data don't match!", new FakeNetworkReply(op, originalReq)); 0060 } 0061 } else if (actualRequest.startsWith('{')) { 0062 const auto formattedInput = reformatJSON(actualRequest); 0063 const auto formattedExpected = reformatJSON(scenario.requestData); 0064 if (formattedInput != formattedExpected) { 0065 std::cerr << diffData(formattedInput, formattedExpected).constData() << std::endl; 0066 FAIL_RET("Request data don't match!", new FakeNetworkReply(op, originalReq)); 0067 } 0068 } else { 0069 COMPARE_RET(actualRequest, scenario.requestData, new FakeNetworkReply(op, originalReq)); 0070 } 0071 } 0072 0073 return new FakeNetworkReply(scenario); 0074 } 0075 0076 #include "moc_fakenetworkaccessmanager.cpp"