You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.6 KiB
119 lines
3.6 KiB
/* |
|
SPDX-FileCopyrightText: 2013 Christian Mollekopf <mollekopf@kolabsys.com> |
|
SPDX-FileCopyrightText: 2017 David Faure <faure@kde.org> |
|
|
|
SPDX-License-Identifier: LGPL-2.0-or-later |
|
*/ |
|
|
|
#include <QObject> |
|
|
|
#include <KConfigGroup> |
|
#include <KSharedConfig> |
|
|
|
#include <changerecorder.h> |
|
#include <control.h> |
|
#include <entitytreemodel.h> |
|
#include <favoritecollectionorderproxymodel.h> |
|
#include <favoritecollectionsmodel.h> |
|
#include <qtest_akonadi.h> |
|
|
|
using namespace Akonadi; |
|
using namespace MailCommon; |
|
|
|
class FavoriteProxyTest : public QObject |
|
{ |
|
Q_OBJECT |
|
|
|
private Q_SLOTS: |
|
void initTestCase(); |
|
void testReordering(); |
|
|
|
private: |
|
EntityTreeModel *createETM(); |
|
}; |
|
|
|
void FavoriteProxyTest::initTestCase() |
|
{ |
|
AkonadiTest::checkTestIsIsolated(); |
|
Akonadi::Control::start(); |
|
AkonadiTest::setAllResourcesOffline(); |
|
} |
|
|
|
static QModelIndex getIndex(const QString &string, EntityTreeModel *model) |
|
{ |
|
QModelIndexList list = model->match(model->index(0, 0), Qt::DisplayRole, string, 1, Qt::MatchRecursive); |
|
if (list.isEmpty()) { |
|
return QModelIndex(); |
|
} |
|
return list.first(); |
|
} |
|
|
|
/** |
|
* Since we have no sensible way to figure out if the model is fully populated, |
|
* we use the brute force approach. |
|
*/ |
|
static bool waitForPopulation(const QModelIndex &idx, EntityTreeModel *model, int count) |
|
{ |
|
for (int i = 0; i < 500; i++) { |
|
if (model->rowCount(idx) >= count) { |
|
return true; |
|
} |
|
QTest::qWait(10); |
|
} |
|
return false; |
|
} |
|
|
|
EntityTreeModel *FavoriteProxyTest::createETM() |
|
{ |
|
auto changeRecorder = new ChangeRecorder(this); |
|
changeRecorder->setCollectionMonitored(Collection::root()); |
|
auto model = new EntityTreeModel(changeRecorder, this); |
|
model->setItemPopulationStrategy(Akonadi::EntityTreeModel::LazyPopulation); |
|
return model; |
|
} |
|
|
|
static const int numberOfRootCollections = 4; |
|
|
|
void FavoriteProxyTest::testReordering() |
|
{ |
|
// GIVEN an ETM, a favorite proxy, and an EntityOrderProxyModel on top |
|
EntityTreeModel *model = createETM(); |
|
QVERIFY(waitForPopulation(QModelIndex(), model, numberOfRootCollections)); |
|
|
|
QList<Collection::Id> collectionIds; |
|
QStringList labels; |
|
QStringList order; |
|
for (const QString &folderName : {QStringLiteral("res2"), QStringLiteral("res3")}) { |
|
const QModelIndex index = getIndex(folderName, model); |
|
QVERIFY(index.isValid()); |
|
const Akonadi::Collection favoriteCollection = index.data(EntityTreeModel::CollectionRole).value<Akonadi::Collection>(); |
|
QVERIFY(favoriteCollection.isValid()); |
|
collectionIds.push_back(favoriteCollection.id()); |
|
order.push_back(QLatin1Char('c') + QString::number(favoriteCollection.id())); |
|
labels << folderName; |
|
} |
|
|
|
KConfigGroup configGroup(KSharedConfig::openConfig(), "favoritecollectionsmodeltest"); |
|
configGroup.writeEntry("FavoriteCollectionIds", collectionIds); |
|
configGroup.writeEntry("FavoriteCollectionLabels", labels); |
|
configGroup.writeEntry("0", order); |
|
|
|
auto favoriteModel = new FavoriteCollectionsModel(model, configGroup, this); |
|
QTRY_COMPARE(favoriteModel->rowCount(), 2); |
|
|
|
auto orderProxy = new FavoriteCollectionOrderProxyModel(this); |
|
orderProxy->setOrderConfig(configGroup); |
|
orderProxy->setSourceModel(favoriteModel); |
|
orderProxy->sort(0, Qt::AscendingOrder); |
|
|
|
QCOMPARE(orderProxy->rowCount(), 2); |
|
|
|
const QModelIndex firstRowIndex = orderProxy->index(0, 0); |
|
QVERIFY(firstRowIndex.isValid()); |
|
QCOMPARE(firstRowIndex.data().toString(), QStringLiteral("res2")); |
|
QVERIFY((orderProxy->flags(firstRowIndex) & Qt::ItemIsDropEnabled) == 0); |
|
} |
|
|
|
#include "favoritestest.moc" |
|
|
|
QTEST_AKONADIMAIN(FavoriteProxyTest)
|
|
|