Skip to content
This repository has been archived by the owner on Mar 24, 2021. It is now read-only.

Commit

Permalink
Add tests for None response and _get_json_url
Browse files Browse the repository at this point in the history
Fix code to deal with None
  • Loading branch information
jcbashdown committed Mar 14, 2014
1 parent 23f982c commit 5c06a18
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 15 deletions.
19 changes: 10 additions & 9 deletions backdrop/core/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,10 @@ def __init__(self, stagecraft_url, stagecraft_token):
def get_all(self):
data_set_url = '{url}/data-sets'.format(url=self._stagecraft_url)

data_sets = _decode_json(_get_json_url(
data_set_url, self._stagecraft_token))
json_response = _get_json_url(
data_set_url, self._stagecraft_token) or '[]'
data_sets = _decode_json(json_response)

return [_make_bucket_config(data_set) for data_set in data_sets]

def retrieve(self, name):
Expand All @@ -85,9 +87,9 @@ def get_bucket_for_query(self, data_group, data_type):
url=self._stagecraft_url,
data_group_name=data_group,
data_type_name=data_type))

data_sets = _decode_json(_get_json_url(
data_set_url, self._stagecraft_token))
json_response = _get_json_url(
data_set_url, self._stagecraft_token) or '[]'
data_sets = _decode_json(json_response)
if len(data_sets) > 0:
return _make_bucket_config(data_sets[0])
return None
Expand All @@ -113,12 +115,11 @@ def _get_json_url(url, token):
try:
response.raise_for_status()
except requests.HTTPError as e:
logger.error('Got HTTP 404 for: {}'.format(url))
logger.exception(e)
if e.response.status_code == 404:
return None
logger.error('Got HTTP 404 for: {}'.format(url))
logger.exception(e)
return None
raise e

return response.content


Expand Down
57 changes: 51 additions & 6 deletions tests/core/test_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@

from backdrop.core.bucket import BucketConfig
from backdrop.core.repository import (BucketConfigRepository,
UserConfigRepository)
UserConfigRepository,
_get_json_url)
from hamcrest import assert_that, equal_to, is_, has_entries, match_equality
from mock import Mock
from mock import Mock, patch
from nose.tools import assert_raises
from backdrop.core.user import UserConfig
from contextlib import contextmanager
from os.path import dirname, join as pjoin
import requests


@contextmanager
Expand All @@ -18,12 +20,40 @@ def fixture(name):
with open(filename, 'r') as f:
yield f.read()

#TODO: get json_url needs tests


_GET_JSON_URL_FUNC = 'backdrop.core.repository._get_json_url'


class TestGetJsonUrl(unittest.TestCase):

@patch('requests.get', spec=True)
def test_get_json_url_sends_correct_request(self, mock_get):
mock_response = Mock()
mock_response.content = '[]'
mock_get.return_value = mock_response
response_content = _get_json_url("my_url", "some_token")
mock_get.assert_called_once_with(
'my_url',
headers={'content-type': 'application/json',
'Authorization': 'Bearer some_token'})
assert_that(response_content, equal_to('[]'))


@patch('requests.get', spec=True)
def test_get_json_url_returns_none_on_404(self, mock_get):
exception = requests.HTTPError()
mock_error_response = Mock()
mock_error_response.status_code = 404
exception.response = mock_error_response
def fake_raise_for_status():
raise exception

mock_response = Mock()
mock_response.raise_for_status = fake_raise_for_status
mock_get.return_value = mock_response
response_content = _get_json_url("my_url", "some_token")
assert_that(response_content, is_(None))


class TestBucketRepository(unittest.TestCase):
def setUp(self):
self.bucket_repo = BucketConfigRepository(
Expand Down Expand Up @@ -98,13 +128,28 @@ def test_get_bucket_for_query_correctly_decodes_stagecraft_response(self):

assert_that(bucket, equal_to(expected_bucket))

def test_retrieving_non_existent_bucket_returns_none(self):
def test_retrieve_for_non_existent_bucket_returns_none(self):
with mock.patch(_GET_JSON_URL_FUNC) as _get_json_url:
_get_json_url.return_value = None
bucket = self.bucket_repo.retrieve(name="non_existent")

assert_that(bucket, is_(None))

def test_get_bucket_for_query_for_non_existent_bucket_returns_none(self):
with mock.patch(_GET_JSON_URL_FUNC) as _get_json_url:
_get_json_url.return_value = None
bucket = self.bucket_repo.get_bucket_for_query(
data_group="govuk", data_type="realtime")

assert_that(bucket, is_(None))

def test_get_all_for_non_existent_buckets_returns_empty_array(self):
with mock.patch(_GET_JSON_URL_FUNC) as _get_json_url:
_get_json_url.return_value = None
buckets = self.bucket_repo.get_all();

assert_that(buckets, is_([]))

def test_retrieve_calls_correct_url_for_data_set_by_name(self):
with fixture('stagecraft_get_single_data_set.json') as content:
with mock.patch(_GET_JSON_URL_FUNC) as _get_json_url:
Expand Down

0 comments on commit 5c06a18

Please sign in to comment.