Skip to content

Commit

Permalink
adding 'options' and 'head' methods
Browse files Browse the repository at this point in the history
and a tiny bit of http method refactoring
  • Loading branch information
Jannon Frank committed Dec 2, 2014
1 parent d2a7a6d commit fe48370
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 24 deletions.
46 changes: 22 additions & 24 deletions slumber/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ def _handle_redirect(self, resp, **kwargs):
def _try_to_serialize_response(self, resp):
s = self._store["serializer"]

if resp.headers.get("content-type", None):
if resp.headers.get("content-type", None) and resp.content:
content_type = resp.headers.get("content-type").split(";")[0].strip()

try:
Expand All @@ -123,6 +123,14 @@ def _try_to_serialize_response(self, resp):
else:
return resp.content

def _process_response(self, resp):
# TODO: something to expose headers and status

if 200 <= resp.status_code <= 299:
return self._try_to_serialize_response(resp)
else:
return # @@@ We should probably do some sort of error here? (Is this even possible?)

def url(self):
url = self._store["base_url"]

Expand All @@ -131,40 +139,30 @@ def url(self):

return url

# TODO: refactor these methods - lots of commonality
def get(self, **kwargs):
resp = self._request("GET", params=kwargs)
if 200 <= resp.status_code <= 299:
return self._try_to_serialize_response(resp)
else:
return # @@@ We should probably do some sort of error here? (Is this even possible?)
return self._process_response(resp)

def post(self, data=None, files=None, **kwargs):
s = self._store["serializer"]
def options(self, **kwargs):
resp = self._request("OPTIONS", params=kwargs)
return self._process_response(resp)

def head(self, **kwargs):
resp = self._request("HEAD", params=kwargs)
return self._process_response(resp)

def post(self, data=None, files=None, **kwargs):
resp = self._request("POST", data=data, files=files, params=kwargs)
if 200 <= resp.status_code <= 299:
return self._try_to_serialize_response(resp)
else:
# @@@ Need to be Some sort of Error Here or Something
return
return self._process_response(resp)

def patch(self, data=None, files=None, **kwargs):
s = self._store["serializer"]

resp = self._request("PATCH", data=data, files=files, params=kwargs)
if 200 <= resp.status_code <= 299:
return self._try_to_serialize_response(resp)
else:
# @@@ Need to be Some sort of Error Here or Something
return
return self._process_response(resp)

def put(self, data=None, files=None, **kwargs):
resp = self._request("PUT", data=data, files=files, params=kwargs)

if 200 <= resp.status_code <= 299:
return self._try_to_serialize_response(resp)
else:
return False
return self._process_response(resp)

def delete(self, **kwargs):
resp = self._request("DELETE", params=kwargs)
Expand Down
63 changes: 63 additions & 0 deletions tests/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,69 @@ def test_get_200_text(self):
resp = self.base_resource.get()
self.assertEqual(resp, r.content)

def test_options_200_json(self):
r = mock.Mock(spec=requests.Response)
r.status_code = 200
r.headers = {"content-type": "application/json"}
r.content = '{"actions": {"POST": {"foo": {"required": false, "type": "string"}}}}'

self.base_resource._store.update({
"session": mock.Mock(spec=requests.Session),
"serializer": slumber.serialize.Serializer(),
})
self.base_resource._store["session"].request.return_value = r

resp = self.base_resource._request("OPTIONS")

self.assertTrue(resp is r)
self.assertEqual(resp.content, r.content)

self.base_resource._store["session"].request.assert_called_once_with(
"OPTIONS",
"http://example/api/v1/test",
data=None,
files=None,
params=None,
headers={"content-type": self.base_resource._store["serializer"].get_content_type(),
"accept": self.base_resource._store["serializer"].get_content_type()}
)

resp = self.base_resource.options()
self.assertTrue('POST' in resp['actions'])
self.assertTrue('foo' in resp['actions']['POST'])
self.assertTrue('type' in resp['actions']['POST']['foo'])
self.assertEqual(resp['actions']['POST']['foo']['type'], 'string')

def test_head_200_json(self):
r = mock.Mock(spec=requests.Response)
r.status_code = 200
r.headers = {"content-type": "application/json"}
r.content = ''

self.base_resource._store.update({
"session": mock.Mock(spec=requests.Session),
"serializer": slumber.serialize.Serializer(),
})
self.base_resource._store["session"].request.return_value = r

resp = self.base_resource._request("HEAD")

self.assertTrue(resp is r)
self.assertEqual(resp.content, r.content)

self.base_resource._store["session"].request.assert_called_once_with(
"HEAD",
"http://example/api/v1/test",
data=None,
files=None,
params=None,
headers={"content-type": self.base_resource._store["serializer"].get_content_type(),
"accept": self.base_resource._store["serializer"].get_content_type()}
)

resp = self.base_resource.head()
self.assertEqual(resp, r.content)

def test_post_201_redirect(self):
r1 = mock.Mock(spec=requests.Response)
r1.status_code = 201
Expand Down

0 comments on commit fe48370

Please sign in to comment.