1 /*
2     SPDX-FileCopyrightText: 2009 Constantin Berzan <exit3219@gmail.com>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "localfoldersrequestjobtest.h"
8 
9 #include "collectionpathresolver.h"
10 
11 #include <QSignalSpy>
12 
13 #include <QDebug>
14 
15 #include "../src/specialmailcollectionstesting_p.h"
16 #include "specialcollectionattribute.h"
17 #include "specialcollections.h"
18 #include <Akonadi/AgentInstance>
19 #include <Akonadi/AgentManager>
20 #include <Akonadi/CollectionCreateJob>
21 #include <Akonadi/CollectionDeleteJob>
22 #include <Akonadi/CollectionFetchJob>
23 #include <Akonadi/CollectionModifyJob>
24 #include <QStandardPaths>
25 #include <akonadi/qtest_akonadi.h>
26 #include <control.h>
27 #include <specialmailcollections.h>
28 #include <specialmailcollectionsrequestjob.h>
29 
30 using namespace Akonadi;
31 
initTestCase()32 void LocalFoldersRequestJobTest::initTestCase()
33 {
34     qRegisterMetaType<Akonadi::AgentInstance>();
35 
36     QVERIFY(Control::start());
37     QTest::qWait(1000);
38 
39     SpecialMailCollections *smc = SpecialMailCollections::self();
40     SpecialMailCollectionsTesting *smct = SpecialMailCollectionsTesting::_t_self();
41     Q_ASSERT(smc);
42     Q_ASSERT(smct);
43     Q_UNUSED(smc)
44 
45     // No one has created the default resource.  LF has no folders.
46     QCOMPARE(smct->_t_knownResourceCount(), 0);
47     QCOMPARE(smct->_t_knownFolderCount(), 0);
48 }
49 
testRequestWithNoDefaultResourceExisting()50 void LocalFoldersRequestJobTest::testRequestWithNoDefaultResourceExisting()
51 {
52     SpecialMailCollections *smc = SpecialMailCollections::self();
53     SpecialMailCollectionsTesting *smct = SpecialMailCollectionsTesting::_t_self();
54     Q_ASSERT(smc);
55     Q_ASSERT(smct);
56     QSignalSpy spy(smc, &SpecialMailCollections::collectionsChanged);
57     QSignalSpy defSpy(smc, &SpecialMailCollections::defaultCollectionsChanged);
58     QVERIFY(spy.isValid());
59     QVERIFY(defSpy.isValid());
60 
61     // Initially the default maildir does not exist.
62     QVERIFY(!QFile::exists(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/local-mail")));
63 
64     // Request some default folders.
65     {
66         SpecialMailCollectionsRequestJob *rjob = new SpecialMailCollectionsRequestJob(this);
67         rjob->requestDefaultCollection(SpecialMailCollections::Outbox);
68         rjob->requestDefaultCollection(SpecialMailCollections::Drafts);
69         AKVERIFYEXEC(rjob);
70         QCOMPARE(spy.count(), 1);
71         QCOMPARE(defSpy.count(), 1);
72         QCOMPARE(smct->_t_knownResourceCount(), 1);
73         QCOMPARE(smct->_t_knownFolderCount(), 3); // Outbox, Drafts, and Root.
74         QVERIFY(smc->hasDefaultCollection(SpecialMailCollections::Outbox));
75         QVERIFY(smc->hasDefaultCollection(SpecialMailCollections::Drafts));
76         QVERIFY(smc->hasDefaultCollection(SpecialMailCollections::Root));
77     }
78 
79     // The maildir should exist now.
80     QVERIFY(QFile::exists(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/local-mail")));
81 }
82 
testRequestWithDefaultResourceAlreadyExisting()83 void LocalFoldersRequestJobTest::testRequestWithDefaultResourceAlreadyExisting()
84 {
85     SpecialMailCollections *smc = SpecialMailCollections::self();
86     SpecialMailCollectionsTesting *smct = SpecialMailCollectionsTesting::_t_self();
87     Q_ASSERT(smc);
88     Q_ASSERT(smct);
89     QSignalSpy spy(smc, &SpecialMailCollections::collectionsChanged);
90     QSignalSpy defSpy(smc, &SpecialMailCollections::defaultCollectionsChanged);
91     QVERIFY(spy.isValid());
92     QVERIFY(defSpy.isValid());
93 
94     // Prerequisites (from testRequestWithNoDefaultResourceExisting()).
95     QVERIFY(QFile::exists(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/local-mail")));
96     QVERIFY(!smc->hasDefaultCollection(SpecialMailCollections::Inbox));
97     QVERIFY(smc->hasDefaultCollection(SpecialMailCollections::Outbox));
98     const Collection oldOutbox = smc->defaultCollection(SpecialMailCollections::Outbox);
99 
100     // Request some default folders.
101     {
102         SpecialMailCollectionsRequestJob *rjob = new SpecialMailCollectionsRequestJob(this);
103         rjob->requestDefaultCollection(SpecialMailCollections::Outbox); // Exists previously.
104         rjob->requestDefaultCollection(SpecialMailCollections::Inbox); // Must be created.
105         AKVERIFYEXEC(rjob);
106         QCOMPARE(spy.count(), 1);
107         QCOMPARE(defSpy.count(), 1);
108         QCOMPARE(smct->_t_knownResourceCount(), 1);
109         QCOMPARE(smct->_t_knownFolderCount(), 4); // Inbox, Outbox, Drafts, and Root.
110         QVERIFY(smc->hasDefaultCollection(SpecialMailCollections::Inbox));
111         QVERIFY(smc->hasDefaultCollection(SpecialMailCollections::Outbox));
112         QVERIFY(smc->hasDefaultCollection(SpecialMailCollections::Drafts));
113         QVERIFY(smc->hasDefaultCollection(SpecialMailCollections::Root));
114     }
115 
116     // This should be untouched.
117     QCOMPARE(smc->defaultCollection(SpecialMailCollections::Outbox), oldOutbox);
118 }
119 
testMixedRequest()120 void LocalFoldersRequestJobTest::testMixedRequest()
121 {
122     SpecialMailCollections *smc = SpecialMailCollections::self();
123     SpecialMailCollectionsTesting *smct = SpecialMailCollectionsTesting::_t_self();
124     Q_ASSERT(smc);
125     Q_ASSERT(smct);
126     QSignalSpy spy(smc, &SpecialMailCollections::collectionsChanged);
127     QSignalSpy defSpy(smc, &SpecialMailCollections::defaultCollectionsChanged);
128     QVERIFY(spy.isValid());
129     QVERIFY(defSpy.isValid());
130 
131     // Get our knut collection.
132     Collection res1;
133     {
134         CollectionPathResolver *resolver = new CollectionPathResolver(QStringLiteral("res1"), this);
135         QVERIFY(resolver->exec());
136         res1 = Collection(resolver->collection());
137         CollectionFetchJob *fjob = new CollectionFetchJob(res1, CollectionFetchJob::Base, this);
138         AKVERIFYEXEC(fjob);
139         Q_ASSERT(fjob->collections().count() == 1);
140         res1 = fjob->collections().first();
141         QVERIFY(res1.isValid());
142         QVERIFY(!res1.resource().isEmpty());
143     }
144 
145     // Create a LocalFolder in the knut resource.
146     Collection knutOutbox;
147     {
148         knutOutbox.setName(QLatin1String("my_outbox"));
149         knutOutbox.setParentCollection(res1);
150         qDebug() << res1;
151         knutOutbox.addAttribute(new SpecialCollectionAttribute("outbox"));
152         CollectionCreateJob *cjob = new CollectionCreateJob(knutOutbox, this);
153         AKVERIFYEXEC(cjob);
154         knutOutbox = cjob->collection();
155     }
156 
157     // Prerequisites (from the above two functions).
158     QVERIFY(QFile::exists(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + QLatin1String("/local-mail")));
159     QVERIFY(!smc->hasDefaultCollection(SpecialMailCollections::SentMail));
160     QVERIFY(smc->hasDefaultCollection(SpecialMailCollections::Outbox));
161     const Collection oldOutbox = smc->defaultCollection(SpecialMailCollections::Outbox);
162 
163     // Request some folders, both in our default resource and in the knut resource.
164     {
165         SpecialMailCollectionsRequestJob *rjob = new SpecialMailCollectionsRequestJob(this);
166         rjob->requestDefaultCollection(SpecialMailCollections::Outbox); // Exists previously.
167         rjob->requestDefaultCollection(SpecialMailCollections::SentMail); // Must be created.
168         rjob->requestCollection(SpecialMailCollections::Outbox,
169                                 AgentManager::self()->instance(res1.resource())); // Exists previously, but unregistered with LF.
170         rjob->requestCollection(SpecialMailCollections::SentMail, AgentManager::self()->instance(res1.resource())); // Must be created.
171         AKVERIFYEXEC(rjob);
172         QCOMPARE(spy.count(), 2); // Default resource and knut resource.
173         QCOMPARE(defSpy.count(), 1);
174         QCOMPARE(smct->_t_knownResourceCount(), 2);
175         QVERIFY(smc->hasDefaultCollection(SpecialMailCollections::Outbox));
176         QVERIFY(smc->hasDefaultCollection(SpecialMailCollections::SentMail));
177         QVERIFY(smc->hasCollection(SpecialMailCollections::Outbox, AgentManager::self()->instance(res1.resource())));
178         QVERIFY(smc->hasCollection(SpecialMailCollections::SentMail, AgentManager::self()->instance(res1.resource())));
179     }
180 
181     // These should be untouched.
182     QCOMPARE(smc->defaultCollection(SpecialMailCollections::Outbox), oldOutbox);
183     QCOMPARE(smc->collection(SpecialMailCollections::Outbox, AgentManager::self()->instance(res1.resource())), knutOutbox);
184 }
185 
186 QTEST_AKONADIMAIN(LocalFoldersRequestJobTest)
187