Skip to content

Commit

Permalink
tests for storage exists
Browse files Browse the repository at this point in the history
  • Loading branch information
smn committed May 18, 2015
1 parent 48c8ed7 commit b031761
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 9 deletions.
47 changes: 42 additions & 5 deletions elasticgit/remote_storage.py
Original file line number Diff line number Diff line change
@@ -1,27 +1,64 @@
import os
from urlparse import urlparse

import requests

from zope.interface import implements

from elasticgit.istorage import IStorageManager
from elasticgit.utils import fqcn


class RemoteStorageManagerException(Exception):
pass


class RemoteStorageManager(object):
implements(IStorageManager)

def __init__(self, repo_url):
self.repo_url = repo_url
parse_result = urlparse(self.repo_url)
self.scheme = parse_result.scheme
self.host = parse_result.netloc
self.port = parse_result.port
self.dir_name = os.path.dirname(parse_result.path)
basename = os.path.basename(parse_result.path)
self.repo_name, _, self.suffix = basename.partition('.')

def mk_request(self, *args, **kwargs):
return requests.request(*args, **kwargs)

def url(self, *parts):
path = [self.repo_name]
path.extend(parts)
return '%s://%s%s%s/%s.%s' % (
self.scheme,
self.host,
':%s' % (self.port,) if self.port else '',
self.dir_name,
'/'.join(path),
self.suffix
)

def write_config(self, section, data):
pass
raise RemoteStorageManagerException(
'Remote storage is read only.')

def read_config(Self, section):
pass
raise RemoteStorageManagerException(
'Not implemented for remote storage.')

def storage_exists(self):
pass
response = self.mk_request('GET', self.repo_url)
return response.status_code == requests.codes.ok

def destroy_storage(self):
pass
raise RemoteStorageManagerException(
'Remote storage is read only.')

def iterate(self, model_class):
pass
return self.url(fqcn(model_class))

def get(self, model_class, uuid):
pass
Expand Down
35 changes: 31 additions & 4 deletions elasticgit/tests/test_remote_storage.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,40 @@
from elasticgit.tests.base import ModelBaseTest
from elasticgit.istorage import IStorageManager
from elasticgit.remote_storage import RemoteStorageManager
from elasticgit.tests.base import TestPerson
from elasticgit.utils import fqcn

from requests.models import Response

from mock import patch

class TestRemoteStorage(ModelBaseTest):

def setUp(self):
self.rsm = RemoteStorageManager('http://www.example.org')
class TestRemoteStorage(ModelBaseTest):

def test_interface(self):
rsm = RemoteStorageManager('http://www.example.org/repos/foo.json')
self.assertTrue(IStorageManager.implementedBy(RemoteStorageManager))
self.assertTrue(IStorageManager.providedBy(self.rsm))
self.assertTrue(IStorageManager.providedBy(rsm))

def test_url(self):
class_name = fqcn(TestPerson)
rsm = RemoteStorageManager('http://www.example.org/repos/foo.json')
self.assertEqual(
rsm.url(class_name),
'http://www.example.org/repos/foo/%s.json' % (class_name,))

def test_storage_exists(self):
rsm = RemoteStorageManager('http://www.example.org/repos/foo.json')
with patch.object(rsm, 'mk_request') as mock:
response = Response()
response.status_code = 200
mock.return_value = response
self.assertTrue(rsm.storage_exists())

def test_storage_doesnot_exist(self):
rsm = RemoteStorageManager('http://www.example.org/repos/foo.json')
with patch.object(rsm, 'mk_request') as mock:
response = Response()
response.status_code = 404
mock.return_value = response
self.assertFalse(rsm.storage_exists())
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ Jinja2==2.7.3
Unidecode==0.04.16
avro==1.7.7
zope.interface
requests
mock

0 comments on commit b031761

Please sign in to comment.