import moto
import pytest

from util.config.validators import ConfigValidationException
from util.config.validators.validate_storage import StorageValidator

@pytest.mark.parametrize('unvalidated_config, expected', [
  ({}, ConfigValidationException),
  ({'DISTRIBUTED_STORAGE_CONFIG': {}}, ConfigValidationException),
  ({'DISTRIBUTED_STORAGE_CONFIG': {'local': None}}, ConfigValidationException),
  ({'DISTRIBUTED_STORAGE_CONFIG': {'local': ['FakeStorage', {}]}}, None),
])
def test_validate_storage(unvalidated_config, expected):
  validator = StorageValidator()
  if expected is not None:
    with pytest.raises(expected):
      validator.validate(unvalidated_config, None, None)
  else:
    validator.validate(unvalidated_config, None, None)

def test_validate_s3_storage():
  validator = StorageValidator()
  with moto.mock_s3():
    with pytest.raises(ConfigValidationException) as ipe:
      validator.validate({
        'DISTRIBUTED_STORAGE_CONFIG': {
          'default': ('S3Storage', {
            's3_access_key': 'invalid',
            's3_secret_key': 'invalid',
            's3_bucket': 'somebucket',
            'storage_path': ''
          }),
        }
      }, None, None)

    assert ipe.value.message == 'Invalid storage configuration: default: S3ResponseError: 404 Not Found'