1 /***************************************************************************
2      testqgsapppython.cpp
3      --------------------
4     Date                 : May 2016
5     Copyright            : (C) 2016 by Nyall Dawson
6     Email                : nyall dot dawson at gmail dot com
7  ***************************************************************************
8  *                                                                         *
9  *   This program is free software; you can redistribute it and/or modify  *
10  *   it under the terms of the GNU General Public License as published by  *
11  *   the Free Software Foundation; either version 2 of the License, or     *
12  *   (at your option) any later version.                                   *
13  *                                                                         *
14  ***************************************************************************/
15 #include <QApplication>
16 #include <QObject>
17 #include <QSplashScreen>
18 #include <QString>
19 #include <QStringList>
20 #include "qgstest.h"
21 
22 #include <qgisapp.h>
23 #include <qgsapplication.h>
24 #include "qgspythonutils.h"
25 
26 /**
27  * \ingroup UnitTests
28  * This is a unit test for the QgisApp python support.
29  */
30 class TestQgisAppPython : public QObject
31 {
32     Q_OBJECT
33 
34   public:
35     TestQgisAppPython();
36 
37   private slots:
38     void initTestCase();// will be called before the first testfunction is executed.
39     void cleanupTestCase();// will be called after the last testfunction was executed.
init()40     void init() {} // will be called before each testfunction is executed.
cleanup()41     void cleanup() {} // will be called after every testfunction.
42 
43     void hasPython();
44     void plugins();
45     void pythonPlugin();
46     void pluginMetadata();
47     void runString();
48     void evalString();
49 
50   private:
51     QgisApp *mQgisApp = nullptr;
52     QString mTestDataDir;
53 };
54 
55 TestQgisAppPython::TestQgisAppPython() = default;
56 
57 //runs before all tests
initTestCase()58 void TestQgisAppPython::initTestCase()
59 {
60   qputenv( "QGIS_PLUGINPATH", QByteArray( TEST_DATA_DIR ) + "/test_plugin_path" );
61 
62   // Set up the QgsSettings environment
63   QCoreApplication::setOrganizationName( QStringLiteral( "QGIS" ) );
64   QCoreApplication::setOrganizationDomain( QStringLiteral( "qgis.org" ) );
65   QCoreApplication::setApplicationName( QStringLiteral( "QGIS-TEST" ) );
66 
67   qDebug() << "TestQgisAppClipboard::initTestCase()";
68   // init QGIS's paths - true means that all path will be inited from prefix
69   QgsApplication::init();
70   QgsApplication::initQgis();
71   mTestDataDir = QStringLiteral( TEST_DATA_DIR ) + '/'; //defined in CmakeLists.txt
72   mQgisApp = new QgisApp();
73   mQgisApp->loadPythonSupport();
74 }
75 
76 //runs after all tests
cleanupTestCase()77 void TestQgisAppPython::cleanupTestCase()
78 {
79   QgsApplication::exitQgis();
80 }
81 
hasPython()82 void TestQgisAppPython::hasPython()
83 {
84   QVERIFY( mQgisApp->mPythonUtils->isEnabled() );
85 }
86 
plugins()87 void TestQgisAppPython::plugins()
88 {
89   QVERIFY( mQgisApp->mPythonUtils->pluginList().contains( QStringLiteral( "PluginPathTest" ) ) );
90   QVERIFY( !mQgisApp->mPythonUtils->isPluginLoaded( QStringLiteral( "PluginPathTest" ) ) );
91   QVERIFY( mQgisApp->mPythonUtils->listActivePlugins().isEmpty() );
92   // load plugin
93   QVERIFY( !mQgisApp->mPythonUtils->unloadPlugin( QStringLiteral( "PluginPathTest" ) ) );
94   QVERIFY( mQgisApp->mPythonUtils->loadPlugin( QStringLiteral( "PluginPathTest" ) ) );
95   QVERIFY( !mQgisApp->mPythonUtils->isPluginLoaded( QStringLiteral( "PluginPathTest" ) ) );
96   QVERIFY( mQgisApp->mPythonUtils->startPlugin( QStringLiteral( "PluginPathTest" ) ) );
97   QVERIFY( mQgisApp->mPythonUtils->isPluginLoaded( QStringLiteral( "PluginPathTest" ) ) );
98   QCOMPARE( mQgisApp->mPythonUtils->listActivePlugins(), QStringList() << QStringLiteral( "PluginPathTest" ) );
99 }
100 
pythonPlugin()101 void TestQgisAppPython::pythonPlugin()
102 {
103   QVERIFY( mQgisApp->mPythonUtils->pluginList().contains( QStringLiteral( "ProcessingPluginTest" ) ) );
104   QVERIFY( mQgisApp->mPythonUtils->loadPlugin( QStringLiteral( "ProcessingPluginTest" ) ) );
105   QVERIFY( mQgisApp->mPythonUtils->startProcessingPlugin( QStringLiteral( "ProcessingPluginTest" ) ) );
106   QVERIFY( !mQgisApp->mPythonUtils->startProcessingPlugin( QStringLiteral( "PluginPathTest" ) ) );
107 }
108 
pluginMetadata()109 void TestQgisAppPython::pluginMetadata()
110 {
111   QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "not a plugin" ), QStringLiteral( "name" ) ), QStringLiteral( "__error__" ) );
112   QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "invalid" ) ), QStringLiteral( "__error__" ) );
113   QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "name" ) ), QStringLiteral( "plugin path test" ) );
114   QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "qgisMinimumVersion" ) ), QStringLiteral( "2.0" ) );
115   QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "description" ) ), QStringLiteral( "desc" ) );
116   QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "version" ) ), QStringLiteral( "0.1" ) );
117   QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "author" ) ), QStringLiteral( "HM/Oslandia" ) );
118   QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "email" ) ), QStringLiteral( "hugo.mercier@oslandia.com" ) );
119   QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "PluginPathTest" ), QStringLiteral( "hasProcessingProvider" ) ), QStringLiteral( "__error__" ) );
120   QVERIFY( !mQgisApp->mPythonUtils->pluginHasProcessingProvider( QStringLiteral( "x" ) ) );
121   QVERIFY( !mQgisApp->mPythonUtils->pluginHasProcessingProvider( QStringLiteral( "PluginPathTest" ) ) );
122 
123   QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "ProcessingPluginTest" ), QStringLiteral( "name" ) ), QStringLiteral( "processing plugin test" ) );
124   QCOMPARE( mQgisApp->mPythonUtils->getPluginMetadata( QStringLiteral( "ProcessingPluginTest" ), QStringLiteral( "hasProcessingProvider" ) ), QStringLiteral( "yes" ) );
125   QVERIFY( mQgisApp->mPythonUtils->pluginHasProcessingProvider( QStringLiteral( "ProcessingPluginTest" ) ) );
126 }
127 
runString()128 void TestQgisAppPython::runString()
129 {
130   QVERIFY( mQgisApp->mPythonUtils->runString( "a=1+1" ) );
131   QVERIFY( !mQgisApp->mPythonUtils->runString( "x" ) );
132   QVERIFY( !mQgisApp->mPythonUtils->runString( "" ) );
133 }
134 
evalString()135 void TestQgisAppPython::evalString()
136 {
137   QString result;
138   //good string
139   QVERIFY( mQgisApp->mPythonUtils->evalString( "1+1", result ) );
140   QCOMPARE( result, QString( "2" ) );
141 
142   //bad string
143   QVERIFY( !mQgisApp->mPythonUtils->evalString( "1+", result ) );
144 }
145 
146 
147 QGSTEST_MAIN( TestQgisAppPython )
148 #include "testqgisapppython.moc"
149