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

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 #include "mocknetworkaccessmanager.h"
0009 
0010 #include "pkpassmanager.h"
0011 
0012 #include <QUrl>
0013 #include <QtTest/qtest.h>
0014 #include <QSignalSpy>
0015 #include <QStandardPaths>
0016 
0017 void initLocale()
0018 {
0019     qputenv("LC_ALL", "en_US.utf-8");
0020     qputenv("LANG", "C");
0021 }
0022 
0023 Q_CONSTRUCTOR_FUNCTION(initLocale)
0024 
0025 static MockNetworkAccessManager s_nam;
0026 static QNetworkAccessManager* namFactory() { return &s_nam; }
0027 
0028 class PkPassManagerTest : public QObject
0029 {
0030     Q_OBJECT
0031 private Q_SLOTS:
0032     void initTestCase()
0033     {
0034         QStandardPaths::setTestModeEnabled(true);
0035     }
0036 
0037     void testImport()
0038     {
0039         PkPassManager mgr;
0040         Test::clearAll(&mgr);
0041         const auto now = QDateTime::currentDateTime().addSecs(-1);
0042 
0043         QSignalSpy addSpy(&mgr, &PkPassManager::passAdded);
0044         QVERIFY(addSpy.isValid());
0045         QSignalSpy updateSpy(&mgr, &PkPassManager::passUpdated);
0046         QVERIFY(updateSpy.isValid());
0047         QSignalSpy rmSpy(&mgr, &PkPassManager::passRemoved);
0048         QVERIFY(rmSpy.isValid());
0049 
0050         const auto passId = QStringLiteral("pass.booking.kde.org/MTIzNA==");
0051         QVERIFY(mgr.passes().isEmpty());
0052         QCOMPARE(mgr.pass(passId), nullptr);
0053         QVERIFY(!mgr.updateTime(passId).isValid());
0054 
0055         mgr.importPass(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/boardingpass-v1.pkpass")));
0056         QCOMPARE(addSpy.size(), 1);
0057         QCOMPARE(addSpy.at(0).at(0).toString(), passId);
0058         QVERIFY(updateSpy.isEmpty());
0059         QVERIFY(mgr.pass(passId));
0060         QVERIFY(mgr.updateTime(passId) >= now);
0061 
0062         auto passes = mgr.passes();
0063         QCOMPARE(passes.size(), 1);
0064         QCOMPARE(passes.at(0), passId);
0065 
0066         mgr.importPass(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/boardingpass-v2.pkpass")));
0067         QCOMPARE(addSpy.size(), 1);
0068         QCOMPARE(updateSpy.size(), 1);
0069         QCOMPARE(mgr.passes().size(), 1);
0070         QCOMPARE(updateSpy.at(0).at(0).toString(), passId);
0071         QCOMPARE(updateSpy.at(0).at(1).toStringList().size(), 1);
0072         QCOMPARE(updateSpy.at(0).at(1).toStringList().at(0), QStringLiteral("Gate changed to G30."));
0073         QVERIFY(mgr.pass(passId));
0074 
0075         Test::clearAll(&mgr);
0076         QCOMPARE(addSpy.size(), 1);
0077         QCOMPARE(updateSpy.size(), 1);
0078         QCOMPARE(rmSpy.size(), 1);
0079         QCOMPARE(rmSpy.at(0).at(0).toString(), passId);
0080         QVERIFY(mgr.passes().isEmpty());
0081         QCOMPARE(mgr.pass(passId), nullptr);
0082     }
0083 
0084     void testCaptivePortalFailure()
0085     {
0086         PkPassManager mgr;
0087         mgr.setNetworkAccessManagerFactory(namFactory);
0088         Test::clearAll(&mgr);
0089         QSignalSpy addSpy(&mgr, &PkPassManager::passAdded);
0090         QSignalSpy updateSpy(&mgr, &PkPassManager::passUpdated);
0091 
0092         mgr.importPass(QUrl::fromLocalFile(QLatin1StringView(SOURCE_DIR "/data/updateable-boardingpass.pkpass")));
0093         QCOMPARE(mgr.passes().size(), 1);
0094         QCOMPARE(addSpy.size(), 1);
0095         addSpy.clear();
0096         const auto passId = mgr.passes()[0];
0097         QVERIFY(mgr.canUpdate(mgr.pass(passId)));
0098 
0099         s_nam.replies.push({QNetworkReply::NoError, 200, QByteArray("hello from the captive portal!"), QString()});
0100 
0101         mgr.updatePass(passId);
0102         QTest::qWait(0);
0103 
0104         QCOMPARE(addSpy.size(), 0);
0105         QCOMPARE(updateSpy.size(), 0);
0106     }
0107 };
0108 
0109 QTEST_GUILESS_MAIN(PkPassManagerTest)
0110 
0111 #include "pkpassmanagertest.moc"