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"