diff --git a/collectfast/strategies/base.py b/collectfast/strategies/base.py index 833de96..6c4e496 100644 --- a/collectfast/strategies/base.py +++ b/collectfast/strategies/base.py @@ -150,9 +150,9 @@ def load_strategy(klass: Union[str, type, object]) -> Type[Strategy]: def _resolves_to_subclass(subclass_ref: str, superclass_ref: str) -> bool: - subclass = locate(subclass_ref) - assert isinstance(subclass, type) try: + subclass = locate(subclass_ref) + assert isinstance(subclass, type) superclass = locate(superclass_ref) assert isinstance(superclass, type) except (ImportError, AssertionError) as e: @@ -176,5 +176,6 @@ def guess_strategy(storage: str) -> str: if _resolves_to_subclass(storage, _BOTO3_STORAGE): return _BOTO3_STRATEGY raise ImproperlyConfigured( - "No strategy configured, please make sure COLLECTFAST_STRATEGY is set." + "Collectfast failed to guess strategy, please make sure " + "COLLECTFAST_STRATEGY is set." ) diff --git a/collectfast/tests/no_preload_metadata.py b/collectfast/tests/no_preload_metadata.py deleted file mode 100644 index 0228c4b..0000000 --- a/collectfast/tests/no_preload_metadata.py +++ /dev/null @@ -1,10 +0,0 @@ -from storages.backends.s3boto3 import S3Boto3Storage - - -class NPM(S3Boto3Storage): - """ - Dummy class for testing that collectfast warns about overriding the - `preload_metadata` attribute. - """ - - preload_metadata = False diff --git a/collectfast/tests/strategies/test_guess_strategy.py b/collectfast/tests/strategies/test_guess_strategy.py index c640f78..a1b4433 100644 --- a/collectfast/tests/strategies/test_guess_strategy.py +++ b/collectfast/tests/strategies/test_guess_strategy.py @@ -1,5 +1,7 @@ from unittest import TestCase +from django.core.exceptions import ImproperlyConfigured + from collectfast.strategies.base import _BOTO3_STORAGE from collectfast.strategies.base import _BOTO3_STRATEGY from collectfast.strategies.base import _BOTO_STORAGE @@ -24,7 +26,8 @@ def test_guesses_boto3_from_exact(case): def test_guesses_boto_from_subclass(case): # type: (TestCase) -> None case.assertEqual( - guess_strategy("collectfast.tests.boto_subclass.CustomStorage"), _BOTO_STRATEGY + guess_strategy("collectfast.tests.test_storages.boto_subclass.CustomStorage"), + _BOTO_STRATEGY, ) @@ -32,6 +35,20 @@ def test_guesses_boto_from_subclass(case): def test_guesses_boto3_from_subclass(case): # type: (TestCase) -> None case.assertEqual( - guess_strategy("collectfast.tests.boto3_subclass.CustomStorage"), + guess_strategy("collectfast.tests.test_storages.boto3_subclass.CustomStorage"), _BOTO3_STRATEGY, ) + + +@test +def test_raises_improperly_configured_for_unguessable_class(case): + # type: (TestCase) -> None + with case.assertRaises(ImproperlyConfigured): + guess_strategy("collectfast.tests.test_storages.unguessable.UnguessableStorage") + + +@test +def test_raises_improperly_configured_for_invalid_type(case): + # type: (TestCase) -> None + with case.assertRaises(ImproperlyConfigured): + guess_strategy("collectfast.tests.test_storages.unguessable.NotAType") diff --git a/collectfast/tests/test_storages/__init__.py b/collectfast/tests/test_storages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/collectfast/tests/boto3_subclass.py b/collectfast/tests/test_storages/boto3_subclass.py similarity index 100% rename from collectfast/tests/boto3_subclass.py rename to collectfast/tests/test_storages/boto3_subclass.py diff --git a/collectfast/tests/boto_subclass.py b/collectfast/tests/test_storages/boto_subclass.py similarity index 100% rename from collectfast/tests/boto_subclass.py rename to collectfast/tests/test_storages/boto_subclass.py diff --git a/collectfast/tests/test_storages/unguessable.py b/collectfast/tests/test_storages/unguessable.py new file mode 100644 index 0000000..b20a7c3 --- /dev/null +++ b/collectfast/tests/test_storages/unguessable.py @@ -0,0 +1,5 @@ +class UnguessableStorage: + pass + + +NotAType = 1 diff --git a/setup.cfg b/setup.cfg index da5b392..00b398f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -37,6 +37,10 @@ source = collectfast [coverage:report] omit = */tests/* +exclude_lines = + pragma: no cover + # ignore non-implementations + \.\.\. [metadata] license_file = LICENSE