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 ...@@ -4,7 +4,7 @@ import requests
import requests.exceptions import requests.exceptions
from analyticsclient.course import Course from analyticsclient.course import Course
from analyticsclient.exceptions import ClientError from analyticsclient.exceptions import ClientError, InvalidRequestError, NotFoundError
from analyticsclient.status import Status from analyticsclient.status import Status
...@@ -92,12 +92,23 @@ class Client(object): ...@@ -92,12 +92,23 @@ class Client(object):
headers['Authorization'] = 'Token ' + self.auth_token headers['Authorization'] = 'Token ' + self.auth_token
try: 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) log.error(message)
raise ClientError(message) raise error_class(message)
return response return response
......
class ClientError(Exception): class ClientError(Exception):
""" Common base class for all client errors. """ """ Common base class for all client errors. """
pass pass
class NotFoundError(ClientError):
""" URL was not found. """
pass
class InvalidRequestError(ClientError):
""" The API request was invalid. """
pass
import json import json
import httpretty import httpretty
import re
from analyticsclient import activity_type as at from analyticsclient import activity_type as at
from analyticsclient import demographic as demo from analyticsclient import demographic as demo
from analyticsclient.exceptions import NotFoundError, InvalidRequestError
from analyticsclient.tests import ClientTestCase from analyticsclient.tests import ClientTestCase
...@@ -25,6 +27,7 @@ class CoursesTests(ClientTestCase): ...@@ -25,6 +27,7 @@ class CoursesTests(ClientTestCase):
httpretty.register_uri(httpretty.GET, uri, body=json.dumps(data)) httpretty.register_uri(httpretty.GET, uri, body=json.dumps(data))
self.assertDictEqual(data, course.enrollment(demographic)) self.assertDictEqual(data, course.enrollment(demographic))
@httpretty.activate
def assertRecentActivityResponseData(self, course, activity_type): def assertRecentActivityResponseData(self, course, activity_type):
body = { body = {
u'course_id': unicode(course.course_id), u'course_id': unicode(course.course_id),
...@@ -79,3 +82,25 @@ class CoursesTests(ClientTestCase): ...@@ -79,3 +82,25 @@ class CoursesTests(ClientTestCase):
self.assertRecentActivityResponseData(self.course, at.ATTEMPTED_PROBLEM) self.assertRecentActivityResponseData(self.course, at.ATTEMPTED_PROBLEM)
self.assertRecentActivityResponseData(self.course, at.PLAYED_VIDEO) self.assertRecentActivityResponseData(self.course, at.PLAYED_VIDEO)
self.assertRecentActivityResponseData(self.course, at.POSTED_FORUM) 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