def test_send_reminder_email_error(self, mock_email): """ Test that we log an appropriate message if the code reminder email cannot be sent. """ mock_email.side_effect = Exception('Ignore me - reminder') serializer = CouponCodeRemindSerializer( data=self.data, context={'coupon': self.coupon}) expected = [ (self.LOGGER_NAME, 'ERROR', '[Offer Reminder] Email for offer_assignment_id: {} with greeting \'{}\' and closing \'{}\' raised ' 'exception: Exception(\'Ignore me - reminder\',)'.format( self.offer_assignment.id, self.GREETING, self.CLOSING, )), ] with self.assertRaises(Exception): with LogCapture(self.LOGGER_NAME) as log: serializer._trigger_email_sending_task( # pylint: disable=protected-access greeting=self.GREETING, closing=self.CLOSING, assigned_offer=self.offer_assignment, redeemed_offer_count=3, total_offer_count=5, ) log.check_present(*expected)
def test_send_assigned_offer_reminder_email_args(self, mock_remind_email): """ Test that the code_expiration_date passed is equal to coupon batch end date """ serializer = CouponCodeRemindSerializer( data=self.data, context={'coupon': self.coupon}) serializer._trigger_email_sending_task( # pylint: disable=protected-access subject=self.SUBJECT, greeting=self.GREETING, closing=self.CLOSING, assigned_offer=self.offer_assignment, redeemed_offer_count=3, total_offer_count=5, sender_alias=self.SENDER_ALIAS, ) expected_expiration_date = self.coupon.attr.coupon_vouchers.vouchers.first( ).end_datetime mock_remind_email.assert_called_with( subject=self.SUBJECT, greeting=self.GREETING, closing=self.CLOSING, learner_email=self.offer_assignment.user_email, code=self.offer_assignment.code, redeemed_offer_count=mock.ANY, total_offer_count=mock.ANY, code_expiration_date=expected_expiration_date.strftime( '%d %B, %Y %H:%M %Z'), sender_alias=self.SENDER_ALIAS)
def test_send_reminder_email_error(self, mock_email): """ Test that we log an appropriate message if the code reminder email cannot be sent. """ mock_email.side_effect = Exception('Ignore me - reminder') serializer = CouponCodeRemindSerializer( data=self.data, context={'coupon': self.coupon}) expected = [ (self.LOGGER_NAME, 'ERROR', '[Offer Reminder] Email for offer_assignment_id: {} with subject \'{}\', greeting \'{}\' ' 'closing \'{}\' attachments {}, and base_enterprise_url \'{}\' raised exception: {}' .format(self.offer_assignment.id, self.SUBJECT, self.GREETING, self.CLOSING, self.ATTACHMENTS, self.BASE_ENTERPRISE_URL, repr(Exception('Ignore me - reminder')))), ] with self.assertRaises(Exception): with LogCapture(self.LOGGER_NAME) as log: serializer._trigger_email_sending_task( # pylint: disable=protected-access subject=self.SUBJECT, greeting=self.GREETING, closing=self.CLOSING, assigned_offer=self.offer_assignment, redeemed_offer_count=3, total_offer_count=5, sender_alias=self.SENDER_ALIAS, reply_to=self.REPLY_TO, attachments=self.ATTACHMENTS, base_enterprise_url=self.BASE_ENTERPRISE_URL, ) log.check_present(*expected)
def remind(self, request, pk): # pylint: disable=unused-argument """ Remind users of pending offer assignments by email. """ coupon = self.get_object() self._validate_coupon_availablity(coupon, 'Coupon is not available for code remind') subject = request.data.pop('template_subject', '') greeting = request.data.pop('template_greeting', '') closing = request.data.pop('template_closing', '') template_id = request.data.pop('template_id', None) template = OfferAssignmentEmailTemplates.get_template(template_id) enterprise_customer = coupon.attr.enterprise_customer_uuid self._validate_email_fields(subject, greeting, closing) if request.data.get('assignments'): assignments = request.data.get('assignments') else: # If no assignment is passed, send reminder to all assignments associated with the coupon. vouchers = coupon.attr.coupon_vouchers.vouchers.all() code_filter = request.data.get('code_filter') if not code_filter: raise serializers.ValidationError('code_filter must be specified') if code_filter == VOUCHER_NOT_REDEEMED: assignment_usages = self._get_not_redeemed_usages(vouchers) elif code_filter == VOUCHER_PARTIAL_REDEEMED: assignment_usages = self._get_partial_redeemed_usages(vouchers) else: raise serializers.ValidationError('Invalid code_filter specified: {}'.format(code_filter)) assignments = [ { 'code': assignment['code'], 'email': assignment['user_email'] } for assignment in assignment_usages ] serializer = CouponCodeRemindSerializer( data=assignments, many=True, context={ 'coupon': coupon, 'subject': subject, 'greeting': greeting, 'closing': closing, } ) if serializer.is_valid(): serializer.save() # Create a record of the email sent self._create_offer_assignment_email_sent_record(enterprise_customer, REMIND, template) return Response(serializer.data, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def remind(self, request, pk): # pylint: disable=unused-argument """ Remind users of pending offer assignments by email. """ coupon = self.get_object() email_template = request.data.pop('template', None) if not email_template: log_message_and_raise_validation_error( str('Template is required.')) if request.data.get('assignments'): assignments = request.data.get('assignments') else: # If no assignment is passed, send reminder to all assignments associated with the coupon. vouchers = coupon.attr.coupon_vouchers.vouchers.all() code_filter = request.data.get('code_filter') if not code_filter: raise serializers.ValidationError( 'code_filter must be specified') if code_filter == VOUCHER_NOT_REDEEMED: assignment_usages = self._get_not_redeemed_usages(vouchers) elif code_filter == VOUCHER_PARTIAL_REDEEMED: assignment_usages = self._get_partial_redeemed_usages(vouchers) else: raise serializers.ValidationError( 'Invalid code_filter specified: {}'.format(code_filter)) assignments = [{ 'code': assignment['code'], 'email': assignment['user_email'] } for assignment in assignment_usages] serializer = CouponCodeRemindSerializer(data=assignments, many=True, context={ 'coupon': coupon, 'template': email_template }) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def remind(self, request, pk): # pylint: disable=unused-argument """ Remind users of pending offer assignments by email. """ coupon = self.get_object() email_template = request.data.pop('template', None) if not email_template: log_message_and_raise_validation_error( str('Template is required.')) serializer = CouponCodeRemindSerializer( data=request.data.get('assignments'), many=True, context={ 'coupon': coupon, 'template': email_template }) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)