/* * Copyright 2014-2015 Canonical Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ // unity-api #include #include #include "launcheritem.h" #include "launchermodelas.h" #include "AccountsServiceDBusAdaptor.h" #include #include #include #include #include class LauncherModelASTest : public QObject { Q_OBJECT private: LauncherModel *launcherModel; QStringList users; QHash> mockProperties; private Q_SLOTS: void initTestCase() { qDBusRegisterMetaType>(); } void init() { // Prepare some fake list QList list; QVariantMap item; item.insert("id", "appId1"); item.insert("name", "Item 1"); item.insert("icon", "fake.svg"); item.insert("count", 0); item.insert("progress", 0); item.insert("countVisible", false); item.insert("pinned", true); list.append(item); item["id"] = "appId2"; item["name"] = "Item 2"; list.append(item); setASLauncherItems("user1", list); } void cleanup() { Q_FOREACH(QString user, users) { QDBusInterface accountsInterface(QStringLiteral("org.freedesktop.Accounts"), QStringLiteral("/org/freedesktop/Accounts"), QStringLiteral("org.freedesktop.Accounts")); QDBusReply removeReply = accountsInterface.call(QStringLiteral("RemoveUser"), user); QVERIFY(removeReply.isValid()); QCOMPARE(removeReply.value(), true); } users.clear(); mockProperties.clear(); } void addASUser(const QString &user) { QDBusInterface accountsInterface(QStringLiteral("org.freedesktop.Accounts"), QStringLiteral("/org/freedesktop/Accounts"), QStringLiteral("org.freedesktop.Accounts")); QDBusReply addReply = accountsInterface.call(QStringLiteral("AddUser"), user); QVERIFY(addReply.isValid()); QCOMPARE(addReply.value(), true); users << user; mockProperties[user] = QList(); } void setASLauncherItems(const QString &user, const QList &items) { if (!users.contains(user)) { addASUser(user); } QDBusInterface userInterface(QStringLiteral("org.freedesktop.Accounts"), QString("/%1").arg(user), QStringLiteral("org.freedesktop.DBus.Properties")); QVariant wrapped = QVariant::fromValue(QDBusVariant(QVariant::fromValue(items))); QDBusReply setReply = userInterface.call(QStringLiteral("Set"), QStringLiteral("com.canonical.unity.AccountsService"), QStringLiteral("LauncherItems"), wrapped); QVERIFY(setReply.isValid()); // Record what we set for comparison's sake mockProperties[user] = items; } void setUser(LauncherModel *model, const QString &user) { QSignalSpy spy(model, &QAbstractItemModel::rowsInserted); model->setUser(user); QTRY_COMPARE(spy.count(), mockProperties[user].count()); } bool isInSync(LauncherModel *model, const QList &properties) { QList list; // Strip unpinned if onlyPinned is set Q_FOREACH (const QVariantMap &map, properties) { if (!model->onlyPinned() || map.value("pinned").toBool()) { list << map; } } bool inSync = model->rowCount() == list.count(); for (int i = 0; inSync && i < model->rowCount(); i++) { inSync &= model->get(i)->appId() == list.at(i).value("id").toString(); inSync &= model->get(i)->name() == list.at(i).value("name").toString(); inSync &= model->get(i)->icon() == list.at(i).value("icon").toString(); inSync &= model->get(i)->count() == list.at(i).value("count").toInt(); inSync &= model->get(i)->progress() == list.at(i).value("progress").toInt(); inSync &= model->get(i)->countVisible() == list.at(i).value("countVisible").toBool(); } return inSync; } void testLoadASOnStartup() { // Load up the model LauncherModel* model = new LauncherModel(this); // We didn't set a user yet. model should be empty QCOMPARE(model->rowCount(), 0); setUser(model, "user1"); QCOMPARE(isInSync(model, mockProperties["user1"]), true); model->deleteLater(); } void testASChangedUpdatesModel_data() { QTest::addColumn("modelUser"); QTest::addColumn("changedUser"); QTest::addColumn("inSync"); QTest::newRow("this user changed") << "user1" << "user1" << true; QTest::newRow("other user changed") << "user1" << "user2" << false; } void testASChangedUpdatesModel() { QFETCH(QString, modelUser); QFETCH(QString, changedUser); QFETCH(bool, inSync); LauncherModel* model = new LauncherModel(this); setUser(model, modelUser); int oldCount = mockProperties[modelUser].count(); QCOMPARE(model->rowCount(), oldCount); QList newList; QVariantMap newEntry; newEntry.insert("id", "newappId"); newEntry.insert("name", "New app"); newEntry.insert("icon", "some-icon.svg"); newEntry.insert("count", 0); newEntry.insert("progress", 42); newEntry.insert("countVisible", false); newEntry.insert("pinned", true); newList.append(newEntry); setASLauncherItems(changedUser, newList); QTRY_COMPARE(isInSync(model, mockProperties[modelUser]), true); QTRY_COMPARE(isInSync(model, mockProperties[changedUser]), inSync); model->deleteLater(); } void testUpdateCount() { LauncherModel* model = new LauncherModel(this); setUser(model, "user1"); QCOMPARE(model->get(0)->countVisible(), false); QCOMPARE(model->get(0)->count(), 0); QList newList = mockProperties["user1"]; QVariantMap entry = newList.at(0); entry["countVisible"] = true; entry["count"] = 55; newList[0] = entry; setASLauncherItems("user1", newList); QTRY_COMPARE(isInSync(model, mockProperties["user1"]), true); model->deleteLater(); } void testOnlyPinned() { LauncherModel *model = new LauncherModel(this); setUser(model, "user1"); model->setOnlyPinned(true); QTRY_COMPARE(isInSync(model, mockProperties["user1"]), true); // Let's unpin one item QList newList = mockProperties["user1"]; QVariantMap entry = newList.at(0); entry["pinned"] = false; newList[0] = entry; setASLauncherItems("user1", newList); QTRY_COMPARE(isInSync(model, mockProperties["user1"]), true); // Now toggle onlyPinned and make sure the model keeps up model->setOnlyPinned(false); QTRY_COMPARE(isInSync(model, mockProperties["user1"]), true); model->setOnlyPinned(true); QTRY_COMPARE(isInSync(model, mockProperties["user1"]), true); } }; QTEST_GUILESS_MAIN(LauncherModelASTest) #include "launchermodelastest.moc"