From 5937cdc3b250f762472b3c56cd4eb9c3c1c1a1ff Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Sun, 10 May 2015 23:15:13 +0200 Subject: [PATCH] ext: Add tests for validate_extension and handle validate_environment failures --- mopidy/ext.py | 2 ++ tests/test_ext.py | 90 +++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 86 insertions(+), 6 deletions(-) diff --git a/mopidy/ext.py b/mopidy/ext.py index 37e91a82..625c27a2 100644 --- a/mopidy/ext.py +++ b/mopidy/ext.py @@ -211,5 +211,7 @@ def validate_extension(extension): logger.info( 'Disabled extension %s: %s', extension.ext_name, ex.message) return False + except Exception: + return False # TODO: log return True diff --git a/tests/test_ext.py b/tests/test_ext.py index ab54bc07..72e1e141 100644 --- a/tests/test_ext.py +++ b/tests/test_ext.py @@ -2,9 +2,17 @@ from __future__ import absolute_import, unicode_literals import mock +import pkg_resources + import pytest -from mopidy import config, ext +from mopidy import config, exceptions, ext + + +class TestExtension(ext.Extension): + dist_name = 'Mopidy-Foobar' + ext_name = 'foobar' + version = '1.2.3' # ext.Extension @@ -47,11 +55,6 @@ def test_setup_raises_not_implemented(extension): # ext.load_extensions -class TestExtension(ext.Extension): - dist_name = 'Mopidy-Foobar' - ext_name = 'foobar' - version = '1.2.3' - @mock.patch('pkg_resources.iter_entry_points') def test_load_extensions_no_extenions(mock_entry_points): @@ -116,3 +119,78 @@ def test_load_extensions_store_entry_point(mock_entry_points): extensions = ext.load_extensions() assert len(extensions) == 1 assert extensions[0].entry_point == mock_entry_point + + +# ext.validate_extension + +def test_validate_extension_name_mismatch(): + ep = mock.Mock() + ep.name = 'barfoo' + + extension = TestExtension() + extension.entry_point = ep + + assert not ext.validate_extension(extension) + + +def test_validate_extension_distribution_not_found(): + ep = mock.Mock() + ep.name = 'foobar' + ep.require.side_effect = pkg_resources.DistributionNotFound + + extension = TestExtension() + extension.entry_point = ep + + assert not ext.validate_extension(extension) + + +def test_validate_extension_version_conflict(): + ep = mock.Mock() + ep.name = 'foobar' + ep.require.side_effect = pkg_resources.VersionConflict + + extension = TestExtension() + extension.entry_point = ep + + assert not ext.validate_extension(extension) + + +def test_validate_extension_exception(): + ep = mock.Mock() + ep.name = 'foobar' + ep.require.side_effect = Exception + + extension = TestExtension() + extension.entry_point = ep + + # We trust that entry points are well behaved, so exception will bubble. + with pytest.raises(Exception): + assert not ext.validate_extension(extension) + + +def test_validate_extension_instance_validate_env_ext_error(): + ep = mock.Mock() + ep.name = 'foobar' + + extension = TestExtension() + extension.entry_point = ep + + with mock.patch.object(extension, 'validate_environment') as validate: + validate.side_effect = exceptions.ExtensionError('error') + + assert not ext.validate_extension(extension) + validate.assert_called_once_with() + + +def test_validate_extension_instance_validate_env_exception(): + ep = mock.Mock() + ep.name = 'foobar' + + extension = TestExtension() + extension.entry_point = ep + + with mock.patch.object(extension, 'validate_environment') as validate: + validate.side_effect = Exception + + assert not ext.validate_extension(extension) + validate.assert_called_once_with()