File indexing completed on 2024-05-12 05:17:30

0001 /*
0002     SPDX-FileCopyrightText: 2019 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include <KItinerary/CreativeWork>
0008 #include <KItinerary/File>
0009 #include <KItinerary/JsonLdDocument>
0010 #include <KItinerary/Reservation>
0011 
0012 #include <KPkPass/Pass>
0013 
0014 #include <QByteArray>
0015 #include <QDebug>
0016 #include <QFile>
0017 #include <QJsonArray>
0018 #include <QJsonDocument>
0019 #include <QObject>
0020 #include <QTemporaryFile>
0021 #include <QTest>
0022 
0023 using namespace KItinerary;
0024 
0025 class FileTest : public QObject
0026 {
0027     Q_OBJECT
0028 private Q_SLOTS:
0029     void testFileIo()
0030     {
0031         QTemporaryFile tmp;
0032         QVERIFY(tmp.open());
0033         tmp.close();
0034 
0035         File out;
0036         out.setFileName(tmp.fileName());
0037         QVERIFY(out.open(File::Write));
0038         QCOMPARE(out.errorString(), QString());
0039         {
0040           QFile resFile(QLatin1StringView(SOURCE_DIR "/pkpassdata/swiss.json"));
0041           QVERIFY(resFile.open(QFile::ReadOnly));
0042           const auto r = JsonLdDocument::fromJson(
0043               QJsonDocument::fromJson(resFile.readAll()).array());
0044           QCOMPARE(r.size(), 1);
0045           out.addReservation(r.at(0));
0046 
0047           QFile passFile(
0048               QLatin1StringView(SOURCE_DIR "/pkpassdata/swiss.pkpass"));
0049           QVERIFY(passFile.open(QFile::ReadOnly));
0050           const auto passData = passFile.readAll();
0051           std::unique_ptr<KPkPass::Pass> pass(
0052               KPkPass::Pass::fromData(passData));
0053           QVERIFY(pass);
0054           out.addPass(pass.get(), passData);
0055 
0056           DigitalDocument doc;
0057           doc.setDescription(QStringLiteral("Ticket"));
0058           doc.setName(QStringLiteral("../?/../boarding *pass.pdf"));
0059           doc.setEncodingFormat(QStringLiteral("application/pdf"));
0060           out.addDocument(QStringLiteral("docid1"), doc,
0061                           QByteArray("%PDF12345"));
0062 
0063           out.addCustomData(QStringLiteral("org.kde.kitinerary/UnitTest"),
0064                             QStringLiteral("element1"),
0065                             QByteArray("hello world"));
0066           out.addCustomData(QStringLiteral("org.kde.kitinerary/UnitTest"),
0067                             QStringLiteral("element 2"),
0068                             QByteArray("hello again"));
0069           out.addCustomData(QStringLiteral("org.kde.kitinerary/UnitTest2"),
0070                             QStringLiteral("element1"),
0071                             QByteArray("something else"));
0072         }
0073         out.close();
0074 
0075         File in;
0076         in.setFileName(tmp.fileName());
0077         QVERIFY(in.open(File::Read));
0078         QVERIFY(in.errorString().isEmpty());
0079         QCOMPARE(in.reservations().size(), 1);
0080         const auto resId = in.reservations().at(0);
0081         QVERIFY(!resId.isEmpty());
0082         QVERIFY(!resId.endsWith(QLatin1StringView(".json")));
0083         QVERIFY(JsonLd::isA<FlightReservation>(in.reservation(resId)));
0084         const auto res = in.reservation(resId).value<FlightReservation>();
0085 
0086         QCOMPARE(in.passes().size(), 1);
0087         const auto passId =  in.passes().at(0);
0088         QCOMPARE(passId,
0089                  QLatin1StringView("pass.booking.swiss.com/MTIzNDU2Nzg5"));
0090         QVERIFY(!in.passData(passId).isEmpty());
0091         QCOMPARE(File::passId(res.pkpassPassTypeIdentifier(), res.pkpassSerialNumber()), passId);
0092 
0093         const auto docs = in.documents();
0094         QCOMPARE(docs.size(), 1);
0095         QCOMPARE(docs.at(0), QLatin1StringView("docid1"));
0096         const auto docMeta = in.documentInfo(docs.at(0)).value<DigitalDocument>();
0097         QCOMPARE(docMeta.name(), QLatin1StringView("boarding__pass.pdf"));
0098         QCOMPARE(docMeta.description(), QLatin1StringView("Ticket"));
0099         QCOMPARE(docMeta.encodingFormat(),
0100                  QLatin1StringView("application/pdf"));
0101         QCOMPARE(in.documentData(docs.at(0)), QByteArray("%PDF12345"));
0102 
0103         auto customData = in.listCustomData(QStringLiteral("org.kde.kitinerary/UnitTest"));
0104         QCOMPARE(customData.size(), 2);
0105         QVERIFY(customData.contains(QLatin1StringView("element1")));
0106         QVERIFY(customData.contains(QLatin1StringView("element 2")));
0107         QCOMPARE(in.customData(QStringLiteral("org.kde.kitinerary/UnitTest"), QStringLiteral("element1")), QByteArray("hello world"));
0108         QCOMPARE(in.customData(QStringLiteral("org.kde.kitinerary/UnitTest"), QStringLiteral("element 2")), QByteArray("hello again"));
0109 
0110         customData = in.listCustomData(QStringLiteral("org.kde.kitinerary/UnitTest2"));
0111         QCOMPARE(customData.size(), 1);
0112         QVERIFY(customData.contains(QLatin1StringView("element1")));
0113         QCOMPARE(in.customData(QStringLiteral("org.kde.kitinerary/UnitTest2"), QStringLiteral("element1")), QByteArray("something else"));
0114     }
0115 
0116     void testMistakes()
0117     {
0118         File f;
0119         f.close();
0120 
0121         QVERIFY(!f.open(File::Read));
0122         f.setFileName(QLatin1StringView("foo.itinerary"));
0123         QVERIFY(!f.open(File::Read));
0124         QVERIFY(!f.errorString().isEmpty());
0125 
0126         QTemporaryFile tmp;
0127         QVERIFY(tmp.open());
0128         tmp.close();
0129         f.setFileName(tmp.fileName());
0130         QVERIFY(f.open(File::Write));
0131         QVERIFY(f.errorString().isEmpty());
0132 
0133         QCOMPARE(f.passes(), QList<QString>());
0134         QCOMPARE(f.reservations(), QList<QString>());
0135         QCOMPARE(f.passData(QStringLiteral("1234")), QByteArray());
0136         QCOMPARE(f.reservation(QStringLiteral("1234")), QVariant());
0137 
0138         f.addDocument(QString(), QVariant(), QByteArray());
0139         f.addDocument(QStringLiteral("docid"), QVariant(), QByteArray());
0140         QCOMPARE(f.documents().size(), 0);
0141         QCOMPARE(f.documentInfo(QStringLiteral("foo")), QVariant());
0142         QCOMPARE(f.documentData(QStringLiteral("foo")), QByteArray());
0143 
0144         QCOMPARE(f.listCustomData(QStringLiteral("foo")), QList<QString>());
0145         QCOMPARE(f.customData(QStringLiteral("a / b"), QStringLiteral("c")), QByteArray());
0146         QCOMPARE(f.customData(QString(), QString()), QByteArray());
0147     }
0148 
0149     void testNormalizeDocFileName_data()
0150     {
0151         QTest::addColumn<QString>("in");
0152         QTest::addColumn<QString>("out");
0153 
0154         QTest::newRow("empty") << QString() << QStringLiteral("file");
0155         QTest::newRow("meta") << QStringLiteral("meta.json") << QStringLiteral("file");
0156         QTest::newRow("path") << QStringLiteral("a/b/c.pdf") << QStringLiteral("c.pdf");
0157         QTest::newRow("star") << QStringLiteral("a*b.pdf") << QStringLiteral("a_b.pdf");
0158         QTest::newRow("questionmark") << QStringLiteral("a?b.pdf") << QStringLiteral("a_b.pdf");
0159     }
0160 
0161     void testNormalizeDocFileName()
0162     {
0163         QFETCH(QString, in);
0164         QFETCH(QString, out);
0165         QCOMPARE(File::normalizeDocumentFileName(in), out);
0166     }
0167 };
0168 
0169 QTEST_GUILESS_MAIN(FileTest)
0170 
0171 #include "filetest.moc"