photo-python/tests/unit/test_http.py
sneakypete81 b9c947c94c Added more unit tests
File post, API version selection, HTTP errors
2013-06-16 12:09:24 +01:00

152 lines
6.5 KiB
Python

from __future__ import unicode_literals
import os
import json
import httpretty
try:
import unittest2 as unittest # Python2.6
except ImportError:
import unittest
import openphoto
class TestHttp(unittest.TestCase):
TEST_HOST = "test.example.com"
TEST_ENDPOINT = "test.json"
TEST_URI = "http://%s/%s" % (TEST_HOST, TEST_ENDPOINT)
TEST_DATA = {"message": "Test Message",
"code": 200,
"result": "Test Result"}
TEST_OAUTH = {"consumer_key": "dummy",
"consumer_secret": "dummy",
"token": "dummy",
"token_secret": "dummy"}
TEST_FILE = os.path.join("tests", "unit", "data", "test_file.txt")
def setUp(self):
self.client = openphoto.OpenPhoto(host=self.TEST_HOST, **self.TEST_OAUTH)
def _register_uri(self, method, uri=TEST_URI, data=TEST_DATA, body=None,
**kwds):
"""Convenience wrapper around httpretty.register_uri"""
if body is None:
body = json.dumps(data)
httpretty.register_uri(method, uri=uri, body=body, **kwds)
@staticmethod
def _last_request():
"""This is a temporary measure until httpretty PR#59 is merged"""
return httpretty.httpretty.last_request
def test_attributes(self):
self.assertEqual(self.client.host, self.TEST_HOST)
self.assertEqual(self.client.config.host, self.TEST_HOST)
@httpretty.activate
def test_get_with_parameters(self):
self._register_uri(httpretty.GET)
response = self.client.get(self.TEST_ENDPOINT,
foo="bar", spam="eggs")
self.assertIn("OAuth", self._last_request().headers["authorization"])
self.assertEqual(self._last_request().querystring["foo"], ["bar"])
self.assertEqual(self._last_request().querystring["spam"], ["eggs"])
self.assertEqual(response, self.TEST_DATA)
self.assertEqual(self.client.last_url, self.TEST_URI)
self.assertEqual(self.client.last_params, {"foo": "bar", "spam": "eggs"})
self.assertEqual(self.client.last_response.json(), self.TEST_DATA)
@httpretty.activate
def test_post_with_parameters(self):
self._register_uri(httpretty.POST)
response = self.client.post(self.TEST_ENDPOINT,
foo="bar", spam="eggs")
self.assertEqual(self._last_request().body, "foo=bar&spam=eggs")
self.assertEqual(response, self.TEST_DATA)
self.assertEqual(self.client.last_url, self.TEST_URI)
self.assertEqual(self.client.last_params, {"foo": "bar", "spam": "eggs"})
self.assertEqual(self.client.last_response.json(), self.TEST_DATA)
@httpretty.activate
def test_get_without_oauth(self):
self.client = openphoto.OpenPhoto(host=self.TEST_HOST)
self._register_uri(httpretty.GET)
response = self.client.get(self.TEST_ENDPOINT)
self.assertNotIn("authorization", self._last_request().headers)
self.assertEqual(response, self.TEST_DATA)
@httpretty.activate
def test_post_without_oauth_raises_exception(self):
self.client = openphoto.OpenPhoto(host=self.TEST_HOST)
self._register_uri(httpretty.POST)
with self.assertRaises(openphoto.OpenPhotoError):
self.client.post(self.TEST_ENDPOINT)
@httpretty.activate
def test_get_without_response_processing(self):
self._register_uri(httpretty.GET)
response = self.client.get(self.TEST_ENDPOINT, process_response=False)
self.assertEqual(response, json.dumps(self.TEST_DATA))
@httpretty.activate
def test_post_without_response_processing(self):
self._register_uri(httpretty.POST)
response = self.client.post(self.TEST_ENDPOINT, process_response=False)
self.assertEqual(response, json.dumps(self.TEST_DATA))
@httpretty.activate
def test_get_parameter_processing(self):
self._register_uri(httpretty.GET)
photo = openphoto.objects.Photo(None, {"id": "photo_id"})
album = openphoto.objects.Album(None, {"id": "album_id"})
tag = openphoto.objects.Tag(None, {"id": "tag_id"})
self.client.get(self.TEST_ENDPOINT,
photo=photo, album=album, tag=tag,
list_=[photo, album, tag],
boolean=True,
unicode_="\xfcmlaut")
params=self._last_request().querystring
self.assertEqual(params["photo"], ["photo_id"])
self.assertEqual(params["album"], ["album_id"])
self.assertEqual(params["tag"], ["tag_id"])
self.assertEqual(params["list_"], ["photo_id,album_id,tag_id"])
self.assertEqual(params["boolean"], ["1"])
self.assertEqual(params["unicode_"], ["\xc3\xbcmlaut"])
@httpretty.activate
def test_get_with_api_version(self):
self.client = openphoto.OpenPhoto(host=self.TEST_HOST, api_version=1)
self._register_uri(httpretty.GET,
uri="http://%s/v1/%s" % (self.TEST_HOST,
self.TEST_ENDPOINT))
self.client.get(self.TEST_ENDPOINT)
@httpretty.activate
def test_post_with_api_version(self):
self.client = openphoto.OpenPhoto(host=self.TEST_HOST, api_version=1,
**self.TEST_OAUTH)
self._register_uri(httpretty.POST,
uri="http://%s/v1/%s" % (self.TEST_HOST,
self.TEST_ENDPOINT))
self.client.post(self.TEST_ENDPOINT)
@httpretty.activate
def test_post_file(self):
self._register_uri(httpretty.POST)
with open(self.TEST_FILE, 'rb') as in_file:
response = self.client.post(self.TEST_ENDPOINT,
files={"file": in_file})
self.assertEqual(response, self.TEST_DATA)
body = self._last_request().body
self.assertIn("Content-Disposition: form-data; "+
"name=\"file\"; filename=\"test_file.txt\"", body)
self.assertIn("Test File", body)
@httpretty.activate
def test_post_file_parameters_are_sent_as_querystring(self):
self._register_uri(httpretty.POST)
with open(self.TEST_FILE, 'rb') as in_file:
response = self.client.post(self.TEST_ENDPOINT, foo="bar",
files={"file": in_file})
self.assertEqual(response, self.TEST_DATA)
self.assertEqual(self._last_request().querystring["foo"], ["bar"])