File indexing completed on 2024-05-19 05:17:49

0001 /*
0002     SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include <KItinerary/ExtractorDocumentNode>
0008 #include <KItinerary/ExtractorDocumentNodeFactory>
0009 #include <KItinerary/ExtractorDocumentProcessor>
0010 #include <KItinerary/ExtractorEngine>
0011 #include <KItinerary/ExtractorFilter>
0012 #include <KItinerary/ExtractorResult>
0013 
0014 #include <QFile>
0015 #include <QTest>
0016 
0017 using namespace KItinerary;
0018 
0019 #define s(x) QStringLiteral(x)
0020 
0021 class ExtractorFilterTest : public QObject
0022 {
0023     Q_OBJECT
0024 private Q_SLOTS:
0025     void testIcalFilter()
0026     {
0027         QFile f(s(SOURCE_DIR "/extractordata/ical/eventreservation.ics"));
0028         QVERIFY(f.open(QFile::ReadOnly));
0029 
0030         ExtractorEngine engine;
0031         auto root = engine.documentNodeFactory()->createNode(f.readAll());
0032         QVERIFY(!root.isNull());
0033         QCOMPARE(root.mimeType(), QLatin1StringView("text/calendar"));
0034         root.processor()->expandNode(root, &engine);
0035         QCOMPARE(root.childNodes().size(), 1);
0036 
0037         ExtractorFilter filter;
0038         filter.setMimeType(s("text/calendar"));
0039         filter.setFieldName(s("productId"));
0040         filter.setPattern(s("KDE"));
0041         filter.setScope(ExtractorFilter::Current);
0042 
0043         QVERIFY(!filter.matches(root));
0044 
0045         filter.setPattern(s("libkcal"));
0046         QVERIFY(filter.matches(root));
0047 
0048         std::vector<ExtractorDocumentNode> matches;
0049         filter.allMatches(root, matches);
0050         QCOMPARE(matches.size(), 1);
0051         QCOMPARE(matches[0].mimeType(), root.mimeType());
0052 
0053         filter.setScope(ExtractorFilter::Children);
0054         QVERIFY(!filter.matches(root));
0055         filter.setMimeType(s("internal/event"));
0056         filter.setPattern(s("Akademy"));
0057         QVERIFY(!filter.matches(root));
0058         filter.setFieldName(s("summary"));
0059         QVERIFY(filter.matches(root));
0060         matches.clear();
0061         filter.allMatches(root, matches);
0062         QCOMPARE(matches.size(), 1);
0063         QCOMPARE(matches[0].mimeType(), QLatin1StringView("internal/event"));
0064         filter.setScope(ExtractorFilter::Descendants);
0065         QVERIFY(filter.matches(root));
0066         matches.clear();
0067         filter.allMatches(root, matches);
0068         QCOMPARE(matches.size(), 1);
0069         QCOMPARE(matches[0].mimeType(), QLatin1StringView("internal/event"));
0070     }
0071 
0072     void testPkPassFilter()
0073     {
0074         QFile f(s(SOURCE_DIR "/pkpassdata/swiss.pkpass"));
0075         QVERIFY(f.open(QFile::ReadOnly));
0076 
0077         ExtractorEngine engine;
0078         auto root = engine.documentNodeFactory()->createNode(f.readAll());
0079         QVERIFY(!root.isNull());
0080         QCOMPARE(root.mimeType(),
0081                  QLatin1StringView("application/vnd.apple.pkpass"));
0082         root.processor()->expandNode(root, &engine);
0083         QCOMPARE(root.childNodes().size(), 1);
0084         auto bcbp = root.childNodes()[0];
0085         QCOMPARE(bcbp.mimeType(), QLatin1StringView("internal/iata-bcbp"));
0086 
0087         ExtractorFilter filter;
0088         filter.setMimeType(s("application/vnd.apple.pkpass"));
0089         filter.setFieldName(s("passTypeIdentifier"));
0090         filter.setPattern(s("pass.booking.swiss.com"));
0091 
0092         filter.setScope(ExtractorFilter::Current);
0093         QVERIFY(!filter.matches(bcbp));
0094         QVERIFY(filter.matches(root));
0095 
0096         filter.setScope(ExtractorFilter::Parent);
0097         QVERIFY(filter.matches(bcbp));
0098         QVERIFY(!filter.matches(root));
0099         filter.setScope(ExtractorFilter::Ancestors);
0100         QVERIFY(filter.matches(bcbp));
0101         QVERIFY(!filter.matches(root));
0102     }
0103 
0104     void testResultFilter()
0105     {
0106         QFile f(s(SOURCE_DIR "/calendarhandlerdata/event.json"));
0107         QVERIFY(f.open(QFile::ReadOnly));
0108 
0109         ExtractorEngine engine;
0110         auto root = engine.documentNodeFactory()->createNode(f.readAll());
0111         QVERIFY(!root.isNull());
0112         QCOMPARE(root.mimeType(), QLatin1StringView("application/ld+json"));
0113         root.processor()->preExtract(root, &engine);
0114         QCOMPARE(root.result().size(), 1);
0115 
0116         ExtractorFilter filter;
0117         filter.setMimeType(s("application/ld+json"));
0118         filter.setFieldName(s("location.address.addressLocality"));
0119         filter.setPattern(s("Berlin"));
0120         filter.setScope(ExtractorFilter::Current);
0121         QVERIFY(!filter.matches(root));
0122         filter.setPattern(s("Milan"));
0123         QVERIFY(filter.matches(root));
0124     }
0125 
0126     void testIataBcbpFilter()
0127     {
0128         QFile f(s(SOURCE_DIR "/extractordata/synthetic/iata-bcbp-demo.pdf"));
0129         QVERIFY(f.open(QFile::ReadOnly));
0130 
0131         ExtractorEngine engine;
0132         engine.setData(f.readAll());
0133         engine.extract();
0134         const auto root = engine.rootDocumentNode();
0135         QVERIFY(!root.isNull());
0136 
0137         ExtractorFilter filter;
0138         filter.setMimeType(s("internal/iata-bcbp"));
0139         filter.setScope(ExtractorFilter::Descendants);
0140         QVERIFY(filter.matches(root));
0141 
0142         std::vector<ExtractorDocumentNode> matches;
0143         filter.allMatches(root, matches);
0144         QCOMPARE(matches.size(), 1);
0145 
0146         filter.setFieldName(s("operatingCarrierDesignator"));
0147         filter.setPattern(s("AK"));
0148         QVERIFY(filter.matches(root));
0149     }
0150 };
0151 
0152 QTEST_GUILESS_MAIN(ExtractorFilterTest)
0153 
0154 #include "extractorfiltertest.moc"