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