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"