File indexing completed on 2024-05-12 05:13:44

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 "pkpassmanager.h"
0011 #include "reservationmanager.h"
0012 #include "documentmanager.h"
0013 #include "favoritelocationmodel.h"
0014 #include "livedatamanager.h"
0015 #include "passmanager.h"
0016 #include "transfermanager.h"
0017 #include "tripgroupmanager.h"
0018 
0019 #include <KItinerary/DocumentUtil>
0020 #include <KItinerary/ExtractorCapabilities>
0021 #include <KItinerary/File>
0022 
0023 #include <QUrl>
0024 #include <QtTest/qtest.h>
0025 #include <QSignalSpy>
0026 #include <QStandardPaths>
0027 #include <QTemporaryFile>
0028 
0029 class AppControllerTest : public QObject
0030 {
0031     Q_OBJECT
0032 private Q_SLOTS:
0033     void initTestCase()
0034     {
0035         qputenv("TZ", "UTC");
0036         QStandardPaths::setTestModeEnabled(true);
0037     }
0038 
0039     void testImportData()
0040     {
0041         PkPassManager pkPassMgr;
0042         Test::clearAll(&pkPassMgr);
0043         QSignalSpy pkPassSpy(&pkPassMgr, &PkPassManager::passAdded);
0044         QVERIFY(pkPassSpy.isValid());
0045 
0046         ReservationManager resMgr;
0047         Test::clearAll(&resMgr);
0048         QSignalSpy resSpy(&resMgr, &ReservationManager::reservationAdded);
0049         QVERIFY(resSpy.isValid());
0050 
0051         DocumentManager docMgr;
0052         Test::clearAll(&docMgr);
0053 
0054         PassManager passMgr;
0055         Test::clearAll(&passMgr);
0056 
0057         ApplicationController appController;
0058         QSignalSpy infoSpy(&appController, &ApplicationController::infoMessage);
0059         appController.setPkPassManager(&pkPassMgr);
0060         appController.setReservationManager(&resMgr);
0061         appController.setDocumentManager(&docMgr);
0062         appController.setPassManager(&passMgr);
0063 
0064         appController.importData(Test::readFile(QLatin1StringView(SOURCE_DIR "/data/4U8465-v1.json")));
0065         QCOMPARE(resSpy.size(), 1);
0066         QCOMPARE(pkPassSpy.size(), 0);
0067         QCOMPARE(infoSpy.size(), 1);
0068         appController.importData(Test::readFile(QLatin1StringView(SOURCE_DIR "/data/boardingpass-v1.pkpass")));
0069         QCOMPARE(resSpy.size(), 2);
0070         QCOMPARE(pkPassSpy.size(), 1);
0071         QCOMPARE(infoSpy.size(), 2);
0072         appController.importData("M1DOE/JOHN            EXXX007 TXLBRUSN 2592 110Y");
0073         QCOMPARE(resSpy.size(), 3);
0074         QCOMPARE(pkPassSpy.size(), 1);
0075         QCOMPARE(infoSpy.size(), 3);
0076         appController.importData(Test::readFile(QLatin1StringView(SOURCE_DIR "/data/iata-bcbp-demo.pdf")));
0077         QCOMPARE(resSpy.size(), 4);
0078         QCOMPARE(pkPassSpy.size(), 1);
0079         QCOMPARE(infoSpy.size(), 4);
0080         QCOMPARE(docMgr.documents().size(), 1);
0081 
0082         // combined reservation/ticket data
0083         appController.importData(Test::readFile(QLatin1StringView(SOURCE_DIR "/data/mixed-reservation-ticket.json")));
0084         QCOMPARE(resSpy.size(), 5);
0085         QCOMPARE(passMgr.rowCount(), 1);
0086         QCOMPARE(infoSpy.size(), 6);
0087     }
0088 
0089     void testImportFile()
0090     {
0091         PkPassManager pkPassMgr;
0092         Test::clearAll(&pkPassMgr);
0093         QSignalSpy pkPassSpy(&pkPassMgr, &PkPassManager::passAdded);
0094         QVERIFY(pkPassSpy.isValid());
0095 
0096         ReservationManager resMgr;
0097         Test::clearAll(&resMgr);
0098         QSignalSpy resSpy(&resMgr, &ReservationManager::reservationAdded);
0099         QVERIFY(resSpy.isValid());
0100 
0101         DocumentManager docMgr;
0102         Test::clearAll(&docMgr);
0103 
0104         PassManager passMgr;
0105         Test::clearAll(&passMgr);
0106 
0107         ApplicationController appController;
0108         QSignalSpy infoSpy(&appController, &ApplicationController::infoMessage);
0109         appController.setPkPassManager(&pkPassMgr);
0110         appController.setReservationManager(&resMgr);
0111         appController.setDocumentManager(&docMgr);
0112         appController.setPassManager(&passMgr);
0113 
0114         appController.importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/4U8465-v1.json")));
0115         QCOMPARE(resSpy.size(), 1);
0116         QCOMPARE(pkPassSpy.size(), 0);
0117         QCOMPARE(infoSpy.size(), 1);
0118         appController.importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/boardingpass-v1.pkpass")));
0119         QCOMPARE(resSpy.size(), 2);
0120         QCOMPARE(pkPassSpy.size(), 1);
0121         QCOMPARE(infoSpy.size(), 2);
0122         appController.importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/iata-bcbp-demo.pdf")));
0123         QCOMPARE(resSpy.size(), 3);
0124         QCOMPARE(pkPassSpy.size(), 1);
0125         QCOMPARE(infoSpy.size(), 3);
0126         QCOMPARE(docMgr.documents().size(), 1);
0127     }
0128 
0129     void testExportFile()
0130     {
0131         PkPassManager pkPassMgr;
0132         Test::clearAll(&pkPassMgr);
0133 
0134         ReservationManager resMgr;
0135         Test::clearAll(&resMgr);
0136 
0137         DocumentManager docMgr;
0138         Test::clearAll(&docMgr);
0139 
0140         TripGroupManager tripGroupMgr;
0141         tripGroupMgr.setReservationManager(&resMgr);
0142         TransferManager transferMgr;
0143         transferMgr.setReservationManager(&resMgr);
0144         transferMgr.setTripGroupManager(&tripGroupMgr);
0145 
0146         FavoriteLocationModel favLoc;
0147 
0148         PassManager passMgr;
0149         Test::clearAll(&passMgr);
0150 
0151         LiveDataManager liveDataMgr;
0152 
0153         ApplicationController appController;
0154         QSignalSpy infoSpy(&appController, &ApplicationController::infoMessage);
0155         appController.setPkPassManager(&pkPassMgr);
0156         appController.setReservationManager(&resMgr);
0157         appController.setDocumentManager(&docMgr);
0158         appController.setTransferManager(&transferMgr);
0159         appController.setFavoriteLocationModel(&favLoc);
0160         appController.setPassManager(&passMgr);
0161         appController.setLiveDataManager(&liveDataMgr);
0162 
0163         appController.importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/4U8465-v1.json")));
0164         appController.importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/boardingpass-v1.pkpass")));
0165         appController.importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/bahncard.json")));
0166         QCOMPARE(resMgr.batches().size(), 2);
0167         QCOMPARE(pkPassMgr.passes().size(), 1);
0168         QCOMPARE(passMgr.rowCount(), 1);
0169         QCOMPARE(infoSpy.size(), 3);
0170 
0171         QTemporaryFile tmp;
0172         QVERIFY(tmp.open());
0173         tmp.close();
0174         appController.exportToFile(QUrl::fromLocalFile(tmp.fileName()));
0175         QCOMPARE(infoSpy.size(), 4);
0176 
0177         KItinerary::File f(tmp.fileName());
0178         QVERIFY(f.open(KItinerary::File::Read));
0179         QCOMPARE(f.reservations().size(), 2);
0180         QCOMPARE(f.passes().size(), 1);
0181 
0182         Test::clearAll(&pkPassMgr);
0183         Test::clearAll(&resMgr);
0184         Test::clearAll(&docMgr);
0185         Test::clearAll(&passMgr);
0186         QCOMPARE(resMgr.batches().size(), 0);
0187         QCOMPARE(pkPassMgr.passes().size(), 0);
0188 
0189         appController.importFromUrl(QUrl::fromLocalFile(tmp.fileName()));
0190         QCOMPARE(resMgr.batches().size(), 2);
0191         QCOMPARE(pkPassMgr.passes().size(), 1);
0192         QCOMPARE(passMgr.rowCount(), 1);
0193         QCOMPARE(infoSpy.size(), 5);
0194 
0195         Test::clearAll(&pkPassMgr);
0196         Test::clearAll(&resMgr);
0197         Test::clearAll(&passMgr);
0198         QCOMPARE(resMgr.batches().size(), 0);
0199         QCOMPARE(pkPassMgr.passes().size(), 0);
0200 
0201         QFile bundle(tmp.fileName());
0202         QVERIFY(bundle.open(QFile::ReadOnly));
0203         appController.importData(bundle.readAll());
0204         QCOMPARE(resMgr.batches().size(), 2);
0205         QCOMPARE(pkPassMgr.passes().size(), 1);
0206         QCOMPARE(passMgr.rowCount(), 1);
0207         QCOMPARE(infoSpy.size(), 6);
0208     }
0209 
0210     void testDocumentAttaching()
0211     {
0212         ReservationManager resMgr;
0213         Test::clearAll(&resMgr);
0214         DocumentManager docMgr;
0215         Test::clearAll(&docMgr);
0216         PassManager passMgr;
0217         Test::clearAll(&passMgr);
0218         auto ctrl = Test::makeAppController();
0219 
0220         ctrl->setReservationManager(&resMgr);
0221         ctrl->setDocumentManager(&docMgr);
0222         ctrl->setPassManager(&passMgr);
0223 
0224         {
0225             QCOMPARE(docMgr.documents().size(), 0);
0226             ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/4U8465-v1.json")));
0227             QCOMPARE(resMgr.batches().size(), 1);
0228             const auto resId = resMgr.batches().at(0);
0229 
0230             QCOMPARE(KItinerary::DocumentUtil::documentIds(resMgr.reservation(resId)).size(), 0);
0231             ctrl->addDocumentToReservation(resId, QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/iata-bcbp-demo.pdf")));
0232             QCOMPARE(docMgr.documents().size(), 1);
0233             const auto docIds = KItinerary::DocumentUtil::documentIds(resMgr.reservation(resId));
0234             QCOMPARE(docIds.size(), 1);
0235 
0236             ctrl->removeDocumentFromReservation(resId, docIds.at(0).toString());
0237             QCOMPARE(docMgr.documents().size(), 0);
0238             QCOMPARE(resMgr.batches().size(), 1);
0239             QCOMPARE(KItinerary::DocumentUtil::documentIds(resMgr.reservation(resId)).size(), 0);
0240         }
0241 
0242         {
0243             QCOMPARE(passMgr.rowCount(), 0);
0244             ctrl->importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/9euroticket.json")));
0245             QCOMPARE(docMgr.documents().size(), 0);
0246             QCOMPARE(passMgr.rowCount(), 1);
0247             const auto passId = passMgr.index(0, 0).data(PassManager::PassIdRole).toString();
0248             auto docIds = KItinerary::DocumentUtil::documentIds(passMgr.pass(passId));
0249             QCOMPARE(docIds.size(), 0);
0250 
0251             ctrl->addDocumentToPass(passId, QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/iata-bcbp-demo.pdf")));
0252             QCOMPARE(docMgr.documents().size(), 1);
0253             docIds = KItinerary::DocumentUtil::documentIds(passMgr.pass(passId));
0254             QCOMPARE(docIds.size(), 1);
0255 
0256             ctrl->removeDocumentFromPass(passId, docIds.at(0).toString());
0257             QCOMPARE(docMgr.documents().size(), 0);
0258             QCOMPARE(passMgr.rowCount(), 1);
0259             QCOMPARE(KItinerary::DocumentUtil::documentIds(passMgr.pass(passId)).size(), 0);
0260         }
0261     }
0262 };
0263 
0264 QTEST_GUILESS_MAIN(AppControllerTest)
0265 
0266 #include "applicationcontrollertest.moc"