Commit 58134459 by asadiqbal Committed by Asad Iqbal

ENT-178: Fix validation of seat types, catalog_query and course_catalog

parent 453092d1
......@@ -239,7 +239,7 @@ class CouponMixin(object):
partner = PartnerFactory(name='Tester')
if client is None:
client, __ = BusinessClient.objects.get_or_create(name='Test Client')
if catalog is None and not (catalog_query and course_seat_types):
if catalog is None and not ((catalog_query or course_catalog) and course_seat_types):
catalog = Catalog.objects.create(partner=partner)
if code is not '':
quantity = 1
......
......@@ -138,6 +138,7 @@ class EntitlementsTests(EnterpriseServiceMockMixin, CourseCatalogServiceMockMixi
title=coupon_title,
quantity=quantity,
course_catalog=course_catalog_id,
course_seat_types='verified'
)
return course_catalog_coupon
......
......@@ -2,7 +2,7 @@ from oscar.apps.offer.admin import * # pylint: disable=unused-import,wildcard-i
class RangeAdminExtended(admin.ModelAdmin):
list_display = ('name', 'catalog', 'course_catalog',)
list_display = ('name', 'catalog', 'catalog_query', 'course_catalog', 'course_seat_types')
raw_id_fields = ('catalog',)
search_fields = ['name', 'course_catalog']
......
......@@ -208,16 +208,19 @@ class Range(AbstractRange):
def clean(self):
""" Validation for model fields. """
if self.catalog and (self.catalog_query or self.course_seat_types):
if self.catalog and (self.course_catalog or self.catalog_query or self.course_seat_types):
log_message_and_raise_validation_error(
'Failed to create Range. Catalog and dynamic catalog fields may not be set in the same range.'
)
# Both catalog_query and course_seat_types must be set or empty
error_message = 'Failed to create Range. Both catalog_query and course_seat_types fields must be set.'
if self.catalog_query and not self.course_seat_types:
error_message = 'Failed to create Range. Either catalog_query or course_catalog must be given but not both ' \
'and course_seat_types fields must be set.'
if self.catalog_query and self.course_catalog:
log_message_and_raise_validation_error(error_message)
elif (self.catalog_query or self.course_catalog) and not self.course_seat_types:
log_message_and_raise_validation_error(error_message)
elif self.course_seat_types and not self.catalog_query:
elif self.course_seat_types and not (self.catalog_query or self.course_catalog):
log_message_and_raise_validation_error(error_message)
if self.course_seat_types:
......
......@@ -156,7 +156,7 @@ class RangeTests(CouponMixin, CourseCatalogServiceMockMixin, CourseCatalogTestMi
catalog_id=course_catalog_id, catalog_query=catalog_query
)
self.range.catalog_query = None
self.range.course_seat_types = None
self.range.course_seat_types = 'verified'
self.range.course_catalog = course_catalog_id
self.range.save()
......@@ -174,7 +174,7 @@ class RangeTests(CouponMixin, CourseCatalogServiceMockMixin, CourseCatalogTestMi
__, seat = self.create_course_and_seat()
course_catalog_id = 1
self.range.catalog_query = None
self.range.course_seat_types = None
self.range.course_seat_types = 'verified'
self.range.course_catalog = course_catalog_id
self.range.save()
......@@ -204,9 +204,17 @@ class RangeTests(CouponMixin, CourseCatalogServiceMockMixin, CourseCatalogTestMi
{'catalog_query': '*:*'},
{'catalog_query': '', 'course_seat_types': ['verified']},
{'course_seat_types': ['verified']},
{'course_catalog': '', 'course_seat_types': 'verified'},
{'course_catalog': '20'},
{'course_catalog': '20', 'catalog_query': '*:*'},
{'course_catalog': '20', 'catalog_query': '*:*', 'course_seat_types': 'verified'},
)
def test_creating_range_with_wrong_data(self, data):
"""Verify creating range without catalog_query or catalog_seat_types raises ValidationError."""
"""
Verify creating range raises ValidationError:
- without course_catalog or catalog_query or catalog_seat_types.
- with both given course_catalog and catalog_query.
"""
with self.assertRaises(ValidationError):
Range.objects.create(**data)
......@@ -232,6 +240,20 @@ class RangeTests(CouponMixin, CourseCatalogServiceMockMixin, CourseCatalogTestMi
self.assertEqual(new_range.course_seat_types, data['course_seat_types'])
self.assertEqual(new_range.catalog, None)
def test_creating_dynamic_range_with_course_catalog(self):
"""
Verify creating range with course_catalog and catalog_seat_types creates
range with those values.
"""
data = {
'course_catalog': '10',
'course_seat_types': 'verified,professional'
}
new_range = Range.objects.create(**data)
self.assertEqual(new_range.course_catalog, data['course_catalog'])
self.assertEqual(new_range.course_seat_types, data['course_seat_types'])
self.assertEqual(new_range.catalog, None)
@ddt.data(5, 'credit,verified', 'verified,not_allowed_value')
def test_creating_range_with_wrong_course_seat_types(self, course_seat_types):
""" Verify creating range with incorrect course seat types will raise exception. """
......
......@@ -139,11 +139,12 @@ class UtilTests(CouponMixin, CourseCatalogMockMixin, CourseCatalogTestMixin, Lms
course_seat_types=course_seat_types
)
def create_course_catalog_coupon(self, coupon_title, quantity, course_catalog):
def create_course_catalog_coupon(self, coupon_title, quantity, course_catalog, course_seat_types):
return self.create_coupon(
title=coupon_title,
quantity=quantity,
course_catalog=course_catalog,
course_seat_types=course_seat_types,
)
def use_voucher(self, order_num, voucher, user):
......@@ -263,6 +264,7 @@ class UtilTests(CouponMixin, CourseCatalogMockMixin, CourseCatalogTestMixin, Lms
coupon_title=coupon_title,
quantity=quantity,
course_catalog=course_catalog,
course_seat_types='verified',
)
self.assertEqual(course_catalog_coupon.title, coupon_title)
......@@ -272,18 +274,6 @@ class UtilTests(CouponMixin, CourseCatalogMockMixin, CourseCatalogTestMixin, Lms
course_catalog_voucher_range = course_catalog_vouchers.first().offers.first().benefit.range
self.assertEqual(course_catalog_voucher_range.course_catalog, course_catalog)
self.data.update({
'name': coupon_title,
'benefit_value': course_catalog_vouchers.first().offers.first().benefit.value,
'code': course_catalog_vouchers.first().code,
'quantity': quantity,
'course_catalog': course_catalog,
'catalog': None,
'course_seat_types': None
})
with self.assertRaises(IntegrityError):
create_vouchers(**self.data)
def assert_report_first_row(self, row, coupon, voucher):
"""
Verify that the first row fields contain the right data.
......
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