Skip to content

Commit

Permalink
Check that plugins can be loaded before enabling them in qgis_process
Browse files Browse the repository at this point in the history
And add tests for plugin enable/disable commands

Fixes #54915
  • Loading branch information
nyalldawson committed Jan 19, 2024
1 parent 5c73bb6 commit a0a6c2d
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 2 deletions.
13 changes: 11 additions & 2 deletions src/process/qgsprocess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -713,8 +713,17 @@ int QgsProcessingExec::enablePlugin( const QString &name, bool enabled )
QgsSettings settings;
if ( enabled )
{
mPythonUtils->loadPlugin( name );
mPythonUtils->startProcessingPlugin( name );
if ( !mPythonUtils->loadPlugin( name ) )
{
std::cerr << "error loading plugin: " << name.toLocal8Bit().constData() << "\n\n";
return 1;
}
else if ( !mPythonUtils->startProcessingPlugin( name ) )
{
std::cerr << "error starting plugin: " << name.toLocal8Bit().constData() << "\n\n";
return 1;
}

const QString pluginName = mPythonUtils->getPluginMetadata( name, QStringLiteral( "name" ) );
settings.setValue( "/PythonPlugins/" + name, true );

Expand Down
58 changes: 58 additions & 0 deletions tests/src/python/test_qgsprocessexecutable_pt1.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,64 @@ def testPlugins(self):
self.assertFalse(self._strip_ignorable_errors(err))
self.assertEqual(rc, 0)

def testPluginStatus(self):
rc, output, err = self.run_process(['plugins'])
self.assertIn('available plugins', output.lower())
previously_enabled = '* grassprovider' in output.lower()

# ensure plugin is enabled initially
self.run_process(['plugins', 'enable', 'grassprovider'])

# try to re-enable, should error out
rc, output, err = self.run_process(['plugins', 'enable', 'grassprovider'])

self.assertIn('plugin is already enabled', err.lower())
self.assertEqual(rc, 1)

rc, output, err = self.run_process(['plugins'])
self.assertIn('available plugins', output.lower())
self.assertIn('* grassprovider', output.lower())
self.assertFalse(self._strip_ignorable_errors(err))
self.assertEqual(rc, 0)

# disable
rc, output, err = self.run_process(['plugins', 'disable', 'grassprovider'])
self.assertFalse(self._strip_ignorable_errors(err))
self.assertEqual(rc, 0)

# try to re-disable
rc, output, err = self.run_process(['plugins', 'disable', 'grassprovider'])
self.assertIn('plugin is already disabled', err.lower())
self.assertEqual(rc, 1)

rc, output, err = self.run_process(['plugins'])
self.assertIn('available plugins', output.lower())
self.assertNotIn('* grassprovider', output.lower())
self.assertFalse(self._strip_ignorable_errors(err))
self.assertEqual(rc, 0)

rc, output, err = self.run_process(['plugins', 'enable', 'grassprovider'])
self.assertFalse(self._strip_ignorable_errors(err))
self.assertEqual(rc, 0)

rc, output, err = self.run_process(['plugins'])
self.assertIn('available plugins', output.lower())
self.assertIn('* grassprovider', output.lower())
self.assertFalse(self._strip_ignorable_errors(err))
self.assertEqual(rc, 0)

if not previously_enabled:
self.run_process(['plugins', 'disable', 'grassprovider'])

# not a plugin
rc, output, err = self.run_process(['plugins', 'enable', 'reformatplugin'])
self.assertIn('no matching plugins found', err.lower())
self.assertEqual(rc, 1)

rc, output, err = self.run_process(['plugins', 'disable', 'reformatplugin'])
self.assertIn('no matching plugins found', err.lower())
self.assertEqual(rc, 1)

def testPluginsJson(self):
rc, output, err = self.run_process(['plugins', '--json'])
res = json.loads(output)
Expand Down

0 comments on commit a0a6c2d

Please sign in to comment.