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

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 EfaRequestTest : 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 
0042         StopoverRequest req;
0043         req.setBackendIds({s("de_bw_vvs")});
0044         Location stop;
0045         stop.setIdentifier(QLatin1String("de_bw_vvs"), QLatin1String("12345"));
0046         req.setStop(stop);
0047         req.setDateTime(QDateTime({2023, 6, 25}, {9, 39}, QTimeZone::UTC));
0048         QTest::newRow("id-based-default") << req << QUrl(s("https://www2.vvs.de/vvs/XML_DM_REQUEST?outputFormat=XML&coordOutputFormat=WGS84[DD.ddddd]&language=en&type_dm=stop&name_dm=12345&itdDate=20230625&itdTime=0939&useRealtime=1&limit=12&mode=direct&ptOptionsActive=1&merge_dep=1&stateless=1&sessionID=0&requestID=0"));
0049 
0050         stop = {};
0051         stop.setCoordinate(48.78, 9.18);
0052         req.setStop(stop);
0053         req.setMaximumResults(3);
0054         QTest::newRow("coordinate-based") << req << QUrl(s("https://www2.vvs.de/vvs/XML_DM_REQUEST?outputFormat=XML&coordOutputFormat=WGS84[DD.ddddd]&language=en&type_dm=coord&name_dm=9.18:48.78:WGS84[DD.ddddd]&itdDate=20230625&itdTime=0939&useRealtime=1&limit=3&mode=direct&ptOptionsActive=1&merge_dep=1&stateless=1&sessionID=0&requestID=0"));
0055 
0056         // not supported, so no impact
0057         req.setLineModes({Line::LocalTrain, Line::RapidTransit, Line::Metro});
0058         QTest::newRow("line-mode-constraints") << req << QUrl(s("https://www2.vvs.de/vvs/XML_DM_REQUEST?outputFormat=XML&coordOutputFormat=WGS84[DD.ddddd]&language=en&type_dm=coord&name_dm=9.18:48.78:WGS84[DD.ddddd]&itdDate=20230625&itdTime=0939&useRealtime=1&limit=3&mode=direct&ptOptionsActive=1&merge_dep=1&stateless=1&sessionID=0&requestID=0"));
0059     }
0060 
0061     void testStopoverRequest()
0062     {
0063         QFETCH(StopoverRequest, request);
0064         QFETCH(QUrl, requestUrl);
0065 
0066         m_nam.requests.clear();
0067         QVERIFY(request.isValid());
0068 
0069         auto reply = m_mgr.queryStopover(request);
0070         QSignalSpy finishedSpy(reply, &Reply::finished);
0071         QVERIFY(finishedSpy.wait());
0072         reply->deleteLater();
0073         QCOMPARE(reply->error(), Reply::NetworkError);
0074         QCOMPARE(m_nam.requests.size(), 1);
0075         QCOMPARE(m_nam.requests[0].op, QNetworkAccessManager::GetOperation);
0076 
0077         const auto url = m_nam.requests[0].request.url();
0078         QCOMPARE(url, requestUrl);
0079     }
0080 
0081     void testJourneyRequest_data()
0082     {
0083         QTest::addColumn<JourneyRequest>("request");
0084         QTest::addColumn<QUrl>("requestUrl");
0085 
0086         JourneyRequest req;
0087         req.setBackendIds({s("de_bw_vvs")});
0088         Location from;
0089         from.setIdentifier(QLatin1String("de_bw_vvs"), QLatin1String("12345"));
0090         Location to;
0091         to.setIdentifier(QLatin1String("de_bw_vvs"), QLatin1String("23456"));
0092         req.setFrom(from);
0093         req.setTo(to);
0094         req.setDateTime(QDateTime({2023, 6, 24}, {20, 58}, QTimeZone::UTC));
0095         QTest::newRow("id-based-default") << req << QUrl(s("https://www2.vvs.de/vvs/XML_TRIP_REQUEST2?outputFormat=XML&coordOutputFormat=WGS84[DD.ddddd]&language=en&locationServerActive=1&useRealtime=1&type_origin=stop&name_origin=12345&type_destination=stop&name_destination=23456&itdDate=20230624&itdTime=2058&itdTripDateTimeDepArr=dep&itOptionsActive=1&trITDepMOT=100&trITArrMOT=100&calcNumberOfTrips=12&calcCO2=1&coordListOutputFormat=STRING&stateless=1&sessionID=0&requestID=0"));
0096 
0097         from = {};
0098         from.setCoordinate(48.78, 9.18);
0099         to = {};
0100         to.setCoordinate(48.59, 8.86);
0101         req.setFrom(from);
0102         req.setTo(to);
0103         QTest::newRow("coordinate-based-default") << req << QUrl(s("https://www2.vvs.de/vvs/XML_TRIP_REQUEST2?outputFormat=XML&coordOutputFormat=WGS84[DD.ddddd]&language=en&locationServerActive=1&useRealtime=1&type_origin=coord&name_origin=9.18:48.78:WGS84[DD.ddddd]&type_destination=coord&name_destination=8.86:48.59:WGS84[DD.ddddd]&itdDate=20230624&itdTime=2058&itdTripDateTimeDepArr=dep&itOptionsActive=1&trITDepMOT=100&trITArrMOT=100&calcNumberOfTrips=12&calcCO2=1&coordListOutputFormat=STRING&stateless=1&sessionID=0&requestID=0"));
0104 
0105         req.setMaximumResults(4);
0106         req.setIncludeIntermediateStops(false);
0107         req.setIncludePaths(true);
0108         req.setDateTimeMode(JourneyRequest::Arrival);
0109         req.setAccessModes({ IndividualTransport::Walk, IndividualTransport::Bike });
0110         req.setEgressModes({ IndividualTransport::Walk, IndividualTransport::Bike });
0111         QTest::newRow("arrival-with-access-mode") << req << QUrl(s("https://www2.vvs.de/vvs/XML_TRIP_REQUEST2?outputFormat=XML&coordOutputFormat=WGS84[DD.ddddd]&language=en&locationServerActive=1&useRealtime=1&type_origin=coord&name_origin=9.18:48.78:WGS84[DD.ddddd]&type_destination=coord&name_destination=8.86:48.59:WGS84[DD.ddddd]&itdDate=20230624&itdTime=2058&itdTripDateTimeDepArr=arr&itOptionsActive=1&trITDepMOT=100&trITArrMOT=100&calcNumberOfTrips=4&calcCO2=1&coordListOutputFormat=STRING&stateless=1&sessionID=0&requestID=0"));
0112 
0113         req.setLineModes({Line::Bus, Line::Ferry});
0114         QTest::newRow("line-mode-constraints") << req << QUrl(s("https://www2.vvs.de/vvs/XML_TRIP_REQUEST2?outputFormat=XML&coordOutputFormat=WGS84[DD.ddddd]&language=en&locationServerActive=1&useRealtime=1&type_origin=coord&name_origin=9.18:48.78:WGS84[DD.ddddd]&type_destination=coord&name_destination=8.86:48.59:WGS84[DD.ddddd]&itdDate=20230624&itdTime=2058&itdTripDateTimeDepArr=arr&inclMOT_5=on&inclMOT_6=on&inclMOT_17=on&inclMOT_19=on&inclMOT_9=on&itOptionsActive=1&trITDepMOT=100&trITArrMOT=100&calcNumberOfTrips=4&calcCO2=1&coordListOutputFormat=STRING&stateless=1&sessionID=0&requestID=0"));
0115     }
0116 
0117     void testJourneyRequest()
0118     {
0119         QFETCH(JourneyRequest, request);
0120         QFETCH(QUrl, requestUrl);
0121 
0122         m_nam.requests.clear();
0123         QVERIFY(request.isValid());
0124 
0125         auto reply = m_mgr.queryJourney(request);
0126         QSignalSpy finishedSpy(reply, &Reply::finished);
0127         QVERIFY(finishedSpy.wait());
0128         reply->deleteLater();
0129         QCOMPARE(reply->error(), Reply::NetworkError);
0130         QCOMPARE(m_nam.requests.size(), 1);
0131         QCOMPARE(m_nam.requests[0].op, QNetworkAccessManager::GetOperation);
0132 
0133         const auto url = m_nam.requests[0].request.url();
0134         QCOMPARE(url, requestUrl);
0135     }
0136 
0137 private:
0138     MockNetworkAccessManager m_nam;
0139     Manager m_mgr;
0140 };
0141 
0142 QTEST_GUILESS_MAIN(EfaRequestTest)
0143 
0144 #include "efarequesttest.moc"