def test_event_field_mapping(self): django_tracker = DjangoTracker() data = {sentinel.key: sentinel.value} context = { 'username': sentinel.username, 'session': sentinel.session, 'ip': sentinel.ip, 'host': sentinel.host, 'agent': sentinel.agent, 'path': sentinel.path, 'user_id': sentinel.user_id, 'course_id': sentinel.course_id, 'org_id': sentinel.org_id, 'event_type': sentinel.event_type, 'client_id': sentinel.client_id, } with django_tracker.context('test', context): django_tracker.emit(sentinel.name, data) emitted_event = django_tracker.backends['mem'].get_event() expected_event = { 'event_type': sentinel.event_type, 'name': sentinel.name, 'context': { 'user_id': sentinel.user_id, 'course_id': sentinel.course_id, 'org_id': sentinel.org_id, 'path': sentinel.path, }, 'event': data, 'username': sentinel.username, 'event_source': 'server', 'time': FROZEN_TIME, 'agent': sentinel.agent, 'host': sentinel.host, 'ip': sentinel.ip, 'page': None, 'session': sentinel.session, } self.assertEqual(expected_event, emitted_event)
class SegmentTrackTestCase(TestCase): """Ensure emitted events contain the expected context values.""" def setUp(self): super(SegmentTrackTestCase, self).setUp() self.tracker = DjangoTracker() tracker.register_tracker(self.tracker) self.properties = {sentinel.key: sentinel.value} patcher = patch('track.segment.analytics.track') self.mock_segment_track = patcher.start() self.addCleanup(patcher.stop) def test_missing_key(self): segment.track(sentinel.user_id, sentinel.name, self.properties) self.assertFalse(self.mock_segment_track.called) @override_settings(LMS_SEGMENT_KEY=None) def test_null_key(self): segment.track(sentinel.user_id, sentinel.name, self.properties) self.assertFalse(self.mock_segment_track.called) @override_settings(LMS_SEGMENT_KEY="testkey") def test_missing_name(self): segment.track(sentinel.user_id, None, self.properties) self.assertFalse(self.mock_segment_track.called) @override_settings(LMS_SEGMENT_KEY="testkey") def test_track_without_tracking_context(self): segment.track(sentinel.user_id, sentinel.name, self.properties) self.assertTrue(self.mock_segment_track.called) args, kwargs = self.mock_segment_track.call_args expected_segment_context = {} self.assertEqual((sentinel.user_id, sentinel.name, self.properties, expected_segment_context), args) @ddt.unpack @ddt.data( ({ 'ip': sentinel.ip }, { 'ip': sentinel.provided_ip }, { 'ip': sentinel.ip }), ({ 'agent': sentinel.agent }, { 'userAgent': sentinel.provided_agent }, { 'userAgent': sentinel.agent }), ({ 'path': sentinel.path }, { 'page': { 'path': sentinel.provided_path } }, { 'page': { 'path': sentinel.path } }), ({ 'referer': sentinel.referer }, { 'page': { 'referrer': sentinel.provided_referer } }, { 'page': { 'referrer': sentinel.referer } }), ({ 'page': sentinel.page }, { 'page': { 'url': sentinel.provided_page } }, { 'page': { 'url': sentinel.page } }), ({ 'client_id': sentinel.client_id }, { 'Google Analytics': { 'clientId': sentinel.provided_client_id } }, { 'Google Analytics': { 'clientId': sentinel.client_id } }), ) @override_settings(LMS_SEGMENT_KEY="testkey") def test_track_context_with_stuff(self, tracking_context, provided_context, expected_segment_context): # Test first with tracking and no provided context. with self.tracker.context('test', tracking_context): segment.track(sentinel.user_id, sentinel.name, self.properties) args, kwargs = self.mock_segment_track.call_args self.assertEqual((sentinel.user_id, sentinel.name, self.properties, expected_segment_context), args) # Test with provided context and no tracking context. segment.track(sentinel.user_id, sentinel.name, self.properties, provided_context) args, kwargs = self.mock_segment_track.call_args self.assertEqual((sentinel.user_id, sentinel.name, self.properties, provided_context), args) # Test with provided context and also tracking context. with self.tracker.context('test', tracking_context): segment.track(sentinel.user_id, sentinel.name, self.properties, provided_context) self.assertTrue(self.mock_segment_track.called) args, kwargs = self.mock_segment_track.call_args self.assertEqual((sentinel.user_id, sentinel.name, self.properties, provided_context), args) @override_settings(LMS_SEGMENT_KEY="testkey") def test_track_with_standard_context(self): # Note that 'host' and 'path' will be urlparsed, so must be strings. tracking_context = { 'accept_language': sentinel.accept_language, 'referer': sentinel.referer, 'username': sentinel.username, 'session': sentinel.session, 'ip': sentinel.ip, 'host': 'hostname', 'agent': sentinel.agent, 'path': '/this/is/a/path', 'user_id': sentinel.user_id, 'course_id': sentinel.course_id, 'org_id': sentinel.org_id, 'client_id': sentinel.client_id, } with self.tracker.context('test', tracking_context): segment.track(sentinel.user_id, sentinel.name, self.properties) self.assertTrue(self.mock_segment_track.called) args, kwargs = self.mock_segment_track.call_args expected_segment_context = { 'ip': sentinel.ip, 'Google Analytics': { 'clientId': sentinel.client_id, }, 'userAgent': sentinel.agent, 'page': { 'path': '/this/is/a/path', 'referrer': sentinel.referer, 'url': '//hostname/this/is/a/path' # Synthesized URL value. } } self.assertEqual((sentinel.user_id, sentinel.name, self.properties, expected_segment_context), args)
class SegmentTrackTestCase(TestCase): """Ensure emitted events contain the expected context values.""" def setUp(self): super(SegmentTrackTestCase, self).setUp() self.tracker = DjangoTracker() tracker.register_tracker(self.tracker) self.properties = {sentinel.key: sentinel.value} patcher = patch('track.segment.analytics.track') self.mock_segment_track = patcher.start() self.addCleanup(patcher.stop) def test_missing_key(self): segment.track(sentinel.user_id, sentinel.name, self.properties) self.assertFalse(self.mock_segment_track.called) @override_settings(LMS_SEGMENT_KEY=None) def test_null_key(self): segment.track(sentinel.user_id, sentinel.name, self.properties) self.assertFalse(self.mock_segment_track.called) @override_settings(LMS_SEGMENT_KEY="testkey") def test_missing_name(self): segment.track(sentinel.user_id, None, self.properties) self.assertFalse(self.mock_segment_track.called) @override_settings(LMS_SEGMENT_KEY="testkey") def test_track_without_tracking_context(self): segment.track(sentinel.user_id, sentinel.name, self.properties) self.assertTrue(self.mock_segment_track.called) args, kwargs = self.mock_segment_track.call_args expected_segment_context = {} self.assertEqual((sentinel.user_id, sentinel.name, self.properties, expected_segment_context), args) @ddt.unpack @ddt.data( ({'ip': sentinel.ip}, {'ip': sentinel.provided_ip}, {'ip': sentinel.ip}), ({'agent': sentinel.agent}, {'userAgent': sentinel.provided_agent}, {'userAgent': sentinel.agent}), ({'path': sentinel.path}, {'page': {'path': sentinel.provided_path}}, {'page': {'path': sentinel.path}}), ({'referer': sentinel.referer}, {'page': {'referrer': sentinel.provided_referer}}, {'page': {'referrer': sentinel.referer}}), ({'page': sentinel.page}, {'page': {'url': sentinel.provided_page}}, {'page': {'url': sentinel.page}}), ({'client_id': sentinel.client_id}, {'Google Analytics': {'clientId': sentinel.provided_client_id}}, {'Google Analytics': {'clientId': sentinel.client_id}}), ) @override_settings(LMS_SEGMENT_KEY="testkey") def test_track_context_with_stuff(self, tracking_context, provided_context, expected_segment_context): # Test first with tracking and no provided context. with self.tracker.context('test', tracking_context): segment.track(sentinel.user_id, sentinel.name, self.properties) args, kwargs = self.mock_segment_track.call_args self.assertEqual((sentinel.user_id, sentinel.name, self.properties, expected_segment_context), args) # Test with provided context and no tracking context. segment.track(sentinel.user_id, sentinel.name, self.properties, provided_context) args, kwargs = self.mock_segment_track.call_args self.assertEqual((sentinel.user_id, sentinel.name, self.properties, provided_context), args) # Test with provided context and also tracking context. with self.tracker.context('test', tracking_context): segment.track(sentinel.user_id, sentinel.name, self.properties, provided_context) self.assertTrue(self.mock_segment_track.called) args, kwargs = self.mock_segment_track.call_args self.assertEqual((sentinel.user_id, sentinel.name, self.properties, provided_context), args) @override_settings(LMS_SEGMENT_KEY="testkey") def test_track_with_standard_context(self): # Note that 'host' and 'path' will be urlparsed, so must be strings. tracking_context = { 'accept_language': sentinel.accept_language, 'referer': sentinel.referer, 'username': sentinel.username, 'session': sentinel.session, 'ip': sentinel.ip, 'host': 'hostname', 'agent': sentinel.agent, 'path': '/this/is/a/path', 'user_id': sentinel.user_id, 'course_id': sentinel.course_id, 'org_id': sentinel.org_id, 'client_id': sentinel.client_id, } with self.tracker.context('test', tracking_context): segment.track(sentinel.user_id, sentinel.name, self.properties) self.assertTrue(self.mock_segment_track.called) args, kwargs = self.mock_segment_track.call_args expected_segment_context = { 'ip': sentinel.ip, 'Google Analytics': { 'clientId': sentinel.client_id, }, 'userAgent': sentinel.agent, 'page': { 'path': '/this/is/a/path', 'referrer': sentinel.referer, 'url': 'https://hostname/this/is/a/path' # Synthesized URL value. } } self.assertEqual((sentinel.user_id, sentinel.name, self.properties, expected_segment_context), args)