Commit c14f3047 by Clinton Blackburn

Merge pull request #8 from edx/exceptions

Added additional exception classes
parents fb9e563d 8025087c
......@@ -4,7 +4,7 @@ import requests
import requests.exceptions
from analyticsclient.course import Course
from analyticsclient.exceptions import ClientError
from analyticsclient.exceptions import ClientError, InvalidRequestError, NotFoundError
from analyticsclient.status import Status
......@@ -92,12 +92,23 @@ class Client(object):
headers['Authorization'] = 'Token ' + self.auth_token
try:
response = requests.get('{0}/{1}'.format(self.base_url, resource), headers=headers, timeout=timeout)
uri = '{0}/{1}'.format(self.base_url, resource)
response = requests.get(uri, headers=headers, timeout=timeout)
status = response.status_code
if status != requests.codes.ok: # pylint: disable=no-member
message = 'Resource "{0}" returned status code {1}'.format(resource, status)
error_class = ClientError
if status == requests.codes.bad_request: # pylint: disable=no-member
message = 'The request to {0} was invalid.'.format(uri)
error_class = InvalidRequestError
elif status == requests.codes.not_found: # pylint: disable=no-member
message = 'Resource {0} was not found on the API server.'.format(uri)
error_class = NotFoundError
if response.status_code != requests.codes.ok: # pylint: disable=no-member
message = 'Resource "{0}" returned status code {1}'.format(resource, response.status_code)
log.error(message)
raise ClientError(message)
raise error_class(message)
return response
......
class ClientError(Exception):
""" Common base class for all client errors. """
pass
class NotFoundError(ClientError):
""" URL was not found. """
pass
class InvalidRequestError(ClientError):
""" The API request was invalid. """
pass
import json
import httpretty
import re
from analyticsclient import activity_type as at
from analyticsclient import demographic as demo
from analyticsclient.exceptions import NotFoundError, InvalidRequestError
from analyticsclient.tests import ClientTestCase
......@@ -25,6 +27,7 @@ class CoursesTests(ClientTestCase):
httpretty.register_uri(httpretty.GET, uri, body=json.dumps(data))
self.assertDictEqual(data, course.enrollment(demographic))
@httpretty.activate
def assertRecentActivityResponseData(self, course, activity_type):
body = {
u'course_id': unicode(course.course_id),
......@@ -79,3 +82,25 @@ class CoursesTests(ClientTestCase):
self.assertRecentActivityResponseData(self.course, at.ATTEMPTED_PROBLEM)
self.assertRecentActivityResponseData(self.course, at.PLAYED_VIDEO)
self.assertRecentActivityResponseData(self.course, at.POSTED_FORUM)
def test_not_found(self):
""" Course calls should raise a NotFoundError when provided with an invalid course. """
course_id = 'not-a-course-id'
uri = self.get_api_url('courses/{0}/'.format(course_id))
uri = re.compile(r'^' + re.escape(uri) + r'.*$')
httpretty.register_uri(httpretty.GET, uri, status=404)
course = self.client.courses(course_id)
self.assertRaises(NotFoundError, course.recent_activity, at.ANY)
self.assertRaises(NotFoundError, course.enrollment, demo.EDUCATION)
def test_invalid_parameter(self):
""" Course calls should raise a InvalidRequestError when parameters are invalid. """
uri = self.get_api_url('courses/{0}/'.format(self.course_id))
uri = re.compile(r'^' + re.escape(uri) + r'.*$')
httpretty.register_uri(httpretty.GET, uri, status=400)
self.assertRaises(InvalidRequestError, self.course.recent_activity, 'not-a-an-activity-type')
self.assertRaises(InvalidRequestError, self.course.enrollment, 'not-a-demographic')
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment