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"