File indexing completed on 2025-03-09 04:57:04

0001 /*
0002  * SPDX-FileCopyrightText: 2015 Kevin Ottens <ervin@kde.org>
0003  SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 */
0005 
0006 
0007 #include "testlib/akonadifakedata.h"
0008 #include "akonadi/akonadimonitorinterface.h"
0009 #include "akonadi/akonadiserializer.h"
0010 
0011 #include <testlib/qtest_zanshin.h>
0012 
0013 #include <akonadiserializer.h>
0014 
0015 namespace QTest {
0016 
0017 template<typename T>
0018 inline bool zCompareHelper(bool isOk,
0019                            const T &left, const T &right,
0020                            const char *actual, const char *expected,
0021                            const char *file, int line)
0022 {
0023     return compare_helper(isOk, isOk ? "COMPARE()" : "Compared values are not the same",
0024                           toString<T>(left), toString<T>(right),
0025                           actual, expected,
0026                           file, line);
0027 }
0028 
0029 // More aggressive compare to make sure we just don't get collections with ids out
0030 template <>
0031 inline bool qCompare(const Akonadi::Collection &left, const Akonadi::Collection &right,
0032                      const char *actual, const char *expected,
0033                      const char *file, int line)
0034 {
0035     return zCompareHelper((left == right) && (left.displayName() == right.displayName()),
0036                           left, right, actual, expected, file, line);
0037 }
0038 
0039 // More aggressive compare to make sure we just don't get items with ids out
0040 template <>
0041 inline bool qCompare(const Akonadi::Item &left, const Akonadi::Item &right,
0042                      const char *actual, const char *expected,
0043                      const char *file, int line)
0044 {
0045     return zCompareHelper((left == right) && (left.payloadData() == right.payloadData()),
0046                           left, right, actual, expected, file, line);
0047 }
0048 
0049 }
0050 
0051 namespace
0052 {
0053     template<typename T>
0054     QSet<T> listToSet(const QList<T> &list)
0055     {
0056         return {list.cbegin(), list.cend()};
0057     }
0058 }
0059 
0060 class AkonadiFakeDataTest : public QObject
0061 {
0062     Q_OBJECT
0063 public:
0064     explicit AkonadiFakeDataTest(QObject *parent = nullptr)
0065         : QObject(parent)
0066     {
0067         qRegisterMetaType<Akonadi::Collection>();
0068         qRegisterMetaType<Akonadi::Item>();
0069     }
0070 
0071 private slots:
0072     void shouldBeInitiallyEmpty()
0073     {
0074         // GIVEN
0075         auto data = Testlib::AkonadiFakeData();
0076 
0077         // THEN
0078         QVERIFY(data.collections().isEmpty());
0079         QVERIFY(data.contexts().isEmpty());
0080         QVERIFY(data.items().isEmpty());
0081     }
0082 
0083     void shouldCreateCollections()
0084     {
0085         // GIVEN
0086         auto data = Testlib::AkonadiFakeData();
0087         QScopedPointer<Akonadi::MonitorInterface> monitor(data.createMonitor());
0088         QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::collectionAdded);
0089 
0090         auto c1 = Akonadi::Collection(42);
0091         c1.setName(QStringLiteral("42"));
0092         auto c2 = Akonadi::Collection(43);
0093         c2.setName(QStringLiteral("43"));
0094         const auto colSet = QSet<Akonadi::Collection>() << c1 << c2;
0095 
0096         // WHEN
0097         data.createCollection(c1);
0098         data.createCollection(c2);
0099 
0100         // THEN
0101         QCOMPARE(listToSet(data.collections()), colSet);
0102         QCOMPARE(data.collection(c1.id()), c1);
0103         QCOMPARE(data.collection(c2.id()), c2);
0104 
0105         QCOMPARE(spy.size(), 2);
0106         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Collection>(), c1);
0107         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Collection>(), c2);
0108     }
0109 
0110     void shouldModifyCollections()
0111     {
0112         // GIVEN
0113         auto data = Testlib::AkonadiFakeData();
0114         QScopedPointer<Akonadi::MonitorInterface> monitor(data.createMonitor());
0115         QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::collectionChanged);
0116 
0117         auto c1 = Akonadi::Collection(42);
0118         c1.setName(QStringLiteral("42"));
0119         data.createCollection(c1);
0120 
0121         auto c2 = Akonadi::Collection(c1.id());
0122         c2.setName(QStringLiteral("42-bis"));
0123 
0124         // WHEN
0125         data.modifyCollection(c2);
0126 
0127         // THEN
0128         QCOMPARE(data.collections().size(), 1);
0129         QCOMPARE(data.collection(c1.id()), c2);
0130 
0131         QCOMPARE(spy.size(), 1);
0132         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Collection>(), c2);
0133     }
0134 
0135     void shouldNotLoseParentCollectionOnModifyCollection()
0136     {
0137         // GIVEN
0138         auto data = Testlib::AkonadiFakeData();
0139 
0140         auto root = Akonadi::Collection(42);
0141         root.setName(QStringLiteral("root"));
0142         data.createCollection(root);
0143 
0144         auto c1 = Akonadi::Collection(43);
0145         c1.setName(QStringLiteral("43"));
0146         c1.setParentCollection(Akonadi::Collection(root.id()));
0147         data.createCollection(c1);
0148 
0149         auto c2 = Akonadi::Collection(c1.id());
0150         c2.setName(QStringLiteral("43-bis"));
0151 
0152         // WHEN
0153         data.modifyCollection(c2);
0154 
0155         // THEN
0156         QCOMPARE(data.collections().size(), 2);
0157         QCOMPARE(data.collection(c1.id()), c2);
0158         QCOMPARE(data.collection(c1.id()).parentCollection().id(), root.id());
0159     }
0160 
0161     void shouldListChildCollections()
0162     {
0163         // GIVEN
0164         auto data = Testlib::AkonadiFakeData();
0165         auto c1 = Akonadi::Collection(42);
0166         c1.setName(QStringLiteral("42"));
0167         auto c2 = Akonadi::Collection(43);
0168         c2.setName(QStringLiteral("43"));
0169         c2.setParentCollection(Akonadi::Collection(42));
0170         const auto colSet = QSet<Akonadi::Collection>() << c2;
0171 
0172         // WHEN
0173         data.createCollection(c1);
0174         data.createCollection(c2);
0175 
0176         // THEN
0177         QVERIFY(data.childCollections(c2.id()).isEmpty());
0178         QCOMPARE(listToSet(data.childCollections(c1.id())), colSet);
0179     }
0180 
0181     void shouldReparentCollectionsOnModify()
0182     {
0183         // GIVEN
0184         auto data = Testlib::AkonadiFakeData();
0185 
0186         auto c1 = Akonadi::Collection(42);
0187         c1.setName(QStringLiteral("42"));
0188         data.createCollection(c1);
0189 
0190         auto c2 = Akonadi::Collection(43);
0191         c2.setName(QStringLiteral("43"));
0192         data.createCollection(c2);
0193 
0194         auto c3 = Akonadi::Collection(44);
0195         c3.setParentCollection(Akonadi::Collection(42));
0196         data.createCollection(c3);
0197 
0198         // WHEN
0199         c3.setParentCollection(Akonadi::Collection(43));
0200         data.modifyCollection(c3);
0201 
0202         // THEN
0203         QVERIFY(data.childCollections(c1.id()).isEmpty());
0204         QCOMPARE(data.childCollections(c2.id()).size(), 1);
0205         QCOMPARE(data.childCollections(c2.id()).at(0), c3);
0206     }
0207 
0208     void shouldRemoveCollections()
0209     {
0210         // GIVEN
0211         auto data = Testlib::AkonadiFakeData();
0212         QScopedPointer<Akonadi::MonitorInterface> monitor(data.createMonitor());
0213         QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::collectionRemoved);
0214         Akonadi::Serializer serializer;
0215 
0216         auto c1 = Akonadi::Collection(42);
0217         c1.setName(QStringLiteral("42"));
0218         data.createCollection(c1);
0219 
0220         auto c2 = Akonadi::Collection(43);
0221         c2.setName(QStringLiteral("43"));
0222         c2.setParentCollection(Akonadi::Collection(42));
0223         data.createCollection(c2);
0224 
0225         auto c3 = Akonadi::Collection(44);
0226         c3.setName(QStringLiteral("44"));
0227         c3.setParentCollection(Akonadi::Collection(43));
0228         data.createCollection(c3);
0229 
0230         auto task1 = Domain::Task::Ptr::create();
0231         auto i1 = serializer.createItemFromTask(task1);
0232         i1.setId(42);
0233         i1.setParentCollection(Akonadi::Collection(43));
0234         data.createItem(i1);
0235 
0236         auto task2 = Domain::Task::Ptr::create();
0237         auto i2 = serializer.createItemFromTask(task2);
0238         i2.setId(43);
0239         i2.setParentCollection(Akonadi::Collection(44));
0240         data.createItem(i2);
0241 
0242         // WHEN
0243         data.removeCollection(c2);
0244 
0245         // THEN
0246         QCOMPARE(data.collections().size(), 1);
0247         QCOMPARE(data.collections().at(0), c1);
0248 
0249         QVERIFY(!data.collection(c2.id()).isValid());
0250         QVERIFY(!data.collection(c3.id()).isValid());
0251 
0252         QVERIFY(data.childCollections(c1.id()).isEmpty());
0253         QVERIFY(data.childCollections(c2.id()).isEmpty());
0254         QVERIFY(data.childCollections(c3.id()).isEmpty());
0255 
0256         QVERIFY(data.items().isEmpty());
0257 
0258         QVERIFY(!data.item(i1.id()).isValid());
0259         QVERIFY(!data.item(i2.id()).isValid());
0260 
0261         QVERIFY(data.childItems(c2.id()).isEmpty());
0262         QVERIFY(data.childItems(c3.id()).isEmpty());
0263 
0264         QCOMPARE(spy.size(), 2);
0265         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Collection>(), c3);
0266         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Collection>(), c2);
0267     }
0268 
0269     void shouldCreateContexts()
0270     {
0271         // GIVEN
0272         auto data = Testlib::AkonadiFakeData();
0273         QScopedPointer<Akonadi::MonitorInterface> monitor(data.createMonitor());
0274         QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemAdded);
0275         Akonadi::Serializer serializer;
0276 
0277         auto context1 = Domain::Context::Ptr::create();
0278         context1->setName(QStringLiteral("42"));
0279         context1->setProperty("todoUid", "ctx-42");
0280         auto t1 = serializer.createItemFromContext(context1);
0281 
0282         auto context2 = Domain::Context::Ptr::create();
0283         context2->setName(QStringLiteral("43"));
0284         context2->setProperty("todoUid", "ctx-43");
0285         auto t2 = serializer.createItemFromContext(context2);
0286 
0287         // WHEN
0288         data.createContext(t1);
0289         data.createContext(t2);
0290 
0291         // THEN
0292         QCOMPARE(data.contexts().size(), 2);
0293         QVERIFY(data.contexts().contains(t1));
0294         QVERIFY(data.contexts().contains(t2));
0295         QCOMPARE(data.contextItem("ctx-42"), t1);
0296         QCOMPARE(data.contextItem("ctx-43"), t2);
0297 
0298         QCOMPARE(spy.size(), 2);
0299         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Item>(), t1);
0300         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Item>(), t2);
0301     }
0302 
0303     void shouldModifyContexts()
0304     {
0305         // GIVEN
0306         auto data = Testlib::AkonadiFakeData();
0307         QScopedPointer<Akonadi::MonitorInterface> monitor(data.createMonitor());
0308         QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemChanged);
0309         Akonadi::Serializer serializer;
0310 
0311         auto context1 = Domain::Context::Ptr::create();
0312         context1->setName(QStringLiteral("42"));
0313         context1->setProperty("todoUid", "ctx-42");
0314         auto t1 = serializer.createItemFromContext(context1);
0315         data.createContext(t1);
0316 
0317         auto context2 = Domain::Context::Ptr::create();
0318         context2->setName(QStringLiteral("42-bis"));
0319         context2->setProperty("todoUid", "ctx-42");
0320         auto t2 = serializer.createItemFromContext(context2);
0321 
0322         // WHEN
0323         data.modifyContext(t2);
0324 
0325         // THEN
0326         QCOMPARE(data.contexts().size(), 1);
0327         QCOMPARE(data.contextItem("ctx-42"), t2);
0328 
0329         QCOMPARE(spy.size(), 1);
0330         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Item>(), t2);
0331     }
0332 
0333     void shouldRemoveContexts()
0334     {
0335         // GIVEN
0336         auto data = Testlib::AkonadiFakeData();
0337         QScopedPointer<Akonadi::MonitorInterface> monitor(data.createMonitor());
0338         QSignalSpy contextSpy(monitor.data(), &Akonadi::MonitorInterface::itemRemoved);
0339         QSignalSpy itemSpy(monitor.data(), &Akonadi::MonitorInterface::itemChanged);
0340         Akonadi::Serializer serializer;
0341 
0342         auto c1 = Akonadi::Collection(42);
0343         data.createCollection(c1);
0344 
0345         auto context1 = Domain::Context::Ptr::create();
0346         context1->setName(QStringLiteral("1"));
0347         context1->setProperty("todoUid", "ctx-1");
0348         auto t1 = serializer.createItemFromContext(context1);
0349         data.createContext(t1);
0350 
0351         auto context2 = Domain::Context::Ptr::create();
0352         context2->setName(QStringLiteral("2"));
0353         context2->setProperty("todoUid", "ctx-2");
0354         auto t2 = serializer.createItemFromContext(context2);
0355         data.createContext(t2);
0356 
0357         auto task1 = Domain::Task::Ptr::create();
0358         auto i1 = serializer.createItemFromTask(task1);
0359         i1.setParentCollection(c1);
0360         i1.setId(42);
0361         serializer.addContextToTask(context1, i1);
0362         data.createItem(i1);
0363         QVERIFY(serializer.isContextChild(context1, i1));
0364 
0365         auto task2 = Domain::Task::Ptr::create();
0366         auto i2 = serializer.createItemFromTask(task2);
0367         i2.setParentCollection(c1);
0368         i2.setId(43);
0369         serializer.addContextToTask(context2, i2);
0370         data.createItem(i2);
0371         QVERIFY(serializer.isContextChild(context2, i2));
0372 
0373         const auto itemSet = QSet<Akonadi::Item>() << i1 << i2;
0374 
0375         // WHEN
0376         data.removeContext(t2);
0377 
0378         // THEN
0379         QCOMPARE(data.contexts().size(), 1);
0380         QCOMPARE(data.contexts().at(0), t1);
0381 
0382         QVERIFY(!data.contextItem("ctx-2").isValid());
0383 
0384         QCOMPARE(data.contextItems("ctx-1").size(), 1);
0385         QCOMPARE(data.contextItems("ctx-1").at(0), i1);
0386         QVERIFY(data.contextItems("ctx-2").isEmpty());
0387 
0388         QCOMPARE(listToSet(data.items()), itemSet);
0389 
0390         QVERIFY(data.item(i1.id()).isValid());
0391         const auto item2 = data.item(i2.id());
0392         QVERIFY(item2.isValid());
0393         QVERIFY(!serializer.isContextChild(context2, item2));
0394 
0395         QCOMPARE(contextSpy.size(), 1);
0396         QCOMPARE(contextSpy.takeFirst().at(0).value<Akonadi::Item>().id(), t2.id());
0397 
0398         QCOMPARE(itemSpy.size(), 1);
0399         const auto emittedItem2 = itemSpy.first().at(0).value<Akonadi::Item>();
0400         QCOMPARE(emittedItem2, i2);
0401         QVERIFY(!serializer.isContextChild(context2, emittedItem2));
0402     }
0403 
0404     void shouldCreateItems()
0405     {
0406         // GIVEN
0407         auto data = Testlib::AkonadiFakeData();
0408         QScopedPointer<Akonadi::MonitorInterface> monitor(data.createMonitor());
0409         QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemAdded);
0410 
0411         auto i1 = Akonadi::Item(42);
0412         i1.setPayloadFromData("42");
0413         auto i2 = Akonadi::Item(43);
0414         i2.setPayloadFromData("43");
0415         const auto itemSet = QSet<Akonadi::Item>() << i1 << i2;
0416 
0417         // WHEN
0418         data.createItem(i1);
0419         data.createItem(i2);
0420 
0421         // THEN
0422         QCOMPARE(listToSet(data.items()), itemSet);
0423         QCOMPARE(data.item(i1.id()), i1);
0424         QCOMPARE(data.item(i2.id()), i2);
0425 
0426         QCOMPARE(spy.size(), 2);
0427         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Item>(), i1);
0428         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Item>(), i2);
0429     }
0430 
0431     void shouldModifyItems()
0432     {
0433         // GIVEN
0434         auto data = Testlib::AkonadiFakeData();
0435         QScopedPointer<Akonadi::MonitorInterface> monitor(data.createMonitor());
0436         QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemChanged);
0437         QSignalSpy moveSpy(monitor.data(), &Akonadi::MonitorInterface::itemMoved);
0438 
0439         auto c1 = Akonadi::Collection(42);
0440         c1.setName(QStringLiteral("42"));
0441         data.createCollection(c1);
0442 
0443         auto i1 = Akonadi::Item(42);
0444         i1.setPayloadFromData("42");
0445         i1.setParentCollection(Akonadi::Collection(42));
0446         data.createItem(i1);
0447 
0448         auto i2 = Akonadi::Item(i1.id());
0449         i2.setPayloadFromData("42-bis");
0450         i2.setParentCollection(Akonadi::Collection(42));
0451 
0452         // WHEN
0453         data.modifyItem(i2);
0454 
0455         // THEN
0456         QCOMPARE(data.items().size(), 1);
0457         QCOMPARE(data.item(i1.id()), i2);
0458 
0459         QCOMPARE(spy.size(), 1);
0460         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Item>(), i2);
0461 
0462         QCOMPARE(moveSpy.size(), 0);
0463     }
0464 
0465     void shouldNotLoseParentCollectionOnModifyItem()
0466     {
0467         // GIVEN
0468         auto data = Testlib::AkonadiFakeData();
0469 
0470         auto c1 = Akonadi::Collection(42);
0471         c1.setName(QStringLiteral("42"));
0472         data.createCollection(c1);
0473 
0474         auto i1 = Akonadi::Item(42);
0475         i1.setPayloadFromData("42");
0476         i1.setParentCollection(Akonadi::Collection(42));
0477         data.createItem(i1);
0478 
0479         auto i2 = Akonadi::Item(i1.id());
0480         i2.setPayloadFromData("42-bis");
0481 
0482         // WHEN
0483         data.modifyItem(i2);
0484 
0485         // THEN
0486         QCOMPARE(data.items().size(), 1);
0487         QCOMPARE(data.item(i1.id()), i2);
0488         QCOMPARE(data.item(i1.id()).parentCollection().id(), c1.id());
0489     }
0490 
0491     void shouldListChildItems()
0492     {
0493         // GIVEN
0494         auto data = Testlib::AkonadiFakeData();
0495         auto c1 = Akonadi::Collection(42);
0496         c1.setName(QStringLiteral("42"));
0497         data.createCollection(c1);
0498 
0499         auto i1 = Akonadi::Item(42);
0500         i1.setPayloadFromData("42");
0501         i1.setParentCollection(Akonadi::Collection(42));
0502 
0503         // WHEN
0504         data.createItem(i1);
0505 
0506         // THEN
0507         QCOMPARE(data.childItems(c1.id()).size(), 1);
0508         QCOMPARE(data.childItems(c1.id()).at(0), i1);
0509     }
0510 
0511     void shouldReparentItemsOnModify()
0512     {
0513         // GIVEN
0514         auto data = Testlib::AkonadiFakeData();
0515         QScopedPointer<Akonadi::MonitorInterface> monitor(data.createMonitor());
0516         QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemMoved);
0517 
0518         auto c1 = Akonadi::Collection(42);
0519         c1.setName(QStringLiteral("42"));
0520         data.createCollection(c1);
0521 
0522         auto c2 = Akonadi::Collection(43);
0523         c2.setName(QStringLiteral("43"));
0524         data.createCollection(c2);
0525 
0526         auto i1 = Akonadi::Item(42);
0527         i1.setPayloadFromData("42");
0528         i1.setParentCollection(Akonadi::Collection(42));
0529         data.createItem(i1);
0530 
0531         // WHEN
0532         i1.setPayloadFromData("42-bis");
0533         i1.setParentCollection(Akonadi::Collection(43));
0534         data.modifyItem(i1);
0535 
0536         // THEN
0537         QVERIFY(data.childItems(c1.id()).isEmpty());
0538         QCOMPARE(data.childItems(c2.id()).size(), 1);
0539         QCOMPARE(data.childItems(c2.id()).at(0), i1);
0540 
0541         QCOMPARE(spy.size(), 1);
0542         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Item>(), i1);
0543     }
0544 
0545     void shouldListContextItems()
0546     {
0547         // GIVEN
0548         auto data = Testlib::AkonadiFakeData();
0549         Akonadi::Serializer serializer;
0550 
0551         auto context1 = Domain::Context::Ptr::create();
0552         context1->setName(QStringLiteral("42"));
0553         context1->setProperty("todoUid", "ctx-42");
0554         auto t1 = serializer.createItemFromContext(context1);
0555         data.createContext(t1);
0556 
0557         auto task1 = Domain::Task::Ptr::create();
0558         auto i1 = serializer.createItemFromTask(task1);
0559         i1.setId(1);
0560         serializer.addContextToTask(context1, i1);
0561 
0562         // WHEN
0563         data.createItem(i1);
0564 
0565         // THEN
0566         QCOMPARE(data.contextItems("ctx-42").size(), 1);
0567         QCOMPARE(data.contextItems("ctx-42").at(0), i1);
0568     }
0569 
0570     void shouldRetagItemsOnModify()
0571     {
0572         // GIVEN
0573         auto data = Testlib::AkonadiFakeData();
0574         QScopedPointer<Akonadi::MonitorInterface> monitor(data.createMonitor());
0575         QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemChanged);
0576         Akonadi::Serializer serializer;
0577 
0578         auto context1 = Domain::Context::Ptr::create();
0579         context1->setName(QStringLiteral("42"));
0580         context1->setProperty("todoUid", "ctx-42");
0581         auto t1 = serializer.createItemFromContext(context1);
0582         data.createContext(t1);
0583 
0584         auto context2 = Domain::Context::Ptr::create();
0585         context2->setName(QStringLiteral("43"));
0586         context2->setProperty("todoUid", "ctx-43");
0587         auto t2 = serializer.createItemFromContext(context2);
0588         data.createContext(t2);
0589 
0590         auto task1 = Domain::Task::Ptr::create();
0591         auto i1 = serializer.createItemFromTask(task1);
0592         i1.setId(1);
0593         serializer.addContextToTask(context1, i1);
0594         data.createItem(i1);
0595 
0596         // WHEN
0597         auto i2 = serializer.createItemFromTask(task1);
0598         i2.setId(1);
0599         serializer.addContextToTask(context2, i2);
0600         data.modifyItem(i2);
0601 
0602         // THEN
0603         QVERIFY(data.contextItems("ctx-42").isEmpty());
0604         QCOMPARE(data.contextItems("ctx-43").size(), 1);
0605         QCOMPARE(data.contextItems("ctx-43").at(0), i2);
0606 
0607         QCOMPARE(spy.size(), 1);
0608         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Item>(), i2);
0609     }
0610 
0611     void shouldRemoveItems()
0612     {
0613         // GIVEN
0614         auto data = Testlib::AkonadiFakeData();
0615         QScopedPointer<Akonadi::MonitorInterface> monitor(data.createMonitor());
0616         QSignalSpy spy(monitor.data(), &Akonadi::MonitorInterface::itemRemoved);
0617 
0618         auto c1 = Akonadi::Collection(42);
0619         c1.setName(QStringLiteral("42"));
0620         data.createCollection(c1);
0621 
0622         auto i1 = Akonadi::Item(42);
0623         i1.setPayloadFromData("42");
0624         i1.setParentCollection(Akonadi::Collection(42));
0625         data.createItem(i1);
0626 
0627         // WHEN
0628         data.removeItem(i1);
0629 
0630         // THEN
0631         QVERIFY(data.items().isEmpty());
0632         QVERIFY(!data.item(i1.id()).isValid());
0633         QVERIFY(data.childItems(c1.id()).isEmpty());
0634 
0635         QCOMPARE(spy.size(), 1);
0636         QCOMPARE(spy.takeFirst().at(0).value<Akonadi::Item>().id(), i1.id());
0637     }
0638 };
0639 
0640 ZANSHIN_TEST_MAIN(AkonadiFakeDataTest)
0641 
0642 #include "akonadifakedatatest.moc"