File indexing completed on 2024-05-12 05:13:45
0001 /* 0002 SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include <config-itinerary.h> 0008 #include "applicationcontroller.h" 0009 #include "healthcertificatemanager.h" 0010 #include "pkpassmanager.h" 0011 #include "reservationmanager.h" 0012 0013 #include <QAbstractItemModelTester> 0014 #include <QSignalSpy> 0015 #include <QStandardPaths> 0016 #include <QtTest/qtest.h> 0017 0018 class HealthCertificateManagerTest : public QObject 0019 { 0020 Q_OBJECT 0021 private: 0022 QByteArray readFile(const QString &fn) 0023 { 0024 QFile f(fn); 0025 f.open(QFile::ReadOnly); 0026 return f.readAll(); 0027 } 0028 private Q_SLOTS: 0029 void initTestCase() 0030 { 0031 QStandardPaths::setTestModeEnabled(true); 0032 } 0033 0034 void testManager() 0035 { 0036 PkPassManager passMgr; 0037 ReservationManager resMgr; 0038 0039 { 0040 HealthCertificateManager mgr; 0041 QAbstractItemModelTester modelTester(&mgr); 0042 // clear previous content, if any 0043 while (mgr.rowCount()) { 0044 mgr.removeCertificate(0); 0045 } 0046 } 0047 0048 { 0049 ApplicationController ctrl; 0050 QSignalSpy infoSpy(&ctrl, &ApplicationController::infoMessage); 0051 ctrl.setPkPassManager(&passMgr); 0052 ctrl.setReservationManager(&resMgr); 0053 auto mgr = ctrl.healthCertificateManager(); 0054 QAbstractItemModelTester modelTester(mgr); 0055 QSignalSpy insertSpy(mgr, &QAbstractItemModel::rowsInserted); 0056 QCOMPARE(mgr->rowCount(), 0); 0057 const auto rawData = readFile(QLatin1StringView(SOURCE_DIR "/data/health-certificates/full-vaccination.txt")); 0058 #if HAVE_KHEALTHCERTIFICATE 0059 ctrl.importData(rawData); 0060 QCOMPARE(mgr->rowCount(), 1); 0061 QCOMPARE(insertSpy.size(), 1); 0062 QVERIFY(!mgr->data(mgr->index(0, 0), Qt::DisplayRole).toString().isEmpty()); 0063 QVERIFY(!mgr->data(mgr->index(0, 0), HealthCertificateManager::CertificateRole).isNull()); 0064 QCOMPARE(mgr->data(mgr->index(0, 0), HealthCertificateManager::RawDataRole).toByteArray(), rawData); 0065 QVERIFY(!mgr->data(mgr->index(0, 0), HealthCertificateManager::StorageIdRole).toString().isEmpty()); 0066 0067 QCOMPARE(infoSpy.size(), 1); 0068 #endif 0069 } 0070 0071 { 0072 ApplicationController ctrl; 0073 QSignalSpy infoSpy(&ctrl, &ApplicationController::infoMessage); 0074 ctrl.setPkPassManager(&passMgr); 0075 ctrl.setReservationManager(&resMgr); 0076 auto mgr = ctrl.healthCertificateManager(); 0077 QAbstractItemModelTester modelTester(mgr); 0078 #if HAVE_KHEALTHCERTIFICATE 0079 QCOMPARE(mgr->rowCount(), 1); 0080 const auto rawData = readFile(QLatin1StringView(SOURCE_DIR "/data/health-certificates/full-vaccination.txt")); 0081 // no duplicates 0082 ctrl.importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/health-certificates/full-vaccination.txt"))); 0083 QCOMPARE(mgr->rowCount(), 1); 0084 0085 QCOMPARE(infoSpy.size(), 1); 0086 #endif 0087 } 0088 0089 { 0090 ApplicationController ctrl; 0091 QSignalSpy infoSpy(&ctrl, &ApplicationController::infoMessage); 0092 ctrl.setPkPassManager(&passMgr); 0093 ctrl.setReservationManager(&resMgr); 0094 auto mgr = ctrl.healthCertificateManager(); 0095 QAbstractItemModelTester modelTester(mgr); 0096 #if HAVE_KHEALTHCERTIFICATE 0097 QCOMPARE(mgr->rowCount(), 1); 0098 // garbage is rejected 0099 ctrl.importData("not a vaccination certificate"); 0100 QCOMPARE(mgr->rowCount(), 1); 0101 0102 QCOMPARE(infoSpy.size(), 1); 0103 #endif 0104 } 0105 0106 { 0107 ApplicationController ctrl; 0108 QSignalSpy infoSpy(&ctrl, &ApplicationController::infoMessage); 0109 ctrl.setPkPassManager(&passMgr); 0110 ctrl.setReservationManager(&resMgr); 0111 auto mgr = ctrl.healthCertificateManager(); 0112 QAbstractItemModelTester modelTester(mgr); 0113 QSignalSpy insertSpy(mgr, &QAbstractItemModel::rowsInserted); 0114 #if HAVE_KHEALTHCERTIFICATE 0115 QCOMPARE(mgr->rowCount(), 1); 0116 const auto rawData = readFile(QLatin1StringView(SOURCE_DIR "/data/health-certificates/partial-vaccination.divoc")); 0117 ctrl.importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/health-certificates/partial-vaccination.divoc"))); 0118 QCOMPARE(mgr->rowCount(), 2); 0119 QCOMPARE(insertSpy.size(), 1); 0120 QVERIFY(!mgr->data(mgr->index(0, 0), Qt::DisplayRole).toString().isEmpty()); 0121 QVERIFY(!mgr->data(mgr->index(0, 0), HealthCertificateManager::CertificateRole).isNull()); 0122 QCOMPARE(mgr->data(mgr->index(0, 0), HealthCertificateManager::RawDataRole).toByteArray(), rawData); 0123 QVERIFY(!mgr->data(mgr->index(0, 0), HealthCertificateManager::StorageIdRole).toString().isEmpty()); 0124 0125 QCOMPARE(infoSpy.size(), 1); 0126 #endif 0127 } 0128 0129 { 0130 ApplicationController ctrl; 0131 QSignalSpy infoSpy(&ctrl, &ApplicationController::infoMessage); 0132 ctrl.setPkPassManager(&passMgr); 0133 ctrl.setReservationManager(&resMgr); 0134 auto mgr = ctrl.healthCertificateManager(); 0135 QAbstractItemModelTester modelTester(mgr); 0136 QSignalSpy insertSpy(mgr, &QAbstractItemModel::rowsInserted); 0137 #if HAVE_KHEALTHCERTIFICATE 0138 QCOMPARE(mgr->rowCount(), 2); 0139 ctrl.importFromUrl(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/health-certificates/negative-pcr-test-fr.pdf"))); 0140 QCOMPARE(mgr->rowCount(), 3); 0141 QCOMPARE(insertSpy.size(), 1); 0142 0143 QCOMPARE(infoSpy.size(), 1); 0144 #endif 0145 } 0146 0147 { 0148 HealthCertificateManager mgr; 0149 QAbstractItemModelTester modelTester(&mgr); 0150 QSignalSpy removeSpy(&mgr, &QAbstractItemModel::rowsRemoved); 0151 #if HAVE_KHEALTHCERTIFICATE 0152 QCOMPARE(mgr.rowCount(), 3); 0153 mgr.removeCertificate(0); 0154 QCOMPARE(removeSpy.size(), 1); 0155 QCOMPARE(mgr.rowCount(), 2); 0156 #endif 0157 } 0158 } 0159 }; 0160 0161 QTEST_GUILESS_MAIN(HealthCertificateManagerTest) 0162 0163 #include "healthcertificatemanagertest.moc"