def test_handle_payment_logging(self, __): """ Ensure that we emit a log entry upon receipt of a payment notification, and create Source and PaymentEvent objects. """ basket = create_basket(owner=self.user, site=self.site) mixin = EdxOrderPlacementMixin() mixin.payment_processor = DummyProcessor(self.site) processor_name = DummyProcessor.NAME total = basket.total_incl_tax reference = basket.id with LogCapture(LOGGER_NAME) as logger: mixin.handle_payment({}, basket) logger.check_present(( LOGGER_NAME, 'INFO', 'payment_received: amount="{}", basket_id="{}", currency="{}", ' 'processor_name="{}", reference="{}", user_id="{}"'.format( total, basket.id, basket.currency, processor_name, reference, self.user.id))) # pylint: disable=protected-access # Validate a payment Source was created source_type = SourceType.objects.get(code=processor_name) label = self.user.username self.assert_basket_matches_source(basket, mixin._payment_sources[-1], source_type, reference, label) # Validate the PaymentEvent was created paid_type = PaymentEventType.objects.get(code='paid') self.assert_valid_payment_event_fields(mixin._payment_events[-1], total, paid_type, processor_name, reference)
def test_valid_payment_segment_logging(self, mock_track): """ Verify the "Payment Info Entered" Segment event is fired after payment info is validated """ basket = create_basket(owner=self.user, site=self.site) mixin = EdxOrderPlacementMixin() mixin.payment_processor = DummyProcessor(self.site) properties = {'checkout_id': basket.order_number} user_tracking_id, lms_client_id, lms_ip = parse_tracking_context( self.user) context = { 'ip': lms_ip, 'Google Analytics': { 'clientId': lms_client_id } } mixin.handle_payment({}, basket) # ensure that the only two Segment events fired are 'Product Added' and 'Payment Info Entered' self.assertEqual(mock_track.call_count, 2) mock_track.assert_called_with(user_tracking_id, 'Payment Info Entered', properties, context=context)
def test_payment_not_accepted_segment_logging(self, mock_track): """ Verify if the payment is not accepted, we still log the processor response """ tracking_context = { 'ga_client_id': 'test-client-id', 'lms_user_id': 'test-user-id', 'lms_ip': '127.0.0.1' } self.user.tracking_context = tracking_context self.user.save() basket = create_basket(owner=self.user, site=self.site) mixin = EdxOrderPlacementMixin() mixin.payment_processor = DummyProcessor(self.site) user_tracking_id, ga_client_id, lms_ip = parse_tracking_context( self.user) context = { 'ip': lms_ip, 'Google Analytics': { 'clientId': ga_client_id }, 'page': { 'url': 'https://testserver.fake/' }, } with self.assertRaises(Exception): mixin.handle_payment({}, basket) # Verify the correct events are fired to Segment calls = [] properties = translate_basket_line_for_segment(basket.lines.first()) properties['cart_id'] = basket.id calls.append( mock.call(user_tracking_id, 'Product Added', properties, context=context)) properties = { 'basket_id': basket.id, 'payment_error': 'Exception', 'success': False, 'processor_name': DummyProcessor.NAME, } calls.append( mock.call(user_tracking_id, 'Payment Processor Response', properties, context=context)) mock_track.assert_has_calls(calls)
def test_valid_payment_segment_logging(self, mock_track): """ Verify the "Payment Info Entered" Segment event is fired after payment info is validated """ tracking_context = {'ga_client_id': 'test-client-id', 'lms_user_id': 'test-user-id', 'lms_ip': '127.0.0.1'} self.user.tracking_context = tracking_context self.user.save() basket = create_basket(owner=self.user, site=self.site) mixin = EdxOrderPlacementMixin() mixin.payment_processor = DummyProcessor(self.site) user_tracking_id, ga_client_id, lms_ip = parse_tracking_context(self.user) context = { 'ip': lms_ip, 'Google Analytics': { 'clientId': ga_client_id }, 'page': { 'url': 'https://testserver.fake/' }, } mixin.handle_payment({}, basket) # Verify the correct events are fired to Segment calls = [] properties = translate_basket_line_for_segment(basket.lines.first()) properties['cart_id'] = basket.id calls.append(mock.call(user_tracking_id, 'Product Added', properties, context=context)) properties = { 'checkout_id': basket.order_number, 'step': 1, 'payment_method': 'Visa | ' + DummyProcessor.NAME, } calls.append(mock.call(user_tracking_id, 'Checkout Step Completed', properties, context=context)) properties['step'] = 2 calls.append(mock.call(user_tracking_id, 'Checkout Step Viewed', properties, context=context)) calls.append(mock.call(user_tracking_id, 'Checkout Step Completed', properties, context=context)) properties = {'checkout_id': basket.order_number} calls.append(mock.call(user_tracking_id, 'Payment Info Entered', properties, context=context)) mock_track.assert_has_calls(calls)
def test_handle_payment_logging(self, __): """ Ensure that we emit a log entry upon receipt of a payment notification, and create Source and PaymentEvent objects. """ user = factories.UserFactory() basket = factories.create_basket() basket.owner = user basket.save() mixin = EdxOrderPlacementMixin() mixin.payment_processor = DummyProcessor(self.site) processor_name = DummyProcessor.NAME total = basket.total_incl_tax reference = basket.id with LogCapture(LOGGER_NAME) as l: mixin.handle_payment({}, basket) l.check( ( LOGGER_NAME, 'INFO', 'payment_received: amount="{}", basket_id="{}", currency="{}", ' 'processor_name="{}", reference="{}", user_id="{}"'.format( total, basket.id, basket.currency, processor_name, reference, user.id ) ) ) # pylint: disable=protected-access # Validate a payment Source was created source_type = SourceType.objects.get(code=processor_name) label = user.username self.assert_basket_matches_source(basket, mixin._payment_sources[-1], source_type, reference, label) # Validate the PaymentEvent was created paid_type = PaymentEventType.objects.get(code='paid') self.assert_valid_payment_event_fields(mixin._payment_events[-1], total, paid_type, processor_name, reference)