This adds the ability to get a list of detailed courses based on their keys provided in the newly added `keys` query param in the `GET /courses/v1/courses/` endpoint.
196 lines
5.5 KiB
Python
196 lines
5.5 KiB
Python
"""
|
|
Tests for Course API forms.
|
|
"""
|
|
|
|
from itertools import product
|
|
from urllib.parse import urlencode
|
|
|
|
import ddt
|
|
from django.contrib.auth.models import AnonymousUser
|
|
from django.http import QueryDict
|
|
|
|
from common.djangoapps.student.tests.factories import UserFactory
|
|
from openedx.core.djangoapps.util.test_forms import FormTestMixin
|
|
from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase # lint-amnesty, pylint: disable=wrong-import-order
|
|
from xmodule.modulestore.tests.factories import CourseFactory # lint-amnesty, pylint: disable=wrong-import-order
|
|
|
|
from ..forms import CourseDetailGetForm, CourseIdListGetForm, CourseListGetForm
|
|
|
|
|
|
class UsernameTestMixin:
|
|
"""
|
|
Tests the username Form field.
|
|
"""
|
|
|
|
def test_no_user_param_anonymous_access(self):
|
|
self.set_up_data(AnonymousUser())
|
|
self.form_data.pop('username')
|
|
self.assert_valid(self.cleaned_data)
|
|
|
|
def test_no_user_param(self):
|
|
self.set_up_data(AnonymousUser())
|
|
self.form_data.pop('username')
|
|
self.assert_valid(self.cleaned_data)
|
|
|
|
|
|
@ddt.ddt
|
|
class TestCourseListGetForm(FormTestMixin, UsernameTestMixin, SharedModuleStoreTestCase):
|
|
"""
|
|
Tests for CourseListGetForm
|
|
"""
|
|
FORM_CLASS = CourseListGetForm
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
|
|
cls.course = CourseFactory.create()
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
self.student = UserFactory.create()
|
|
self.set_up_data(self.student)
|
|
|
|
def set_up_data(self, user):
|
|
"""
|
|
Sets up the initial form data and the expected clean data.
|
|
"""
|
|
self.initial = {'requesting_user': user}
|
|
self.form_data = QueryDict(
|
|
urlencode({
|
|
'username': user.username,
|
|
}),
|
|
mutable=True,
|
|
)
|
|
self.cleaned_data = {
|
|
'username': user.username,
|
|
'org': '',
|
|
'mobile': None,
|
|
'search_term': '',
|
|
'filter_': None,
|
|
'permissions': set(),
|
|
'active_only': None,
|
|
'course_keys': set(),
|
|
}
|
|
|
|
def test_basic(self):
|
|
self.assert_valid(self.cleaned_data)
|
|
|
|
def test_org(self):
|
|
org_value = 'test org name'
|
|
self.form_data['org'] = org_value
|
|
self.cleaned_data['org'] = org_value
|
|
self.assert_valid(self.cleaned_data)
|
|
|
|
@ddt.data(
|
|
*product(
|
|
[('mobile', 'mobile_available')],
|
|
[(True, True), (False, False), ('1', True), ('0', False), (None, None)],
|
|
)
|
|
)
|
|
@ddt.unpack
|
|
def test_filter(self, param_field_name, param_field_value):
|
|
param_name, field_name = param_field_name
|
|
param_value, field_value = param_field_value
|
|
|
|
self.form_data[param_name] = param_value
|
|
self.cleaned_data[param_name] = field_value
|
|
if field_value is not None:
|
|
self.cleaned_data['filter_'] = {field_name: field_value}
|
|
|
|
self.assert_valid(self.cleaned_data)
|
|
|
|
def test_invalid_course_keys(self):
|
|
"""
|
|
Verify form checks for validity of course keys provided
|
|
"""
|
|
|
|
self.form_data['course_keys'] = 'course-v1:edX+DemoX+Demo_Course,invalid_course_key'
|
|
self.assert_error('course_keys', "'invalid_course_key' is not a valid course key.")
|
|
|
|
|
|
class TestCourseIdListGetForm(FormTestMixin, UsernameTestMixin, SharedModuleStoreTestCase): # lint-amnesty, pylint: disable=missing-class-docstring
|
|
FORM_CLASS = CourseIdListGetForm
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
|
|
cls.course = CourseFactory.create()
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
self.student = UserFactory.create()
|
|
self.set_up_data(self.student)
|
|
|
|
def set_up_data(self, user):
|
|
"""
|
|
Sets up the initial form data and the expected clean data.
|
|
"""
|
|
self.initial = {'requesting_user': user}
|
|
self.form_data = QueryDict(
|
|
urlencode({
|
|
'username': user.username,
|
|
'role': 'staff',
|
|
}),
|
|
mutable=True,
|
|
)
|
|
self.cleaned_data = {
|
|
'username': user.username,
|
|
'role': 'staff',
|
|
}
|
|
|
|
def test_basic(self):
|
|
self.assert_valid(self.cleaned_data)
|
|
|
|
|
|
class TestCourseDetailGetForm(FormTestMixin, UsernameTestMixin, SharedModuleStoreTestCase):
|
|
"""
|
|
Tests for CourseDetailGetForm
|
|
"""
|
|
FORM_CLASS = CourseDetailGetForm
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super().setUpClass()
|
|
|
|
cls.course = CourseFactory.create()
|
|
|
|
def setUp(self):
|
|
super().setUp()
|
|
|
|
self.student = UserFactory.create()
|
|
self.set_up_data(self.student)
|
|
|
|
def set_up_data(self, user):
|
|
"""
|
|
Sets up the initial form data and the expected clean data.
|
|
"""
|
|
self.initial = {'requesting_user': user}
|
|
self.form_data = QueryDict(
|
|
urlencode({
|
|
'username': user.username,
|
|
'course_key': str(self.course.id),
|
|
}),
|
|
mutable=True,
|
|
)
|
|
self.cleaned_data = {
|
|
'username': user.username,
|
|
'course_key': self.course.id,
|
|
}
|
|
|
|
def test_basic(self):
|
|
self.assert_valid(self.cleaned_data)
|
|
|
|
#-- course key --#
|
|
|
|
def test_no_course_key_param(self):
|
|
self.form_data.pop('course_key')
|
|
self.assert_error('course_key', "This field is required.")
|
|
|
|
def test_invalid_course_key(self):
|
|
self.form_data['course_key'] = 'invalid_course_key'
|
|
self.assert_error('course_key', "'invalid_course_key' is not a valid course key.")
|