1 /*
2 This file is part of the KDE Frameworks
3 SPDX-FileCopyrightText: 2020 David Faure <faure@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.0-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
6 */
7
8 #include <KCModuleInfo>
9 #include <KCMultiDialog>
10 #include <KPluginInfo>
11 #include <KPluginMetaData>
12 #include <QObject>
13 #include <QTest>
14
15 class KCModuleInfoTest : public QObject
16 {
17 Q_OBJECT
18
19 private Q_SLOTS:
20 void testExternalApp();
21 void testFakeKCM();
22 void testDesktopFileKCM();
23 void testInvalidKCM();
24 };
25
26 #ifndef Q_OS_WIN
initLocale()27 void initLocale()
28 {
29 setenv("LC_ALL", "en_US.utf-8", 1);
30 }
31
Q_CONSTRUCTOR_FUNCTION(initLocale)32 Q_CONSTRUCTOR_FUNCTION(initLocale)
33 #endif
34
35 void KCModuleInfoTest::testExternalApp()
36 {
37 const QString yast = QFINDTESTDATA("YaST-systemsettings.desktop");
38 QVERIFY(!yast.isEmpty());
39 KCModuleInfo info(yast);
40 QVERIFY(info.service());
41 QVERIFY(info.isValid());
42 }
43
testFakeKCM()44 void KCModuleInfoTest::testFakeKCM()
45 {
46 // Similar to kontact's code
47 // This is the case of loading a plugin, and then asking it for its kcmServices()
48 // If there are none, Dialog::addPluginInfos still creates a fake KCM, so the plugin can be enabled/disabled.
49 const QVector<KPluginMetaData> pluginMetaDatas = KPluginMetaData::findPlugins(QStringLiteral("testplugins"), [](const KPluginMetaData &) {
50 return true;
51 });
52 const QList<KPluginInfo> pluginInfos = KPluginInfo::fromMetaData(pluginMetaDatas);
53 QVERIFY(pluginInfos.count() > 0);
54 KPluginInfo pluginInfo = pluginInfos.at(0);
55 QVERIFY(pluginInfo.isValid());
56
57 // WHEN
58 KCModuleInfo info(pluginInfo); // like Dialog::addPluginInfos does
59
60 // THEN
61 QVERIFY(info.isValid());
62 QCOMPARE(info.pluginInfo().name(), QStringLiteral("Test"));
63
64 #ifdef Q_OS_WIN
65 QCOMPARE(QFileInfo(info.library()).fileName(), QStringLiteral("jsonplugin.dll"));
66 QCOMPARE(QFileInfo(info.fileName()).fileName(), QStringLiteral("jsonplugin.dll"));
67 #else
68 QCOMPARE(QFileInfo(info.library()).fileName(), QStringLiteral("jsonplugin.so"));
69 QCOMPARE(QFileInfo(info.fileName()).fileName(), QStringLiteral("jsonplugin.so"));
70 #endif
71
72 QCOMPARE(info.icon(), QStringLiteral("view-pim-mail"));
73 QCOMPARE(info.comment(), QStringLiteral("Test plugin"));
74 QCOMPARE(info.docPath(), QStringLiteral("doc/path"));
75 QVERIFY(!info.service());
76 }
77
testDesktopFileKCM()78 void KCModuleInfoTest::testDesktopFileKCM()
79 {
80 const QString desktopFile = QFINDTESTDATA("desktopfilekcm/kcmtest.desktop");
81 QVERIFY(!desktopFile.isEmpty());
82
83 // WHEN
84 KCModuleInfo info(desktopFile);
85
86 // THEN
87 QVERIFY(info.isValid());
88 QVERIFY(info.service());
89 QVERIFY(!info.pluginInfo().isValid());
90 QCOMPARE(QFileInfo(info.library()).fileName(), QStringLiteral("kcm_kded"));
91 QCOMPARE(QFileInfo(info.fileName()).fileName(), QStringLiteral("kcmtest.desktop"));
92 QCOMPARE(info.icon(), QStringLiteral("preferences-system-session-services"));
93 QCOMPARE(info.comment(), QStringLiteral("Configure background services"));
94 QCOMPARE(info.docPath(), QStringLiteral("kcontrol/kded/index.html"));
95
96 #if KCMUTILS_BUILD_DEPRECATED_SINCE(5, 85)
97 // WHEN actually loading the module
98 KCMultiDialog dlg;
99 QVERIFY(dlg.addModule(info));
100 #endif
101 }
102
testInvalidKCM()103 void KCModuleInfoTest::testInvalidKCM()
104 {
105 KCModuleInfo info(QStringLiteral("doest_not_exist.desktop"));
106 QVERIFY(!info.isValid());
107 QVERIFY(!info.service());
108 }
109
110 QTEST_MAIN(KCModuleInfoTest)
111 #include "kcmoduleinfotest.moc"
112