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"