File indexing completed on 2024-04-14 14:18:53

0001 /*
0002     This file is part of the KContacts framework.
0003     SPDX-FileCopyrightText: 2015-2019 Laurent Montel <montel@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "calendarurltest.h"
0009 #include "parametermap_p.h"
0010 
0011 #include "calendarurl.h"
0012 #include "vcardtool_p.h"
0013 #include <QTest>
0014 
0015 using namespace KContacts;
0016 Q_DECLARE_METATYPE(KContacts::CalendarUrl::CalendarType)
0017 CalendarUrlTest::CalendarUrlTest(QObject *parent)
0018     : QObject(parent)
0019 {
0020 }
0021 
0022 CalendarUrlTest::~CalendarUrlTest()
0023 {
0024 }
0025 
0026 void CalendarUrlTest::shouldHaveDefaultValue()
0027 {
0028     CalendarUrl calendarUrl(CalendarUrl::FBUrl);
0029     QVERIFY(!calendarUrl.isValid());
0030     QVERIFY(calendarUrl.url().isEmpty());
0031     QVERIFY(calendarUrl.params().empty());
0032 }
0033 
0034 void CalendarUrlTest::shouldAssignValue()
0035 {
0036     KContacts::ParameterMap params;
0037     params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
0038     params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
0039     CalendarUrl calendarUrl(CalendarUrl::FBUrl);
0040     calendarUrl.setParams(params);
0041     QVERIFY(!calendarUrl.isValid());
0042     QCOMPARE(calendarUrl.type(), CalendarUrl::FBUrl);
0043     QVERIFY(calendarUrl.url().isEmpty());
0044     QVERIFY(!calendarUrl.params().empty());
0045     QCOMPARE(calendarUrl.params(), params);
0046 }
0047 
0048 void CalendarUrlTest::shouldAssignExternal()
0049 {
0050     CalendarUrl calendarUrl(CalendarUrl::FBUrl);
0051     const CalendarUrl::CalendarType type = CalendarUrl::CALUri;
0052     calendarUrl.setType(type);
0053     QVERIFY(calendarUrl.url().isEmpty());
0054     QCOMPARE(calendarUrl.type(), type);
0055 }
0056 
0057 void CalendarUrlTest::shouldSerialized()
0058 {
0059     for (int i = 0; i < CalendarUrl::EndCalendarType; ++i) {
0060         CalendarUrl calendarUrl;
0061         CalendarUrl result;
0062         CalendarUrl::CalendarType type = static_cast<CalendarUrl::CalendarType>(i);
0063         calendarUrl.setType(type);
0064         KContacts::ParameterMap params;
0065         params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
0066         params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
0067         calendarUrl.setParams(params);
0068         calendarUrl.setUrl(QUrl(QStringLiteral("mailto:foo@kde.org")));
0069 
0070         QByteArray data;
0071         QDataStream s(&data, QIODevice::WriteOnly);
0072         s << calendarUrl;
0073 
0074         QDataStream t(&data, QIODevice::ReadOnly);
0075         t >> result;
0076 
0077         QVERIFY(calendarUrl == result);
0078     }
0079 }
0080 
0081 void CalendarUrlTest::shouldEqualCalendarUrl()
0082 {
0083     for (int i = 0; i < CalendarUrl::EndCalendarType; ++i) {
0084         CalendarUrl calendarUrl;
0085         CalendarUrl result;
0086         CalendarUrl::CalendarType type = static_cast<CalendarUrl::CalendarType>(i);
0087         calendarUrl.setType(type);
0088         KContacts::ParameterMap params;
0089         params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
0090         params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
0091         calendarUrl.setUrl(QUrl(QStringLiteral("mailto:foo@kde.org")));
0092         calendarUrl.setParams(params);
0093 
0094         result = calendarUrl;
0095         QVERIFY(calendarUrl == result);
0096     }
0097 }
0098 
0099 void CalendarUrlTest::shouldParseCalendarUrl()
0100 {
0101     for (int i = CalendarUrl::Unknown + 1; i < CalendarUrl::EndCalendarType; ++i) {
0102         CalendarUrl::CalendarType type = static_cast<CalendarUrl::CalendarType>(i);
0103         QByteArray baType;
0104         switch (type) {
0105         case CalendarUrl::Unknown:
0106         case CalendarUrl::EndCalendarType:
0107             break;
0108         case CalendarUrl::FBUrl:
0109             baType = QByteArray("FBURL");
0110             break;
0111         case CalendarUrl::CALUri:
0112             baType = QByteArray("CALURI");
0113             break;
0114         case CalendarUrl::CALADRUri:
0115             baType = QByteArray("CALADRURI");
0116             break;
0117         }
0118 
0119         QByteArray vcarddata(
0120             "BEGIN:VCARD\n"
0121             "VERSION:3.0\n"
0122             "N:LastName;FirstName;;;\n"
0123             "UID:c80cf296-0825-4eb0-ab16-1fac1d522a33@xxxxxx.xx\n");
0124         vcarddata += baType;
0125         vcarddata += QByteArray(
0126             ";PREF=1:https://sherlockholmes.com/calendar/sherlockholmes\n"
0127             "REV:2015-03-14T09:24:45+00:00\n"
0128             "FN:FirstName LastName\n"
0129             "END:VCARD\n");
0130 
0131         KContacts::VCardTool vcard;
0132         const KContacts::AddresseeList lst = vcard.parseVCards(vcarddata);
0133         QCOMPARE(lst.count(), 1);
0134         QCOMPARE(lst.at(0).calendarUrlList().count(), 1);
0135         const CalendarUrl calurl = lst.at(0).calendarUrlList().at(0);
0136         QCOMPARE(calurl.type(), type);
0137         QCOMPARE(calurl.url(), QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
0138         QVERIFY(!calurl.params().empty());
0139     }
0140 }
0141 
0142 void CalendarUrlTest::shouldGenerateVCard_data()
0143 {
0144     QTest::addColumn<KContacts::CalendarUrl::CalendarType>("type");
0145     QTest::addColumn<QByteArray>("value");
0146     for (int i = CalendarUrl::Unknown + 1; i < CalendarUrl::EndCalendarType; ++i) {
0147         KContacts::CalendarUrl::CalendarType type = static_cast<KContacts::CalendarUrl::CalendarType>(i);
0148         QByteArray baType;
0149         switch (type) {
0150         case CalendarUrl::Unknown:
0151         case CalendarUrl::EndCalendarType:
0152             break;
0153         case CalendarUrl::FBUrl:
0154             baType = QByteArray("FBURL");
0155             break;
0156         case CalendarUrl::CALUri:
0157             baType = QByteArray("CALURI");
0158             break;
0159         case CalendarUrl::CALADRUri:
0160             baType = QByteArray("CALADRURI");
0161             break;
0162         }
0163         QTest::newRow(baType.constData()) << type << baType;
0164     }
0165 }
0166 
0167 void CalendarUrlTest::shouldGenerateVCard()
0168 {
0169     QFETCH(KContacts::CalendarUrl::CalendarType, type);
0170     QFETCH(QByteArray, value);
0171 
0172     KContacts::AddresseeList lst;
0173     KContacts::Addressee addr;
0174     addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
0175     addr.setUid(QStringLiteral("testuid"));
0176     CalendarUrl url;
0177     url.setType(type);
0178     url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
0179     addr.insertCalendarUrl(url);
0180     lst << addr;
0181     KContacts::VCardTool vcard;
0182     const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
0183     QByteArray expected;
0184     // Different order
0185     if (type == KContacts::CalendarUrl::FBUrl) {
0186         expected = QByteArray(
0187             "BEGIN:VCARD\r\n"
0188             "VERSION:4.0\r\n"
0189             "EMAIL:foo@kde.org\r\n");
0190         expected += value
0191             + QByteArray(
0192                         ":https://sherlockholmes.com/calendar/sherlockholmes\r\n"
0193                         "N:;;;;\r\n"
0194                         "UID:testuid\r\n"
0195                         "END:VCARD\r\n\r\n");
0196     } else {
0197         expected = QByteArray(
0198             "BEGIN:VCARD\r\n"
0199             "VERSION:4.0\r\n");
0200         expected += value
0201             + QByteArray(
0202                         ":https://sherlockholmes.com/calendar/sherlockholmes\r\n"
0203                         "EMAIL:foo@kde.org\r\n"
0204                         "N:;;;;\r\n"
0205                         "UID:testuid\r\n"
0206                         "END:VCARD\r\n\r\n");
0207     }
0208 
0209     QCOMPARE(ba, expected);
0210 }
0211 
0212 void CalendarUrlTest::shouldGenerateVCardWithParameter()
0213 {
0214     KContacts::AddresseeList lst;
0215     KContacts::Addressee addr;
0216     addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
0217     addr.setUid(QStringLiteral("testuid"));
0218     CalendarUrl url;
0219     url.setType(CalendarUrl::CALUri);
0220     url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
0221     KContacts::ParameterMap params;
0222     params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
0223     url.setParams(params);
0224     addr.insertCalendarUrl(url);
0225     lst << addr;
0226     KContacts::VCardTool vcard;
0227     const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
0228     QByteArray expected = QByteArray(
0229         "BEGIN:VCARD\r\n"
0230         "VERSION:4.0\r\n"
0231         "CALURI;FOO2=bla2,blo2:https://sherlockholmes.com/calendar/sherlockholmes\r\n"
0232         "EMAIL:foo@kde.org\r\n"
0233         "N:;;;;\r\n"
0234         "UID:testuid\r\n"
0235         "END:VCARD\r\n\r\n");
0236     QCOMPARE(ba, expected);
0237 }
0238 
0239 void CalendarUrlTest::shouldNotGeneratedAttributeForVcard3()
0240 {
0241     KContacts::AddresseeList lst;
0242     KContacts::Addressee addr;
0243     addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
0244     addr.setUid(QStringLiteral("testuid"));
0245     CalendarUrl url;
0246     url.setType(CalendarUrl::CALUri);
0247     url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
0248     KContacts::ParameterMap params;
0249     params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
0250     url.setParams(params);
0251     addr.insertCalendarUrl(url);
0252     lst << addr;
0253     KContacts::VCardTool vcard;
0254     const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v3_0);
0255     QByteArray expected = QByteArray(
0256         "BEGIN:VCARD\r\n"
0257         "VERSION:3.0\r\n"
0258         "EMAIL:foo@kde.org\r\n"
0259         "N:;;;;\r\n"
0260         "UID:testuid\r\n"
0261         "END:VCARD\r\n\r\n");
0262     QCOMPARE(ba, expected);
0263 }
0264 
0265 void CalendarUrlTest::shouldGenerateMultiCalendarUrl()
0266 {
0267     KContacts::AddresseeList lst;
0268     KContacts::Addressee addr;
0269     addr.setEmails(QStringList() << QStringLiteral("foo@kde.org"));
0270     addr.setUid(QStringLiteral("testuid"));
0271     CalendarUrl url;
0272     url.setType(CalendarUrl::CALUri);
0273     url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes")));
0274     KContacts::ParameterMap params;
0275     params.push_back({QStringLiteral("Foo2"), {QStringLiteral("bla2"), QStringLiteral("blo2")}});
0276     url.setParams(params);
0277     addr.insertCalendarUrl(url);
0278 
0279     url.setType(CalendarUrl::FBUrl);
0280     url.setUrl(QUrl(QStringLiteral("https://sherlockholmes.com/calendar/sherlockholmes2")));
0281     params.clear();
0282 
0283     params.push_back({QStringLiteral("Foo1"), {QStringLiteral("bla1"), QStringLiteral("blo1")}});
0284     url.setParams(params);
0285     addr.insertCalendarUrl(url);
0286 
0287     lst << addr;
0288     KContacts::VCardTool vcard;
0289     const QByteArray ba = vcard.exportVCards(lst, KContacts::VCard::v4_0);
0290     QByteArray expected = QByteArray(
0291         "BEGIN:VCARD\r\n"
0292         "VERSION:4.0\r\n"
0293         "CALURI;FOO2=bla2,blo2:https://sherlockholmes.com/calendar/sherlockholmes\r\n"
0294         "EMAIL:foo@kde.org\r\n"
0295         "FBURL;FOO1=bla1,blo1:https://sherlockholmes.com/calendar/sherlockholmes2\r\n"
0296         "N:;;;;\r\n"
0297         "UID:testuid\r\n"
0298         "END:VCARD\r\n\r\n");
0299     QCOMPARE(ba, expected);
0300 }
0301 
0302 QTEST_MAIN(CalendarUrlTest)
0303 
0304 #include "moc_calendarurltest.cpp"