2022-03-05 22:41:29 +05:00

187 lines
7.2 KiB
C++

/*
SPDX-FileCopyrightText: 2020 Konrad Materka <materka@gmail.com>
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
*/
#include <QPointer>
#include <QtTest>
#include <Plasma/Applet>
#include <Plasma/DataEngine>
#include <Plasma/PluginLoader>
#include "../plasmoidregistry.h"
#include "../systemtraymodel.h"
#include "../systemtraysettings.h"
static const QString DEVICENOTIFIER_ID = QStringLiteral("org.kde.plasma.devicenotifier.test");
static const QString MEDIACONROLLER_ID = QStringLiteral("org.kde.plasma.mediacontroller.test");
class SystemTrayModelTest : public QObject
{
Q_OBJECT
private Q_SLOTS:
void init();
void testPlasmoidModel();
};
void SystemTrayModelTest::init()
{
QLocale::setDefault(QLocale("en_US"));
qunsetenv("LANGUAGE");
qunsetenv("LC_ALL");
qunsetenv("LC_MESSAGES");
qunsetenv("LANG");
}
class MockedPlasmoidRegistry : public PlasmoidRegistry
{
public:
MockedPlasmoidRegistry(QPointer<SystemTraySettings> settings)
: PlasmoidRegistry(settings)
{
}
QMap<QString, KPluginMetaData> systemTrayApplets() override
{
return m_systemTrayApplets;
}
QMap<QString, KPluginMetaData> m_systemTrayApplets;
};
class MockedSystemTraySettings : public SystemTraySettings
{
public:
MockedSystemTraySettings()
: SystemTraySettings(nullptr)
{
}
bool isKnownPlugin(const QString &pluginId) override
{
return m_knownPlugins.contains(pluginId);
}
const QStringList knownPlugins() const override
{
return m_knownPlugins;
}
void addKnownPlugin(const QString &pluginId) override
{
m_knownPlugins << pluginId;
}
void removeKnownPlugin(const QString &pluginId) override
{
m_knownPlugins.removeAll(pluginId);
}
bool isEnabledPlugin(const QString &pluginId) const override
{
return m_enabledPlugins.contains(pluginId);
}
const QStringList enabledPlugins() const override
{
return m_enabledPlugins;
}
void addEnabledPlugin(const QString &pluginId) override
{
m_enabledPlugins << pluginId;
}
void removeEnabledPlugin(const QString &pluginId) override
{
m_enabledPlugins.removeAll(pluginId);
}
bool isShowAllItems() const override
{
return m_showAllItems;
}
const QStringList shownItems() const override
{
return m_shownItems;
}
const QStringList hiddenItems() const override
{
return m_hiddenItems;
};
QStringList m_knownPlugins;
QStringList m_enabledPlugins;
QStringList m_shownItems;
QStringList m_hiddenItems;
bool m_showAllItems = false;
};
void SystemTrayModelTest::testPlasmoidModel()
{
// given: mocked PlasmoidRegistry with sample plugin meta data
MockedSystemTraySettings *settings = new MockedSystemTraySettings();
MockedPlasmoidRegistry *plasmoidRegistry = new MockedPlasmoidRegistry(settings);
plasmoidRegistry->m_systemTrayApplets.insert(DEVICENOTIFIER_ID, KPluginMetaData(QFINDTESTDATA("data/devicenotifier/metadata.desktop")));
plasmoidRegistry->m_systemTrayApplets.insert(MEDIACONROLLER_ID, KPluginMetaData(QFINDTESTDATA("data/mediacontroller/metadata.desktop")));
// when: model is initialized
PlasmoidModel *model = new PlasmoidModel(settings, plasmoidRegistry);
// expect: passes consistency tests
new QAbstractItemModelTester(model, QAbstractItemModelTester::FailureReportingMode::Fatal);
// and expect: correct model size
QCOMPARE(model->rowCount(), 2);
QCOMPARE(model->roleNames().size(), 10);
// and expect: correct data returned
QModelIndex idx = model->index(0, 0);
QCOMPARE(model->data(idx, Qt::DisplayRole).toString(), "Device Notifier");
QVERIFY(model->data(idx, Qt::DecorationRole).isValid());
QCOMPARE(model->data(idx, static_cast<int>(BaseModel::BaseRole::ItemType)).toString(), "Plasmoid");
QCOMPARE(model->data(idx, static_cast<int>(BaseModel::BaseRole::ItemId)).toString(), DEVICENOTIFIER_ID);
QVERIFY(!model->data(idx, static_cast<int>(BaseModel::BaseRole::CanRender)).toBool());
QCOMPARE(model->data(idx, static_cast<int>(BaseModel::BaseRole::Category)).toString(), "Hardware");
QCOMPARE(model->data(idx, static_cast<int>(BaseModel::BaseRole::Status)), QVariant(Plasma::Types::ItemStatus::UnknownStatus));
QCOMPARE(model->data(idx, static_cast<int>(BaseModel::BaseRole::EffectiveStatus)), QVariant(Plasma::Types::ItemStatus::HiddenStatus));
QVERIFY(!model->data(idx, static_cast<int>(PlasmoidModel::Role::HasApplet)).toBool());
idx = model->index(1, 0);
QCOMPARE(model->data(idx, Qt::DisplayRole).toString(), "Media Player (Automatic load)");
QVERIFY(model->data(idx, Qt::DecorationRole).isValid());
QCOMPARE(model->data(idx, static_cast<int>(BaseModel::BaseRole::ItemType)).toString(), "Plasmoid");
QCOMPARE(model->data(idx, static_cast<int>(BaseModel::BaseRole::ItemId)).toString(), MEDIACONROLLER_ID);
QVERIFY(!model->data(idx, static_cast<int>(BaseModel::BaseRole::CanRender)).toBool());
QCOMPARE(model->data(idx, static_cast<int>(BaseModel::BaseRole::Category)).toString(), "ApplicationStatus");
QCOMPARE(model->data(idx, static_cast<int>(BaseModel::BaseRole::Status)), QVariant(Plasma::Types::ItemStatus::UnknownStatus));
QCOMPARE(model->data(idx, static_cast<int>(BaseModel::BaseRole::EffectiveStatus)), QVariant(Plasma::Types::ItemStatus::HiddenStatus));
QVERIFY(!model->data(idx, static_cast<int>(PlasmoidModel::Role::HasApplet)).toBool());
// when: language is changed
QLocale::setDefault(QLocale("pl_PL"));
qputenv("LANG", "pl_PL.UTF-8");
qputenv("LC_MESSAGES", "pl_PL.UTF-8");
// then expect: translated data returned
QCOMPARE(model->data(model->index(0, 0), Qt::DisplayRole).toString(), "Powiadomienia o urz\u0105dzeniach");
// when: applet added
model->addApplet(new Plasma::Applet(nullptr, plasmoidRegistry->m_systemTrayApplets.value(MEDIACONROLLER_ID), QVariantList{}));
// then: applet can be rendered
QVERIFY(model->data(idx, static_cast<int>(BaseModel::BaseRole::CanRender)).toBool());
QVERIFY(model->data(idx, static_cast<int>(PlasmoidModel::Role::HasApplet)).toBool());
QCOMPARE(model->data(idx, static_cast<int>(BaseModel::BaseRole::EffectiveStatus)), QVariant(Plasma::Types::ItemStatus::ActiveStatus));
// and when: applet removed
model->removeApplet(new Plasma::Applet(nullptr, plasmoidRegistry->m_systemTrayApplets.value(MEDIACONROLLER_ID), QVariantList{}));
// then: applet cannot be rendered anymore
QVERIFY(!model->data(idx, static_cast<int>(BaseModel::BaseRole::CanRender)).toBool());
QVERIFY(!model->data(idx, static_cast<int>(PlasmoidModel::Role::HasApplet)).toBool());
// and when: invalid index
idx = model->index(4, 0);
// then: empty value
QVERIFY(model->data(idx, static_cast<int>(BaseModel::BaseRole::ItemType)).isNull());
QVERIFY(!model->data(idx, static_cast<int>(BaseModel::BaseRole::ItemType)).isValid());
idx = model->index(1, 1);
QVERIFY(model->data(idx, static_cast<int>(BaseModel::BaseRole::ItemType)).isNull());
QVERIFY(!model->data(idx, static_cast<int>(BaseModel::BaseRole::ItemType)).isValid());
delete model;
}
QTEST_MAIN(SystemTrayModelTest)
#include "systemtraymodeltest.moc"