diff --git a/.gitignore b/.gitignore index c8928da..f333477 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ __pycache__ *.pyc django_byostorage.egg-info +.coverage +htmlcov diff --git a/byostorage/models.py b/byostorage/models.py index de9ccf6..755a7b0 100644 --- a/byostorage/models.py +++ b/byostorage/models.py @@ -1,6 +1,6 @@ from django.conf import settings from django.db import models -from django.core.files.storage import get_storage_class +from django.core.files.storage import get_storage_class, FileSystemStorage from django.core.exceptions import ValidationError import json @@ -52,14 +52,19 @@ class UserStorage(models.Model): except Exception as e: raise ValueError("Error in settings for storage '{0}' [{1}]".format(self.name, e)) - def test_connection(self): + def test_storage(self): # just do something that requires connection - self.instance().exists('ping.txt') + try: + self.instance().listdir('') + except FileNotFoundError: + # FileSystemStorage doesn't create the base_dir until write + pass + return True def save(self, *args, **kwargs): - # check the settings are valid - validate_json(self.settings_data) - self.test_connection() + # ensure the settings JSON isvalid + if self.settings_data: + validate_json(self.settings_data) super(UserStorage, self).save(*args, **kwargs) diff --git a/byostorage/tests.py b/byostorage/tests.py index b8d5152..4dbedf6 100644 --- a/byostorage/tests.py +++ b/byostorage/tests.py @@ -7,6 +7,9 @@ from .models import UserStorage from .user import BYOStorage from .http import HTTPStorage +#import logging +#logging.basicConfig(level=logging.DEBUG) + class MultiStorageTestCase(TestCase): def test_storage_selection(self): @@ -56,8 +59,8 @@ class UserStorageTestCase(TestCase): UserStorage.objects.create(name='one', storage='django.core.files.storage.FileSystemStorage', settings_data='{"location": "foo}') - def test_bad_settings(self): - UserStorage.objects.create(name='one', storage='storages.backends.s3boto3.S3Boto3Storage', + def test_connection(self): + instance = UserStorage.objects.create(name='one', storage='storages.backends.s3boto3.S3Boto3Storage', settings_data=''' { "access_key": "polyphonic_test_key", @@ -67,6 +70,23 @@ class UserStorageTestCase(TestCase): } ''') + + def test_bad_connection(self): + try: + UserStorage.objects.create(name='one', storage='storages.backends.s3boto3.S3Boto3Storage', + settings_data=''' +{ + "access_key": "polyphonic_test_key", + "secret_key": "the_wrong_secret", + "endpoint_url": "http://localhost:9000", + "bucket_name": "missing" +} +''') + self.fail("Should have raised an exception") + except Exception as e: + pass + + class BYOStorageTestCase(TestCase): def setUp(self):