def test_get_lms_footer_timeout(self): """Verify behavior in the event of a timeout while retrieving LMS footer.""" with mock.patch('requests.get', side_effect=requests.Timeout()): with mock.patch('ecommerce.extensions.api.data.logger.exception') as mock_logger: response = get_lms_footer() self.assertTrue(mock_logger.called) self.assertIsNone(response)
def test_get_lms_footer_failure(self): """ Verify None is returned on a non-200 status code. """ httpretty.register_uri(httpretty.GET, self.footer_url, status=404, content_type='application/json') response = get_lms_footer() self.assertIsNone(response)
def test_get_lms_footer_success(self): """Verify footer information is retrieved.""" content = { 'footer': 'edX Footer' } content_json = json.dumps(content) httpretty.register_uri(httpretty.GET, self.footer_url, body=content_json, content_type='application/json') response = json.loads(get_lms_footer()) self.assertEqual(response['footer'], 'edX Footer')
def test_get_lms_footer_timeout(self): """ Verify proper logger message is displayed in case of a time out. """ with mock.patch('requests.get', side_effect=requests.Timeout()): with LogCapture(LOGGER_NAME) as l: response = get_lms_footer() l.check(( LOGGER_NAME, 'ERROR', u'Failed to retrieve data for {lms_url} provider, connection timeout' .format(lms_url=settings.LMS_URL_ROOT))) self.assertIsNone(response)
def test_get_lms_footer_success(self): """ Verify footer information is retrieved. """ content = {'footer': 'edX Footer'} content_json = json.dumps(content) httpretty.register_uri(httpretty.GET, self.footer_url, body=content_json, content_type='application/json') response = json.loads(get_lms_footer()) self.assertEqual(response['footer'], 'edX Footer')
def get_context_data(self, **kwargs): context = super(CouponOfferView, self).get_context_data(**kwargs) footer = get_lms_footer() code = self.request.GET.get('code', None) if code is not None: voucher, product = get_voucher(code=code) valid_voucher, msg = voucher_is_valid(voucher, product, self.request) if valid_voucher: api = EdxRestApiClient(get_lms_url('api/courses/v1/'), ) try: course = api.courses(product.course_id).get() except SlumberHttpBaseException as e: logger.exception('Could not get course information. [%s]', e) return { 'error': _('Could not get course information. [{error}]'.format( error=e)), 'footer': footer } course['image_url'] = get_lms_url( course['media']['course_image']['uri']) stock_records = voucher.offers.first( ).benefit.range.catalog.stock_records.first() benefit_type = voucher.offers.first().benefit.type benefit_value = voucher.offers.first().benefit.value price = stock_records.price_excl_tax if benefit_type == 'Percentage': new_price = price - (price * (benefit_value / 100)) else: new_price = price - benefit_value if new_price < 0: new_price = 0.00 context.update({ 'benefit_type': benefit_type, 'benefit_value': benefit_value, 'course': course, 'code': code, 'price': price, 'new_price': "%.2f" % new_price, 'verified': (product.attr.certificate_type == 'verified'), 'footer': footer }) return context return {'error': msg, 'footer': footer} return {'error': _('This coupon code is invalid.'), 'footer': footer}
def test_get_lms_footer_conn_error(self): """ Verify proper logger message is displayed in case of a connection error. """ with mock.patch('requests.get', side_effect=requests.exceptions.ConnectionError()): with LogCapture(LOGGER_NAME) as l: response = get_lms_footer() l.check(( LOGGER_NAME, 'ERROR', u'Connection error occurred during getting data for {lms_url} provider' .format(lms_url=settings.LMS_URL_ROOT))) self.assertIsNone(response)
def get_context_data(self, **kwargs): context = super(CouponOfferView, self).get_context_data(**kwargs) footer = get_lms_footer() code = self.request.GET.get('code', None) if code is not None: voucher, product = get_voucher_from_code(code=code) valid_voucher, msg = voucher_is_valid(voucher, product, self.request) if valid_voucher: api = EdxRestApiClient( get_lms_url('api/courses/v1/'), ) try: course = api.courses(product.course_id).get() except SlumberHttpBaseException as e: logger.exception('Could not get course information. [%s]', e) return { 'error': _('Could not get course information. [{error}]'.format(error=e)), 'footer': footer } course['image_url'] = get_lms_url(course['media']['course_image']['uri']) benefit = voucher.offers.first().benefit stock_record = benefit.range.catalog.stock_records.first() price = stock_record.price_excl_tax context.update(get_voucher_discount_info(benefit, price)) if benefit.type == 'Percentage': new_price = price - (price * (benefit.value / 100)) else: new_price = price - benefit.value if new_price < 0: new_price = Decimal(0) context.update({ 'benefit': benefit, 'course': course, 'code': code, 'is_discount_value_percentage': benefit.type == 'Percentage', 'is_enrollment_code': benefit.type == Benefit.PERCENTAGE and benefit.value == 100.00, 'discount_value': "%.2f" % (price - new_price), 'price': price, 'new_price': "%.2f" % new_price, 'verified': (product.attr.certificate_type == 'verified'), 'verification_deadline': product.course.verification_deadline, 'footer': footer }) return context return { 'error': msg, 'footer': footer } return { 'error': _('This coupon code is invalid.'), 'footer': footer }
def test_get_lms_footer_timeout(self): """ Verify proper logger message is displayed in case of a time out. """ with mock.patch('requests.get', side_effect=requests.Timeout()): with LogCapture(LOGGER_NAME) as l: response = get_lms_footer() l.check( ( LOGGER_NAME, 'ERROR', u'Failed to retrieve data for {lms_url} provider, connection timeout'.format( lms_url=settings.LMS_URL_ROOT ) ) ) self.assertIsNone(response)
def test_get_lms_footer_conn_error(self): """ Verify proper logger message is displayed in case of a connection error. """ with mock.patch('requests.get', side_effect=requests.exceptions.ConnectionError()): with LogCapture(LOGGER_NAME) as l: response = get_lms_footer() l.check( ( LOGGER_NAME, 'ERROR', u'Connection error occurred during getting data for {lms_url} provider'.format( lms_url=settings.LMS_URL_ROOT ) ) ) self.assertIsNone(response)
def get_context_data(self, **kwargs): context = super(BasketSummaryView, self).get_context_data(**kwargs) lines = context.get('line_list', []) api = EdxRestApiClient(get_lms_url('api/courses/v1/')) for line in lines: course_id = line.product.course_id # Get each course type so we can display to the user at checkout. try: line.certificate_type = get_certificate_type_display_value(line.product.attr.certificate_type) except ValueError: line.certificate_type = None cache_key = 'courses_api_detail_{}'.format(course_id) cache_hash = hashlib.md5(cache_key).hexdigest() try: course = cache.get(cache_hash) if not course: course = api.courses(course_id).get() course['image_url'] = get_lms_url(course['media']['course_image']['uri']) cache.set(cache_hash, course, settings.COURSES_API_CACHE_TIMEOUT) line.course = course except (ConnectionError, SlumberBaseException, Timeout): logger.exception('Failed to retrieve data from Course API for course [%s].', course_id) if line.has_discount: line.discount_percentage = line.discount_value / line.unit_price_incl_tax * Decimal(100) else: line.discount_percentage = 0 context.update({ 'payment_processors': self.get_payment_processors(), 'homepage_url': get_lms_url(''), 'footer': get_lms_footer(), 'lines': lines, 'faq_url': get_lms_url('') + '/verified-certificate', }) return context
def test_get_lms_footer_failure(self): """Verify None is returned on a non-200 status code while retrieving LMS footer.""" httpretty.register_uri(httpretty.GET, self.footer_url, status=404, content_type='application/json') response = get_lms_footer() self.assertIsNone(response)