Commit 4cb08139 by Matt Drayer

Application reorganization

parent 9f0fbb7b
...@@ -56,7 +56,6 @@ TEST_COURSE_OVERVIEW_CONTENT = dedent(""" ...@@ -56,7 +56,6 @@ TEST_COURSE_OVERVIEW_CONTENT = dedent("""
<div class="teacher-image"> <div class="teacher-image">
<img src="/images/pl-faculty.png" align="left" style="margin:0 20 px 0" alt="Course Staff Image #1"> <img src="/images/pl-faculty.png" align="left" style="margin:0 20 px 0" alt="Course Staff Image #1">
</div> </div>
<h3>Staff Member #1</h3> <h3>Staff Member #1</h3>
<p>Biography of instructor/staff member #1</p> <p>Biography of instructor/staff member #1</p>
</article> </article>
...@@ -65,10 +64,17 @@ TEST_COURSE_OVERVIEW_CONTENT = dedent(""" ...@@ -65,10 +64,17 @@ TEST_COURSE_OVERVIEW_CONTENT = dedent("""
<div class="teacher-image"> <div class="teacher-image">
<img src="/images/pl-faculty.png" align="left" style="margin:0 20 px 0" alt="Course Staff Image #2"> <img src="/images/pl-faculty.png" align="left" style="margin:0 20 px 0" alt="Course Staff Image #2">
</div> </div>
<h3>Staff Member #2</h3> <h3>Staff Member #2</h3>
<p>Biography of instructor/staff member #2</p> <p>Biography of instructor/staff member #2</p>
</article> </article>
<article class="author">
<div class="author-image">
<img src="/images/pl-author.png" align="left" style="margin:0 20 px 0" alt="Author Name">
</div>
<h3>Author Name</h3>
<p>Biography of Author Name</p>
</article>
</section> </section>
<section class="faq"> <section class="faq">
......
...@@ -411,14 +411,19 @@ class CoursesApiTests(TestCase): ...@@ -411,14 +411,19 @@ class CoursesApiTests(TestCase):
self.assertIsNotNone(self._find_item_by_class(sections, 'faq')) self.assertIsNotNone(self._find_item_by_class(sections, 'faq'))
course_staff = self._find_item_by_class(sections, 'course-staff') course_staff = self._find_item_by_class(sections, 'course-staff')
teachers = course_staff['articles'] staff = course_staff['articles']
self.assertEqual(len(teachers), 2) self.assertEqual(len(staff), 3)
self.assertEqual(teachers[0]['name'], "Staff Member #1") self.assertEqual(staff[0]['class'], "teacher")
self.assertEqual(teachers[0]['image_src'], "/images/pl-faculty.png") self.assertEqual(staff[0]['name'], "Staff Member #1")
self.assertIn("<p>Biography of instructor/staff member #1</p>", teachers[0]['bio']) self.assertEqual(staff[0]['image_src'], "/images/pl-faculty.png")
self.assertEqual(teachers[1]['name'], "Staff Member #2") self.assertIn("<p>Biography of instructor/staff member #1</p>", staff[0]['bio'])
self.assertEqual(teachers[1]['image_src'], "/images/pl-faculty.png") self.assertEqual(staff[1]['class'], "teacher")
self.assertIn("<p>Biography of instructor/staff member #2</p>", teachers[1]['bio']) self.assertEqual(staff[1]['name'], "Staff Member #2")
self.assertEqual(staff[1]['image_src'], "/images/pl-faculty.png")
self.assertIn("<p>Biography of instructor/staff member #2</p>", staff[1]['bio'])
self.assertEqual(staff[2]['class'], "author")
body = staff[2]['body']
self.assertGreater(len(body), 0)
about = self._find_item_by_class(sections, 'about') about = self._find_item_by_class(sections, 'about')
self.assertGreater(len(about['body']), 0) self.assertGreater(len(about['body']), 0)
...@@ -558,7 +563,7 @@ class CoursesApiTests(TestCase): ...@@ -558,7 +563,7 @@ class CoursesApiTests(TestCase):
response = self.do_get(test_uri) response = self.do_get(test_uri)
self.assertEqual(response.status_code, 404) self.assertEqual(response.status_code, 404)
def test_courses_users_list_get(self): def test_courses_users_list_get_no_students(self):
test_uri = self.base_courses_uri + '/' + self.test_course_id + '/users' test_uri = self.base_courses_uri + '/' + self.test_course_id + '/users'
response = self.do_get(test_uri) response = self.do_get(test_uri)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
......
...@@ -6,7 +6,7 @@ from django.conf.urls import patterns, url ...@@ -6,7 +6,7 @@ from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patterns
from api_manager import courses_views from api_manager.courses import views as courses_views
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'/*$^', courses_views.CoursesList.as_view()), url(r'/*$^', courses_views.CoursesList.as_view()),
......
...@@ -749,12 +749,22 @@ class GroupsApiTests(TestCase): ...@@ -749,12 +749,22 @@ class GroupsApiTests(TestCase):
response = self.do_post(test_uri, data) response = self.do_post(test_uri, data)
self.assertEqual(response.status_code, 409) self.assertEqual(response.status_code, 409)
def test_group_courses_list_post_invalid_resources(self): def test_group_courses_list_post_invalid_group(self):
test_uri = self.base_groups_uri + '/1239878976/courses' test_uri = self.base_groups_uri + '/1239878976/courses'
data = {'course_id': "98723896"} data = {'course_id': "98723896"}
response = self.do_post(test_uri, data) response = self.do_post(test_uri, data)
self.assertEqual(response.status_code, 404) self.assertEqual(response.status_code, 404)
def test_group_courses_list_post_invalid_course(self):
data = {'name': self.test_group_name}
response = self.do_post(self.base_groups_uri, data)
self.assertEqual(response.status_code, 201)
group_id = response.data['id']
test_uri = response.data['uri'] + '/courses'
data = {'course_id': "987/23/896"}
response = self.do_post(test_uri, data)
self.assertEqual(response.status_code, 404)
def test_group_courses_list_get(self): def test_group_courses_list_get(self):
data = {'name': self.test_group_name} data = {'name': self.test_group_name}
response = self.do_post(self.base_groups_uri, data) response = self.do_post(self.base_groups_uri, data)
......
...@@ -3,7 +3,7 @@ from django.conf.urls import patterns, url ...@@ -3,7 +3,7 @@ from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patterns
from api_manager import groups_views from api_manager.groups import views as groups_views
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'/*$^', groups_views.GroupsList.as_view()), url(r'/*$^', groups_views.GroupsList.as_view()),
......
...@@ -74,19 +74,13 @@ class SessionApiRateLimitingProtectionTest(TestCase): ...@@ -74,19 +74,13 @@ class SessionApiRateLimitingProtectionTest(TestCase):
Post the login info Post the login info
""" """
post_params, extra = {'username': username, 'password': password}, {} post_params, extra = {'username': username, 'password': password}, {}
if kwargs.get('email'):
post_params['email'] = kwargs.get('email')
if kwargs.get('first_name'):
post_params['first_name'] = kwargs.get('first_name')
if kwargs.get('last_name'):
post_params['last_name'] = kwargs.get('last_name')
headers = {'X-Edx-Api-Key': TEST_API_KEY, 'Content-Type': 'application/json'} headers = {'X-Edx-Api-Key': TEST_API_KEY, 'Content-Type': 'application/json'}
if kwargs.get('secure', False): if kwargs.get('secure', False):
extra['wsgi.url_scheme'] = 'https' extra['wsgi.url_scheme'] = 'https'
return self.client.post(url, post_params, headers=headers, **extra) return self.client.post(url, post_params, headers=headers, **extra)
def _assert_response(self, response, status=200, success=None, message=None): def _assert_response(self, response, status=200, message=None):
""" """
Assert that the response had status 200 and returned a valid Assert that the response had status 200 and returned a valid
JSON-parseable dict. JSON-parseable dict.
...@@ -98,15 +92,7 @@ class SessionApiRateLimitingProtectionTest(TestCase): ...@@ -98,15 +92,7 @@ class SessionApiRateLimitingProtectionTest(TestCase):
value for 'message' in the JSON dict. value for 'message' in the JSON dict.
""" """
self.assertEqual(response.status_code, status) self.assertEqual(response.status_code, status)
try:
response_dict = json.loads(response.content) response_dict = json.loads(response.content)
except ValueError:
self.fail("Could not parse response content as JSON: %s"
% str(response.content))
if success is not None:
self.assertEqual(response_dict['success'], success)
if message is not None: if message is not None:
msg = ("'%s' did not contain '%s'" % msg = ("'%s' did not contain '%s'" %
......
...@@ -170,7 +170,7 @@ class SessionApiSecurityTest(TestCase): ...@@ -170,7 +170,7 @@ class SessionApiSecurityTest(TestCase):
response, mock_audit_log = self._do_request(self.user_url, str(uuid.uuid4()), 'Test.Me64!', response, mock_audit_log = self._do_request(self.user_url, str(uuid.uuid4()), 'Test.Me64!',
email='test@edx.org', first_name='John', email='test@edx.org', first_name='John',
last_name='Doe', secure=True, last_name='Doe', secure=True,
patched_audit_log='api_manager.users_views.AUDIT_LOG') patched_audit_log='api_manager.users.views.AUDIT_LOG')
self._assert_response(response, status=201) self._assert_response(response, status=201)
self._assert_audit_log(mock_audit_log, 'info', [u'API::New account created with user-id']) self._assert_audit_log(mock_audit_log, 'info', [u'API::New account created with user-id'])
self._assert_not_in_audit_log(mock_audit_log, 'info', [u'test@edx.org']) self._assert_not_in_audit_log(mock_audit_log, 'info', [u'test@edx.org'])
...@@ -223,7 +223,7 @@ class SessionApiSecurityTest(TestCase): ...@@ -223,7 +223,7 @@ class SessionApiSecurityTest(TestCase):
Make Post/Delete/Get requests with params Make Post/Delete/Get requests with params
""" """
post_params, extra, = {'username': username, 'password': password}, {} post_params, extra, = {'username': username, 'password': password}, {}
patched_audit_log = 'api_manager.sessions_views.AUDIT_LOG' patched_audit_log = 'api_manager.sessions.views.AUDIT_LOG'
request_method = kwargs.get('request_method', 'POST') request_method = kwargs.get('request_method', 'POST')
if kwargs.get('email'): if kwargs.get('email'):
post_params['email'] = kwargs.get('email') post_params['email'] = kwargs.get('email')
...@@ -243,12 +243,9 @@ class SessionApiSecurityTest(TestCase): ...@@ -243,12 +243,9 @@ class SessionApiSecurityTest(TestCase):
result = self.client.post(url, post_params, headers=headers, **extra) result = self.client.post(url, post_params, headers=headers, **extra)
elif request_method == 'DELETE': elif request_method == 'DELETE':
result = self.client.delete(url, post_params, headers=headers, **extra) result = self.client.delete(url, post_params, headers=headers, **extra)
else:
result = self.client.get(url, post_params, headers=headers, **extra)
return result, mock_audit_log return result, mock_audit_log
def _assert_response(self, response, status=200, success=None, message=None): def _assert_response(self, response, status=200, message=None):
""" """
Assert that the response had status 200 and returned a valid Assert that the response had status 200 and returned a valid
JSON-parseable dict. JSON-parseable dict.
...@@ -265,14 +262,7 @@ class SessionApiSecurityTest(TestCase): ...@@ -265,14 +262,7 @@ class SessionApiSecurityTest(TestCase):
if response.status_code == 204: if response.status_code == 204:
return return
try:
response_dict = json.loads(response.content) response_dict = json.loads(response.content)
except ValueError:
self.fail("Could not parse response content as JSON: %s"
% str(response.content))
if success is not None:
self.assertEqual(response_dict['success'], success)
if message is not None: if message is not None:
msg = ("'%s' did not contain '%s'" % msg = ("'%s' did not contain '%s'" %
......
...@@ -3,7 +3,7 @@ from django.conf.urls import patterns, url ...@@ -3,7 +3,7 @@ from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patterns
from api_manager import sessions_views from api_manager.sessions import views as sessions_views
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'/*$^', sessions_views.SessionsList.as_view()), url(r'/*$^', sessions_views.SessionsList.as_view()),
......
...@@ -19,7 +19,7 @@ from rest_framework.views import APIView ...@@ -19,7 +19,7 @@ from rest_framework.views import APIView
from util.bad_request_rate_limiter import BadRequestRateLimiter from util.bad_request_rate_limiter import BadRequestRateLimiter
from api_manager.permissions import ApiKeyHeaderPermission from api_manager.permissions import ApiKeyHeaderPermission
from api_manager.serializers import UserSerializer from api_manager.users.serializers import UserSerializer
from student.models import LoginFailures from student.models import LoginFailures
AUDIT_LOG = logging.getLogger("audit") AUDIT_LOG = logging.getLogger("audit")
...@@ -143,5 +143,3 @@ class SessionsDetail(APIView): ...@@ -143,5 +143,3 @@ class SessionsDetail(APIView):
AUDIT_LOG.info(u"API::User session terminated for user-id - {0}".format(user_id)) AUDIT_LOG.info(u"API::User session terminated for user-id - {0}".format(user_id))
session.flush() session.flush()
return Response(response_data, status=status.HTTP_204_NO_CONTENT) return Response(response_data, status=status.HTTP_204_NO_CONTENT)
return Response(response_data, status=status.HTTP_204_NO_CONTENT)
...@@ -10,13 +10,13 @@ ...@@ -10,13 +10,13 @@
from django.conf.urls import include, patterns, url from django.conf.urls import include, patterns, url
from api_manager import system_views from api_manager.system import views as system_views
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'^$', system_views.ApiDetail.as_view()), url(r'^$', system_views.ApiDetail.as_view()),
url(r'^system$', system_views.SystemDetail.as_view()), url(r'^system$', system_views.SystemDetail.as_view()),
url(r'^users/*', include('api_manager.users_urls')), url(r'^users/*', include('api_manager.users.urls')),
url(r'^groups/*', include('api_manager.groups_urls')), url(r'^groups/*', include('api_manager.groups.urls')),
url(r'^sessions/*', include('api_manager.sessions_urls')), url(r'^sessions/*', include('api_manager.sessions.urls')),
url(r'^courses/*', include('api_manager.courses_urls')), url(r'^courses/*', include('api_manager.courses.urls')),
) )
...@@ -3,7 +3,7 @@ from django.conf.urls import patterns, url ...@@ -3,7 +3,7 @@ from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patterns
from api_manager import users_views from api_manager.users import views as users_views
urlpatterns = patterns('', urlpatterns = patterns('',
url(r'/*$^', users_views.UsersList.as_view()), url(r'/*$^', users_views.UsersList.as_view()),
......
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