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"