File indexing completed on 2024-04-28 15:59:43

0001 /*
0002     SPDX-FileCopyrightText: 2023 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #include "mocknetworkaccessmanager.h"
0007 
0008 #include <KPublicTransport/JourneyReply>
0009 #include <KPublicTransport/JourneyRequest>
0010 #include <KPublicTransport/Manager>
0011 #include <KPublicTransport/Location>
0012 #include <KPublicTransport/StopoverReply>
0013 #include <KPublicTransport/StopoverRequest>
0014 
0015 #include <QFile>
0016 #include <QSignalSpy>
0017 #include <QTest>
0018 #include <QUrlQuery>
0019 #include <QTimeZone>
0020 
0021 #define s(x) QStringLiteral(x)
0022 
0023 using namespace KPublicTransport;
0024 
0025 class HafasMgateRequestTest : public QObject
0026 {
0027     Q_OBJECT
0028 private Q_SLOTS:
0029     void initTestCase()
0030     {
0031         qputenv("TZ", "UTC");
0032         qputenv("LANG", "en_US");
0033 
0034         m_mgr.setNetworkAccessManager(&m_nam);
0035     }
0036 
0037     void testStopoverRequest_data()
0038     {
0039         QTest::addColumn<StopoverRequest>("request");
0040         QTest::addColumn<QUrl>("requestUrl");
0041         QTest::addColumn<QByteArray>("postData");
0042 
0043         StopoverRequest req;
0044         req.setBackendIds({s("de_db")});
0045         Location stop;
0046         stop.setIdentifier(QLatin1String("ibnr"), QLatin1String("8012345"));
0047         req.setStop(stop);
0048         req.setDateTime(QDateTime({2023, 6, 25}, {9, 39}, QTimeZone::UTC));
0049         QTest::newRow("id-based-default") << req << QUrl(s("https://reiseauskunft.bahn.de/bin/mgate.exe"))
0050             << QByteArray(R"({"auth":{"aid":"n91dB8Z77MLdoR0K","type":"AID"},"client":{"id":"DB","name":"DB Navigator","type":"AND","v":19040000},"ext":"DB.R20.12.b","formatted":false,"lang":"en","svcReqL":[{"meth":"StationBoard","req":{"date":"20230625","maxJny":12,"stbFltrEquiv":true,"stbLoc":{"extId":"8012345","type":"S"},"time":"113900","type":"DEP"}}],"ver":"1.18"})");
0051 
0052         stop = {};
0053         stop.setCoordinate(52, 13);
0054         req.setStop(stop);
0055         QTest::newRow("coordinate-based-default") << req << QUrl(s("https://reiseauskunft.bahn.de/bin/mgate.exe"))
0056             << QByteArray(R"({"auth":{"aid":"n91dB8Z77MLdoR0K","type":"AID"},"client":{"id":"DB","name":"DB Navigator","type":"AND","v":19040000},"ext":"DB.R20.12.b","formatted":false,"lang":"en","svcReqL":[{"meth":"StationBoard","req":{"date":"20230625","maxJny":12,"stbFltrEquiv":true,"stbLoc":{"crd":{"x":13000000,"y":52000000},"type":"C"},"time":"113900","type":"DEP"}}],"ver":"1.18"})");
0057 
0058         req.setBackendIds({s("de_bb_vbb")});
0059         req.setMaximumResults(3);
0060         req.setMode(StopoverRequest::QueryArrival);
0061         QTest::newRow("arrival-max-result") << req << QUrl(s("https://fahrinfo.vbb.de/bin/mgate.exe"))
0062             << QByteArray(R"({"auth":{"aid":"hafas-vbb-apps","type":"AID"},"client":{"id":"VBB","type":"AND"},"ext":"VBB.4","formatted":false,"lang":"en","svcReqL":[{"meth":"StationBoard","req":{"date":"20230625","maxJny":3,"stbLoc":{"crd":{"x":13000000,"y":52000000},"type":"C"},"time":"113900","type":"ARR"}}],"ver":"1.45"})");
0063 
0064         req.setLineModes({Line::LocalTrain, Line::RapidTransit, Line::Metro});
0065         QTest::newRow("line-mode-constraints") << req << QUrl(s("https://fahrinfo.vbb.de/bin/mgate.exe"))
0066             << QByteArray(R"({"auth":{"aid":"hafas-vbb-apps","type":"AID"},"client":{"id":"VBB","type":"AND"},"ext":"VBB.4","formatted":false,"lang":"en","svcReqL":[{"meth":"StationBoard","req":{"date":"20230625","jnyFltrL":[{"mode":"INC","type":"PROD","value":"67"}],"maxJny":3,"stbLoc":{"crd":{"x":13000000,"y":52000000},"type":"C"},"time":"113900","type":"ARR"}}],"ver":"1.45"})");
0067     }
0068 
0069     void testStopoverRequest()
0070     {
0071         QFETCH(StopoverRequest, request);
0072         QFETCH(QUrl, requestUrl);
0073         QFETCH(QByteArray, postData);
0074 
0075         m_nam.requests.clear();
0076         QVERIFY(request.isValid());
0077 
0078         auto reply = m_mgr.queryStopover(request);
0079         QSignalSpy finishedSpy(reply, &Reply::finished);
0080         QVERIFY(finishedSpy.wait());
0081         reply->deleteLater();
0082         QCOMPARE(reply->error(), Reply::NetworkError);
0083         QCOMPARE(m_nam.requests.size(), 1);
0084         QCOMPARE(m_nam.requests[0].op, QNetworkAccessManager::PostOperation);
0085 
0086         auto url = m_nam.requests[0].request.url();
0087         QVERIFY(url.isValid());
0088         QUrlQuery query(url);
0089         query.removeQueryItem(QLatin1String("checksum"));
0090         query.removeQueryItem(QLatin1String("mic"));
0091         query.removeQueryItem(QLatin1String("mac"));
0092         url.setQuery(query);
0093         QCOMPARE(url, requestUrl);
0094 
0095         qDebug().noquote() << m_nam.requests[0].data;
0096         QCOMPARE(m_nam.requests[0].data, postData);
0097     }
0098 
0099     void testJourneyRequest_data()
0100     {
0101         QTest::addColumn<JourneyRequest>("request");
0102         QTest::addColumn<QUrl>("requestUrl");
0103         QTest::addColumn<QByteArray>("postData");
0104 
0105         JourneyRequest req;
0106         req.setBackendIds({s("de_db")});
0107         Location from;
0108         from.setIdentifier(QLatin1String("ibnr"), QLatin1String("8012345"));
0109         Location to;
0110         to.setIdentifier(QLatin1String("ibnr"), QLatin1String("8023456"));
0111         req.setFrom(from);
0112         req.setTo(to);
0113         req.setDateTime(QDateTime({2023, 6, 24}, {20, 58}, QTimeZone::UTC));
0114         QTest::newRow("id-based-default") << req << QUrl(s("https://reiseauskunft.bahn.de/bin/mgate.exe"))
0115             << QByteArray(R"({"auth":{"aid":"n91dB8Z77MLdoR0K","type":"AID"},"client":{"id":"DB","name":"DB Navigator","type":"AND","v":19040000},"ext":"DB.R20.12.b","formatted":false,"lang":"en","svcReqL":[{"cfg":{"polyEnc":"GPA"},"meth":"TripSearch","req":{"arrLocL":[{"extId":"8023456","type":"S"}],"depLocL":[{"extId":"8012345","type":"S"}],"extChgTime":-1,"getEco":false,"getIST":false,"getPasslist":true,"getPolyline":false,"getSimpleTrainComposition":true,"getTrainComposition":true,"numF":12,"outDate":"20230624","outFrwd":true,"outTime":"225800"}}],"ver":"1.18"})");
0116 
0117         from = {};
0118         from.setCoordinate(52, 13);
0119         to = {};
0120         to.setCoordinate(48, 12);
0121         req.setFrom(from);
0122         req.setTo(to);
0123         QTest::newRow("coordinate-based-default") << req << QUrl(s("https://reiseauskunft.bahn.de/bin/mgate.exe"))
0124             << QByteArray(R"({"auth":{"aid":"n91dB8Z77MLdoR0K","type":"AID"},"client":{"id":"DB","name":"DB Navigator","type":"AND","v":19040000},"ext":"DB.R20.12.b","formatted":false,"lang":"en","svcReqL":[{"cfg":{"polyEnc":"GPA"},"meth":"TripSearch","req":{"arrLocL":[{"crd":{"x":12000000,"y":48000000},"type":"C"}],"depLocL":[{"crd":{"x":13000000,"y":52000000},"type":"C"}],"extChgTime":-1,"getEco":false,"getIST":false,"getPasslist":true,"getPolyline":false,"getSimpleTrainComposition":true,"getTrainComposition":true,"numF":12,"outDate":"20230624","outFrwd":true,"outTime":"225800"}}],"ver":"1.18"})");
0125 
0126         req.setBackendIds({s("de_be_bvg")});
0127         req.setMaximumResults(4);
0128         req.setIncludeIntermediateStops(false);
0129         req.setIncludePaths(true);
0130         req.setDateTimeMode(JourneyRequest::Arrival);
0131         req.setAccessModes({ IndividualTransport::Walk, IndividualTransport::Bike });
0132         req.setEgressModes({ IndividualTransport::Walk, IndividualTransport::Bike });
0133         QTest::newRow("arrival-with-access-mode") << req << QUrl(s("https://bvg-apps.hafas.de/bin/mgate.exe"))
0134             << QByteArray(R"({"auth":{"aid":"YoJ05NartnanEGCj","type":"AID"},"client":{"id":"BVG","type":"AND"},"ext":"BVG.1","formatted":false,"lang":"en","svcReqL":[{"cfg":{"polyEnc":"GPA"},"meth":"TripSearch","req":{"arrLocL":[{"crd":{"x":12000000,"y":48000000},"type":"C"}],"depLocL":[{"crd":{"x":13000000,"y":52000000},"type":"C"}],"extChgTime":-1,"getEco":false,"getIST":false,"getPasslist":false,"getPolyline":true,"getSimpleTrainComposition":true,"getTrainComposition":true,"jnyFltrL":[{"mode":"INC","type":"GROUP","value":"BIKE_OEV_BIKE"}],"numF":4,"outDate":"20230624","outFrwd":false,"outTime":"225800"}}],"ver":"1.44"})");
0135 
0136         req.setLineModes({Line::Bus, Line::Ferry});
0137         QTest::newRow("line-mode-constraints") << req << QUrl(s("https://bvg-apps.hafas.de/bin/mgate.exe"))
0138             << QByteArray(R"({"auth":{"aid":"YoJ05NartnanEGCj","type":"AID"},"client":{"id":"BVG","type":"AND"},"ext":"BVG.1","formatted":false,"lang":"en","svcReqL":[{"cfg":{"polyEnc":"GPA"},"meth":"TripSearch","req":{"arrLocL":[{"crd":{"x":12000000,"y":48000000},"type":"C"}],"depLocL":[{"crd":{"x":13000000,"y":52000000},"type":"C"}],"extChgTime":-1,"getEco":false,"getIST":false,"getPasslist":false,"getPolyline":true,"getSimpleTrainComposition":true,"getTrainComposition":true,"jnyFltrL":[{"mode":"INC","type":"GROUP","value":"BIKE_OEV_BIKE"},{"mode":"INC","type":"PROD","value":"24"}],"numF":4,"outDate":"20230624","outFrwd":false,"outTime":"225800"}}],"ver":"1.44"})");
0139     }
0140 
0141     void testJourneyRequest()
0142     {
0143         QFETCH(JourneyRequest, request);
0144         QFETCH(QUrl, requestUrl);
0145         QFETCH(QByteArray, postData);
0146 
0147         m_nam.requests.clear();
0148         QVERIFY(request.isValid());
0149 
0150         auto reply = m_mgr.queryJourney(request);
0151         QSignalSpy finishedSpy(reply, &Reply::finished);
0152         QVERIFY(finishedSpy.wait());
0153         reply->deleteLater();
0154         QCOMPARE(reply->error(), Reply::NetworkError);
0155         QCOMPARE(m_nam.requests.size(), 1);
0156         QCOMPARE(m_nam.requests[0].op, QNetworkAccessManager::PostOperation);
0157 
0158         auto url = m_nam.requests[0].request.url();
0159         QVERIFY(url.isValid());
0160         QUrlQuery query(url);
0161         query.removeQueryItem(QLatin1String("checksum"));
0162         url.setQuery(query);
0163         QCOMPARE(url, requestUrl);
0164         qDebug().noquote() << m_nam.requests[0].data;
0165         QCOMPARE(m_nam.requests[0].data, postData);
0166     }
0167 
0168 private:
0169     MockNetworkAccessManager m_nam;
0170     Manager m_mgr;
0171 };
0172 
0173 QTEST_GUILESS_MAIN(HafasMgateRequestTest)
0174 
0175 #include "hafasmgaterequesttest.moc"