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"