File indexing completed on 2024-05-12 05:13:47
0001 /* 0002 SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "testhelper.h" 0008 0009 #include "applicationcontroller.h" 0010 #include "reservationmanager.h" 0011 #include "tripgroup.h" 0012 #include "tripgroupmanager.h" 0013 0014 #include <QtTest/qtest.h> 0015 #include <QSignalSpy> 0016 #include <QStandardPaths> 0017 0018 void initLocale() 0019 { 0020 qputenv("LC_ALL", "en_US.utf-8"); 0021 qputenv("LANG", "C"); 0022 } 0023 0024 Q_CONSTRUCTOR_FUNCTION(initLocale) 0025 0026 class TripGroupTest : public QObject 0027 { 0028 Q_OBJECT 0029 private Q_SLOTS: 0030 void initTestCase() 0031 { 0032 qputenv("LC_ALL", "en_US.utf-8"); 0033 QStandardPaths::setTestModeEnabled(true); 0034 } 0035 0036 void init() 0037 { 0038 TripGroupManager::clear(); 0039 } 0040 0041 void testGrouping() 0042 { 0043 ReservationManager resMgr; 0044 Test::clearAll(&resMgr); 0045 auto ctrl = Test::makeAppController(); 0046 ctrl->setReservationManager(&resMgr); 0047 ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/google-multi-passenger-flight.json"))); 0048 { 0049 TripGroupManager mgr; 0050 QSignalSpy addSpy(&mgr, &TripGroupManager::tripGroupAdded); 0051 QVERIFY(addSpy.isValid()); 0052 mgr.setReservationManager(&resMgr); 0053 QCOMPARE(addSpy.size(), 1); 0054 auto g = mgr.tripGroup(addSpy.at(0).at(0).toString()); 0055 QCOMPARE(g.elements().size(), resMgr.batches().size()); 0056 } 0057 0058 TripGroupManager::clear(); 0059 Test::clearAll(&resMgr); 0060 ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/../tests/randa2017.json"))); 0061 { 0062 TripGroupManager mgr; 0063 QSignalSpy addSpy(&mgr, &TripGroupManager::tripGroupAdded); 0064 QVERIFY(addSpy.isValid()); 0065 mgr.setReservationManager(&resMgr); 0066 QCOMPARE(addSpy.size(), 1); 0067 auto g = mgr.tripGroup(addSpy.at(0).at(0).toString()); 0068 QCOMPARE(g.elements().size(), resMgr.batches().size()); 0069 } 0070 0071 TripGroupManager::clear(); 0072 Test::clearAll(&resMgr); 0073 ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/timeline/multi-traveler-merge-with-countryinfo.json"))); 0074 { 0075 TripGroupManager mgr; 0076 QSignalSpy addSpy(&mgr, &TripGroupManager::tripGroupAdded); 0077 QVERIFY(addSpy.isValid()); 0078 mgr.setReservationManager(&resMgr); 0079 QCOMPARE(addSpy.size(), 1); 0080 auto g = mgr.tripGroup(addSpy.at(0).at(0).toString()); 0081 QCOMPARE(g.elements().size(), resMgr.batches().size()); 0082 } 0083 0084 TripGroupManager::clear(); 0085 ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/google-multi-passenger-flight.json"))); 0086 ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/../tests/randa2017.json"))); 0087 { 0088 TripGroupManager mgr; 0089 QSignalSpy addSpy(&mgr, &TripGroupManager::tripGroupAdded); 0090 QVERIFY(addSpy.isValid()); 0091 mgr.setReservationManager (&resMgr); 0092 QCOMPARE(addSpy.size(), 3); 0093 QCOMPARE(mgr.tripGroup(addSpy.at(0).at(0).toString()).elements().size(), 2); 0094 QCOMPARE(mgr.tripGroup(addSpy.at(1).at(0).toString()).elements().size(), 2); 0095 QCOMPARE(mgr.tripGroup(addSpy.at(2).at(0).toString()).elements().size(), 11); 0096 } 0097 0098 Test::clearAll(&resMgr); 0099 TripGroupManager::clear(); 0100 ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/tripgroup/time-based-layover-detection.json"))); 0101 { 0102 TripGroupManager mgr; 0103 mgr.setReservationManager (&resMgr); 0104 QCOMPARE(mgr.tripGroups().size(), 1); 0105 QCOMPARE(mgr.tripGroup(mgr.tripGroups().at(0)).elements().size(), 4); 0106 } 0107 } 0108 0109 void testDynamicGrouping() 0110 { 0111 ReservationManager resMgr; 0112 Test::clearAll(&resMgr); 0113 TripGroupManager::clear(); 0114 TripGroupManager mgr; 0115 mgr.setReservationManager(&resMgr); 0116 auto ctrl = Test::makeAppController(); 0117 ctrl->setReservationManager(&resMgr); 0118 0119 // after adding the third element this will find a loop between the two inner legs and remove the first leg as a leading appendix 0120 // the fourth leg however should be fixing that and result in a single 4 leg group 0121 ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/tripgroup/symmetric-two-leg-return-flight.json"))); 0122 QCOMPARE(mgr.tripGroups().size(), 1); 0123 auto g = mgr.tripGroup(mgr.tripGroups().at(0)); 0124 QCOMPARE(g.elements().size(), resMgr.batches().size()); 0125 } 0126 0127 void testChanges() 0128 { 0129 ReservationManager resMgr; 0130 Test::clearAll(&resMgr); 0131 TripGroupManager mgr; 0132 mgr.setReservationManager(&resMgr); 0133 0134 QSignalSpy addSpy(&mgr, &TripGroupManager::tripGroupAdded); 0135 QSignalSpy changeSpy(&mgr, &TripGroupManager::tripGroupChanged); 0136 QSignalSpy rmSpy(&mgr, &TripGroupManager::tripGroupRemoved); 0137 0138 auto ctrl = Test::makeAppController(); 0139 ctrl->setReservationManager(&resMgr); 0140 ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/google-multi-passenger-flight.json"))); 0141 QCOMPARE(addSpy.size(), 1); 0142 auto g = mgr.tripGroup(addSpy.at(0).at(0).toString()); 0143 QCOMPARE(g.elements().size(), resMgr.batches().size()); 0144 QCOMPARE(changeSpy.size(), 0); 0145 0146 changeSpy.clear(); 0147 Test::clearAll(&resMgr); 0148 QCOMPARE(rmSpy.size(), 1); 0149 QCOMPARE(changeSpy.size(), 0); 0150 } 0151 0152 void testGroupName_data() 0153 { 0154 QTest::addColumn<QString>("fileName"); 0155 QTest::addColumn<QString>("expectedName"); 0156 0157 QTest::newRow("SFO one way") << QStringLiteral(SOURCE_DIR "/data/google-multi-passenger-flight.json") << QStringLiteral("San Francisco Airport (March 2017)"); 0158 QTest::newRow("FLR one way multi traveller") << QStringLiteral(SOURCE_DIR "/data/timeline/multi-traveler-merge-with-countryinfo.json") << QStringLiteral("Peretola (January 2000)"); 0159 QTest::newRow("Randa") << QStringLiteral(SOURCE_DIR "/../tests/randa2017.json") << QStringLiteral("Randa (September 2017)"); 0160 QTest::newRow("Almeria") << QStringLiteral(SOURCE_DIR "/../tests/akademy2017.json") << QStringLiteral("Almería (July 2017)"); 0161 QTest::newRow("Symmetric") << QStringLiteral(SOURCE_DIR "/data/tripgroup/deutschebahn_two-leg-return.txt.json") << QStringLiteral("Somewhere(Specific) (November 2027)"); 0162 QTest::newRow("Symmetric, 2 elements") << QStringLiteral(SOURCE_DIR "/data/tripgroup/flight-direct-return.json") << QStringLiteral("Oslo Airport (June 2018)"); 0163 QTest::newRow("Triangular, different PNR") << QStringLiteral(SOURCE_DIR "/data/tripgroup/train-triangular-different-pnr.json") << QStringLiteral("Nürnberg Hbf (February/March 2018)"); 0164 QTest::newRow("Imbalanced roundtrip") << QStringLiteral(SOURCE_DIR "/data/tripgroup/imbalanced-return-trip.json") << QStringLiteral("Milano Centrale (September 2019)"); 0165 QTest::newRow("IATA BCBP no times") << QStringLiteral(SOURCE_DIR "/data/tripgroup/iata-bcbp-no-times.json") << QStringLiteral("Milan Malpensa (September 2019)"); 0166 } 0167 0168 void testGroupName() 0169 { 0170 QFETCH(QString, fileName); 0171 QFETCH(QString, expectedName); 0172 0173 ReservationManager resMgr; 0174 Test::clearAll(&resMgr); 0175 auto ctrl = Test::makeAppController(); 0176 ctrl->setReservationManager(&resMgr); 0177 ctrl->importFromUrl(QUrl::fromLocalFile(fileName)); 0178 TripGroupManager mgr; 0179 QSignalSpy addSpy(&mgr, &TripGroupManager::tripGroupAdded); 0180 mgr.setReservationManager(&resMgr); 0181 QCOMPARE(addSpy.size(), 1); 0182 auto g = mgr.tripGroup(addSpy.at(0).at(0).toString()); 0183 QCOMPARE(g.elements().size(), resMgr.batches().size()); 0184 QCOMPARE(g.name(), expectedName); 0185 } 0186 0187 void testLeadingAppendixRemoval() 0188 { 0189 ReservationManager resMgr; 0190 Test::clearAll(&resMgr); 0191 auto ctrl = Test::makeAppController(); 0192 ctrl->setReservationManager(&resMgr); 0193 ctrl->importFromUrl(QUrl::fromLocalFile(QStringLiteral(SOURCE_DIR "/data/tripgroup/leading-appendix.json"))); 0194 TripGroupManager mgr; 0195 QSignalSpy addSpy(&mgr, &TripGroupManager::tripGroupAdded); 0196 mgr.setReservationManager(&resMgr); 0197 QCOMPARE(addSpy.size(), 1); 0198 auto g = mgr.tripGroup(addSpy.at(0).at(0).toString()); 0199 QCOMPARE(g.elements().size(), resMgr.batches().size() - 1); 0200 QCOMPARE(g.name(), QStringLiteral("Oslo Airport (June 2000)")); 0201 } 0202 0203 void testDeletion() 0204 { 0205 ReservationManager resMgr; 0206 Test::clearAll(&resMgr); 0207 auto ctrl = Test::makeAppController(); 0208 ctrl->setReservationManager(&resMgr); 0209 ctrl->importFromUrl(QUrl::fromLocalFile(QStringLiteral(SOURCE_DIR "/../tests/randa2017.json"))); 0210 TripGroupManager mgr; 0211 QSignalSpy addSpy(&mgr, &TripGroupManager::tripGroupAdded); 0212 mgr.setReservationManager(&resMgr); 0213 QCOMPARE(addSpy.size(), 1); 0214 QVERIFY(resMgr.batches().size() > 8); 0215 const auto groupId = addSpy.at(0).at(0).toString(); 0216 const auto g = mgr.tripGroup(groupId); 0217 mgr.removeReservationsInGroup(groupId); 0218 QCOMPARE(resMgr.batches().size(), 0); 0219 QCOMPARE(mgr.tripGroups().size(), 0); 0220 } 0221 }; 0222 QTEST_GUILESS_MAIN(TripGroupTest) 0223 0224 #include "tripgrouptest.moc"