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