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"