1 /*
2     SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "testhelper.h"
8 
9 #include <applicationcontroller.h>
10 #include <pkpassmanager.h>
11 #include <reservationmanager.h>
12 #include <documentmanager.h>
13 #include <favoritelocationmodel.h>
14 #include <healthcertificatemanager.h>
15 #include <transfermanager.h>
16 #include <tripgroupmanager.h>
17 
18 #include <KItinerary/ExtractorCapabilities>
19 #include <KItinerary/File>
20 
21 #include <QUrl>
22 #include <QtTest/qtest.h>
23 #include <QSignalSpy>
24 #include <QStandardPaths>
25 #include <QTemporaryFile>
26 
27 class AppControllerTest : public QObject
28 {
29     Q_OBJECT
30 private:
readFile(const QString & fn)31     QByteArray readFile(const QString &fn)
32     {
33         QFile f(fn);
34         f.open(QFile::ReadOnly);
35         return f.readAll();
36     }
37 
hasZxing()38     bool hasZxing()
39     {
40         return KItinerary::ExtractorCapabilities::capabilitiesString().contains(QLatin1String("zxing"), Qt::CaseInsensitive);
41     }
42 
43 private Q_SLOTS:
initTestCase()44     void initTestCase()
45     {
46         qputenv("TZ", "UTC");
47         QStandardPaths::setTestModeEnabled(true);
48     }
49 
testImportData()50     void testImportData()
51     {
52         PkPassManager passMgr;
53         Test::clearAll(&passMgr);
54         QSignalSpy passSpy(&passMgr, &PkPassManager::passAdded);
55         QVERIFY(passSpy.isValid());
56 
57         ReservationManager resMgr;
58         Test::clearAll(&resMgr);
59         QSignalSpy resSpy(&resMgr, &ReservationManager::reservationAdded);
60         QVERIFY(resSpy.isValid());
61 
62         DocumentManager docMgr;
63         Test::clearAll(&docMgr);
64 
65         HealthCertificateManager healthCertMgr;
66 
67         ApplicationController appController;
68         QSignalSpy infoSpy(&appController, &ApplicationController::infoMessage);
69         appController.setPkPassManager(&passMgr);
70         appController.setReservationManager(&resMgr);
71         appController.setDocumentManager(&docMgr);
72         appController.setHealthCertificateManager(&healthCertMgr);
73 
74         appController.importData(readFile(QLatin1String(SOURCE_DIR "/data/4U8465-v1.json")));
75         QCOMPARE(resSpy.size(), 1);
76         QCOMPARE(passSpy.size(), 0);
77         QCOMPARE(infoSpy.size(), 1);
78         appController.importData(readFile(QLatin1String(SOURCE_DIR "/data/boardingpass-v1.pkpass")));
79         QCOMPARE(resSpy.size(), 2);
80         QCOMPARE(passSpy.size(), 1);
81         QCOMPARE(infoSpy.size(), 2);
82         appController.importData("M1DOE/JOHN            EXXX007 TXLBRUSN 2592 110Y");
83         QCOMPARE(resSpy.size(), 3);
84         QCOMPARE(passSpy.size(), 1);
85         QCOMPARE(infoSpy.size(), 3);
86         appController.importData(readFile(QLatin1String(SOURCE_DIR "/data/iata-bcbp-demo.pdf")));
87         if (!hasZxing()) {
88             QSKIP("Built without ZXing");
89         }
90         QCOMPARE(resSpy.size(), 4);
91         QCOMPARE(passSpy.size(), 1);
92         QCOMPARE(infoSpy.size(), 4);
93         QCOMPARE(docMgr.documents().size(), 1);
94     }
95 
testImportFile()96     void testImportFile()
97     {
98         PkPassManager passMgr;
99         Test::clearAll(&passMgr);
100         QSignalSpy passSpy(&passMgr, &PkPassManager::passAdded);
101         QVERIFY(passSpy.isValid());
102 
103         ReservationManager resMgr;
104         Test::clearAll(&resMgr);
105         QSignalSpy resSpy(&resMgr, &ReservationManager::reservationAdded);
106         QVERIFY(resSpy.isValid());
107 
108         DocumentManager docMgr;
109         Test::clearAll(&docMgr);
110 
111         HealthCertificateManager healthCertMgr;
112 
113         ApplicationController appController;
114         QSignalSpy infoSpy(&appController, &ApplicationController::infoMessage);
115         appController.setPkPassManager(&passMgr);
116         appController.setReservationManager(&resMgr);
117         appController.setDocumentManager(&docMgr);
118         appController.setHealthCertificateManager(&healthCertMgr);
119 
120         appController.importFromUrl(QUrl::fromLocalFile(QLatin1String(SOURCE_DIR "/data/4U8465-v1.json")));
121         QCOMPARE(resSpy.size(), 1);
122         QCOMPARE(passSpy.size(), 0);
123         QCOMPARE(infoSpy.size(), 1);
124         appController.importFromUrl(QUrl::fromLocalFile(QLatin1String(SOURCE_DIR "/data/boardingpass-v1.pkpass")));
125         QCOMPARE(resSpy.size(), 2);
126         QCOMPARE(passSpy.size(), 1);
127         QCOMPARE(infoSpy.size(), 2);
128         appController.importFromUrl(QUrl::fromLocalFile(QLatin1String(SOURCE_DIR "/data/iata-bcbp-demo.pdf")));
129         if (!hasZxing()) {
130             QSKIP("Built without ZXing");
131         }
132         QCOMPARE(resSpy.size(), 3);
133         QCOMPARE(passSpy.size(), 1);
134         QCOMPARE(infoSpy.size(), 3);
135         QCOMPARE(docMgr.documents().size(), 1);
136     }
137 
testExportFile()138     void testExportFile()
139     {
140         PkPassManager passMgr;
141         Test::clearAll(&passMgr);
142 
143         ReservationManager resMgr;
144         Test::clearAll(&resMgr);
145 
146         DocumentManager docMgr;
147         Test::clearAll(&docMgr);
148 
149         TripGroupManager tripGroupMgr;
150         tripGroupMgr.setReservationManager(&resMgr);
151         TransferManager transferMgr;
152         transferMgr.setReservationManager(&resMgr);
153         transferMgr.setTripGroupManager(&tripGroupMgr);
154 
155         FavoriteLocationModel favLoc;
156 
157         HealthCertificateManager healthCertMgr;
158 
159         ApplicationController appController;
160         QSignalSpy infoSpy(&appController, &ApplicationController::infoMessage);
161         appController.setPkPassManager(&passMgr);
162         appController.setReservationManager(&resMgr);
163         appController.setDocumentManager(&docMgr);
164         appController.setTransferManager(&transferMgr);
165         appController.setFavoriteLocationModel(&favLoc);
166         appController.setHealthCertificateManager(&healthCertMgr);
167 
168         appController.importFromUrl(QUrl::fromLocalFile(QLatin1String(SOURCE_DIR "/data/4U8465-v1.json")));
169         appController.importFromUrl(QUrl::fromLocalFile(QLatin1String(SOURCE_DIR "/data/boardingpass-v1.pkpass")));
170         QCOMPARE(resMgr.batches().size(), 2);
171         QCOMPARE(passMgr.passes().size(), 1);
172         QCOMPARE(infoSpy.size(), 2);
173 
174         QTemporaryFile tmp;
175         QVERIFY(tmp.open());
176         tmp.close();
177         appController.exportToFile(QUrl::fromLocalFile(tmp.fileName()));
178         QCOMPARE(infoSpy.size(), 3);
179 
180         KItinerary::File f(tmp.fileName());
181         QVERIFY(f.open(KItinerary::File::Read));
182         QCOMPARE(f.reservations().size(), 2);
183         QCOMPARE(f.passes().size(), 1);
184 
185         Test::clearAll(&passMgr);
186         Test::clearAll(&resMgr);
187         Test::clearAll(&docMgr);
188         QCOMPARE(resMgr.batches().size(), 0);
189         QCOMPARE(passMgr.passes().size(), 0);
190 
191         appController.importFromUrl(QUrl::fromLocalFile(tmp.fileName()));
192         QCOMPARE(resMgr.batches().size(), 2);
193         QCOMPARE(passMgr.passes().size(), 1);
194         QCOMPARE(infoSpy.size(), 4);
195 
196         Test::clearAll(&passMgr);
197         Test::clearAll(&resMgr);
198         QCOMPARE(resMgr.batches().size(), 0);
199         QCOMPARE(passMgr.passes().size(), 0);
200 
201         QFile bundle(tmp.fileName());
202         QVERIFY(bundle.open(QFile::ReadOnly));
203         appController.importData(bundle.readAll());
204         QCOMPARE(resMgr.batches().size(), 2);
205         QCOMPARE(passMgr.passes().size(), 1);
206         QCOMPARE(infoSpy.size(), 5);
207     }
208 };
209 
210 QTEST_GUILESS_MAIN(AppControllerTest)
211 
212 #include "applicationcontrollertest.moc"
213