File indexing completed on 2024-05-12 05:21:26

0001 /*
0002     SPDX-FileCopyrightText: 2015 Aleix Pol Gonzalez <aleixpol@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include <../src/kpeoplevcard.h>
0008 #include <KContacts/VCardConverter>
0009 #include <QDir>
0010 #include <QObject>
0011 #include <QSignalSpy>
0012 #include <QStandardPaths>
0013 #include <QTest>
0014 
0015 class KPeopleVCardTest : public QObject
0016 {
0017     Q_OBJECT
0018 public:
0019     KPeopleVCardTest()
0020         : m_source(new VCardDataSource(this, {}))
0021     {
0022     }
0023 
0024     QByteArray createContact(const KContacts::Addressee &addressee)
0025     {
0026         KContacts::VCardConverter conv;
0027         return conv.exportVCard(addressee, KContacts::VCardConverter::v3_0);
0028     }
0029 
0030     void writeContact(const KContacts::Addressee &addressee, const QString &path)
0031     {
0032         QFile f(path);
0033         bool b = f.open(QIODevice::WriteOnly);
0034         Q_ASSERT(b);
0035 
0036         f.write(createContact(addressee));
0037     }
0038 
0039 private Q_SLOTS:
0040     void initTestCase()
0041     {
0042         QStandardPaths::setTestModeEnabled(true);
0043         m_vcardsDir = QDir(KPeopleVCard::contactsVCardPath());
0044 
0045         QDir().temp().mkpath(KPeopleVCard::contactsVCardPath());
0046 
0047         QVERIFY(m_vcardsDir.exists());
0048 
0049         foreach (const QFileInfo &entry, m_vcardsDir.entryInfoList(QDir::Files)) {
0050             QFile::remove(entry.absoluteFilePath());
0051         }
0052 
0053         QDir(KPeopleVCard::contactsVCardWritePath()).removeRecursively();
0054         QDir().temp().mkpath(KPeopleVCard::contactsVCardPath() + "/subdir");
0055         QCOMPARE(m_vcardsDir.count(), uint(3)); //. and .. and subdir/
0056 
0057         m_backend = dynamic_cast<KPeopleVCard *>(m_source->createAllContactsMonitor());
0058     }
0059 
0060     void emptyTest()
0061     {
0062         QVERIFY(m_backend->contacts().isEmpty());
0063     }
0064 
0065     void crudTest()
0066     {
0067         // ENSURE EMPTY
0068         QVERIFY(m_backend->contacts().isEmpty());
0069 
0070         const QString name = QStringLiteral("aaa"), name2 = QStringLiteral("bbb");
0071         KContacts::Addressee addr;
0072         addr.setName(name);
0073         const QString path = m_vcardsDir.absoluteFilePath("X.vcf");
0074         const QString pathInSubdir = m_vcardsDir.absoluteFilePath("subdir/a.vcf");
0075         // CREATE
0076         {
0077             QSignalSpy spy(m_backend, &KPeople::AllContactsMonitor::contactAdded);
0078             writeContact(addr, path);
0079             QVERIFY(spy.wait());
0080 
0081             // write the same contact into a subdir
0082             writeContact(addr, pathInSubdir);
0083             QVERIFY(spy.wait());
0084         }
0085 
0086         // READ
0087         {
0088             KPeople::AbstractContact::Ptr ptr = m_backend->contacts().first();
0089             QCOMPARE(ptr->customProperty(KPeople::AbstractContact::NameProperty).toString(), name);
0090 
0091             // the contact in subdir
0092             ptr = m_backend->contacts().last();
0093             QCOMPARE(ptr->customProperty(KPeople::AbstractContact::NameProperty).toString(), name);
0094         }
0095 
0096         // UPDATE
0097         {
0098             addr.setName(name2);
0099             QSignalSpy spy(m_backend, &KPeople::AllContactsMonitor::contactChanged);
0100             writeContact(addr, path);
0101             QVERIFY(spy.wait());
0102 
0103             writeContact(addr, pathInSubdir);
0104             QVERIFY(spy.wait());
0105         }
0106 
0107         // READ
0108         {
0109             KPeople::AbstractContact::Ptr ptr = m_backend->contacts().first();
0110             QCOMPARE(ptr->customProperty(KPeople::AbstractContact::NameProperty).toString(), name2);
0111 
0112             ptr = m_backend->contacts().last();
0113             QCOMPARE(ptr->customProperty(KPeople::AbstractContact::NameProperty).toString(), name2);
0114         }
0115 
0116         // REMOVE
0117         {
0118             QSignalSpy spy(m_backend, &KPeople::AllContactsMonitor::contactRemoved);
0119             QFile::remove(path);
0120             QVERIFY(spy.wait());
0121 
0122             QFile::remove(pathInSubdir);
0123             QVERIFY(spy.wait());
0124         }
0125 
0126         // ENSURE EMPTY
0127         QVERIFY(m_backend->contacts().isEmpty());
0128     }
0129 
0130     void editableInterface()
0131     {
0132         KContacts::Addressee addr;
0133         addr.setName(QStringLiteral("Potato Person"));
0134         QString uri;
0135         KPeople::AbstractContact::Ptr ptr;
0136 
0137         // CREATE
0138         {
0139             QSignalSpy spy(m_backend, &KPeople::AllContactsMonitor::contactAdded);
0140             QVERIFY(m_source->addContact({{"vcard", createContact(addr)}}));
0141             QVERIFY(spy.wait());
0142 
0143             uri = spy.constFirst().constFirst().toString();
0144             ptr = spy.constFirst().constLast().value<KPeople::AbstractContact::Ptr>();
0145 
0146             QVERIFY(m_backend->contacts().contains(uri));
0147             QCOMPARE(QDir(KPeopleVCard::contactsVCardWritePath()).count(), 3); //. .. and the potato person
0148         }
0149 
0150         // READ
0151         {
0152             QCOMPARE(ptr->customProperty(KPeople::AbstractContact::NameProperty), addr.name());
0153         }
0154 
0155         // UPDATE
0156         {
0157             KPeople::AbstractEditableContact *editable = dynamic_cast<KPeople::AbstractEditableContact *>(ptr.data());
0158             QVERIFY(editable);
0159             QCOMPARE(QDir(KPeopleVCard::contactsVCardWritePath()).count(), 3); //. .. and the potato person
0160             QVERIFY(m_backend->contacts().contains(uri));
0161 
0162             addr.setName("Tomato Person");
0163             QSignalSpy spy(m_backend, &KPeople::AllContactsMonitor::contactChanged);
0164             QVERIFY(editable->setCustomProperty("vcard", createContact(addr)));
0165             QVERIFY(spy.wait());
0166             QCOMPARE(spy.constFirst().constFirst(), uri);
0167         }
0168 
0169         {
0170             QSignalSpy spy(m_backend, &KPeople::AllContactsMonitor::contactRemoved);
0171             QVERIFY(m_source->deleteContact(uri));
0172             QVERIFY(spy.wait());
0173 
0174             QCOMPARE(spy.constFirst().constFirst().toString(), uri);
0175         }
0176         QCOMPARE(QDir(KPeopleVCard::contactsVCardWritePath()).count(), 2); //. .. and the potato person
0177         QVERIFY(!m_backend->contacts().contains(uri));
0178     }
0179 
0180 private:
0181     KPeopleVCard *m_backend;
0182     VCardDataSource *m_source;
0183     QDir m_vcardsDir;
0184 };
0185 
0186 QTEST_GUILESS_MAIN(KPeopleVCardTest)
0187 
0188 #include "kpeoplevcardtest.moc"