Пример #1
0
    def test_user_track_with_middleware(self):
        middleware = TrackMiddleware()
        request = self.request_factory.get('/event', {
            'page': self.url_with_course,
            'event_type': sentinel.event_type,
            'event': {}
        })
        middleware.process_request(request)
        try:
            views.user_track(request)

            expected_event = {
                'username': '******',
                'session': '',
                'ip': '127.0.0.1',
                'event_source': 'browser',
                'event_type': str(sentinel.event_type),
                'event': '{}',
                'agent': '',
                'page': self.url_with_course,
                'time': expected_time,
                'host': 'testserver',
                'context': {
                    'course_id': 'foo/bar/baz',
                    'org_id': 'foo',
                    'user_id': '',
                    'path': u'/event'
                },
            }
        finally:
            middleware.process_response(request, None)

        self.mock_tracker.send.assert_called_once_with(expected_event)
Пример #2
0
    def setUp(self):
        self.track_middleware = TrackMiddleware()
        self.request_factory = RequestFactory()

        patcher = patch('track.views.server_track')
        self.mock_server_track = patcher.start()
        self.addCleanup(patcher.stop)
Пример #3
0
    def test_server_track_with_middleware_and_google_analytics_cookie(self):
        middleware = TrackMiddleware()
        request = self.request_factory.get(self.path_with_course)
        request.COOKIES['_ga'] = 'GA1.2.1033501218.1368477899'
        middleware.process_request(request)
        # The middleware emits an event, reset the mock to ignore it since we aren't testing that feature.
        self.mock_tracker.reset_mock()
        try:
            views.server_track(request, str(sentinel.event_type), '{}')

            expected_event = {
                'username': '******',
                'ip': '127.0.0.1',
                'event_source': 'server',
                'event_type': str(sentinel.event_type),
                'event': '{}',
                'agent': '',
                'page': None,
                'time': expected_time,
                'host': 'testserver',
                'context': {
                    'user_id': '',
                    'course_id': u'foo/bar/baz',
                    'org_id': 'foo',
                    'path': u'/courses/foo/bar/baz/xmod/'
                },
            }
        finally:
            middleware.process_response(request, None)

        self.mock_tracker.send.assert_called_once_with(expected_event)
Пример #4
0
    def test_server_track_with_middleware(self):
        middleware = TrackMiddleware()
        request = self.request_factory.get(self.path_with_course)
        middleware.process_request(request)
        # The middleware emits an event, reset the mock to ignore it since we aren't testing that feature.
        self.mock_tracker.reset_mock()
        try:
            views.server_track(request, str(sentinel.event_type), '{}')

            expected_event = {
                'accept_language': '',
                'referer': '',
                'username': '******',
                'ip': '127.0.0.1',
                'event_source': 'server',
                'event_type': str(sentinel.event_type),
                'event': '{}',
                'agent': '',
                'page': None,
                'time': FROZEN_TIME,
                'host': 'testserver',
                'context': {
                    'user_id': '',
                    'course_id': u'foo/bar/baz',
                    'org_id': 'foo',
                    'path': u'/courses/foo/bar/baz/xmod/'
                },
            }
        finally:
            middleware.process_response(request, None)

        self.assert_mock_tracker_call_matches(expected_event)
Пример #5
0
    def test_success(self, course_id):
        middleware = TrackMiddleware()

        request = self.create_request(
            data=self.create_segmentio_event_json(data={'foo': 'bar'}, course_id=course_id),
            content_type='application/json'
        )
        User.objects.create(pk=USER_ID, username=str(sentinel.username))

        middleware.process_request(request)
        # The middleware normally emits an event, make sure it doesn't in this case.
        self.assert_no_events_emitted()
        try:
            response = segmentio.segmentio_event(request)
            self.assertEquals(response.status_code, 200)

            expected_event = {
                'accept_language': '',
                'referer': '',
                'username': str(sentinel.username),
                'ip': '',
                'session': '',
                'event_source': 'mobile',
                'event_type': str(sentinel.name),
                'name': str(sentinel.name),
                'event': {'foo': 'bar'},
                'agent': str(sentinel.user_agent),
                'page': None,
                'time': datetime.strptime("2014-08-27T16:33:39.215Z", "%Y-%m-%dT%H:%M:%S.%fZ"),
                'host': 'testserver',
                'context': {
                    'application': {
                        'name': 'edx.mobile.android',
                        'version': '1.0.1',
                    },
                    'user_id': USER_ID,
                    'course_id': course_id,
                    'org_id': u'foo',
                    'path': ENDPOINT,
                    'client': {
                        'library': {
                            'name': 'test-app',
                            'version': 'unknown'
                        },
                        'app': {
                            'version': '1.0.1',
                        },
                    },
                    'received_at': datetime.strptime("2014-08-27T16:33:39.100Z", "%Y-%m-%dT%H:%M:%S.%fZ"),
                },
            }
        finally:
            middleware.process_response(request, None)

        assert_event_matches(expected_event, self.get_event())
Пример #6
0
    def test_user_track_with_middleware_and_processors(self):
        self.recreate_tracker()

        middleware = TrackMiddleware()
        payload = '{"foo": "bar"}'
        user_id = 1
        request = self.request_factory.get(
            '/event', {
                'page': self.url_with_course,
                'event_type': sentinel.event_type,
                'event': payload
            })
        request.user = User.objects.create(pk=user_id,
                                           username=str(sentinel.username))
        request.META['REMOTE_ADDR'] = '10.0.0.1'
        request.META['HTTP_REFERER'] = str(sentinel.referer)
        request.META['HTTP_ACCEPT_LANGUAGE'] = str(sentinel.accept_language)
        request.META['HTTP_USER_AGENT'] = str(sentinel.user_agent)
        request.META['SERVER_NAME'] = 'testserver2'
        middleware.process_request(request)
        try:
            views.user_track(request)

            expected_event = {
                'accept_language': str(sentinel.accept_language),
                'referer': str(sentinel.referer),
                'username': str(sentinel.username),
                'session': '',
                'ip': '10.0.0.1',
                'event_source': 'browser',
                'event_type': str(sentinel.event_type),
                'name': str(sentinel.event_type),
                'event': payload,
                'agent': str(sentinel.user_agent),
                'page': self.url_with_course,
                'time': FROZEN_TIME,
                'host': 'testserver2',
                'context': {
                    'course_id': 'foo/bar/baz',
                    'org_id': 'foo',
                    'user_id': user_id,
                    'path': u'/event'
                },
            }
        finally:
            middleware.process_response(request, None)

        actual_event = self.get_event()
        assert_event_matches(expected_event, actual_event)
Пример #7
0
    def test_server_track_with_middleware_and_google_analytics_cookie(self):
        middleware = TrackMiddleware()
        request = self.request_factory.get(self.path_with_course)
        request.COOKIES['_ga'] = 'GA1.2.1033501218.1368477899'
        middleware.process_request(request)
        # The middleware emits an event, reset the mock to ignore it since we aren't testing that feature.
        self.mock_tracker.reset_mock()
        try:
            views.server_track(request, str(sentinel.event_type), '{}')

            expected_event = {
                'timestamp': FROZEN_TIME,
                'data': '{"GET": {}, "POST": {}}',
                'name': self.path_with_course,
                'context': {
                    'username': '******',
                    'user_id': '',
                    'accept_language': '',
                    'ip': '127.0.0.1',
                    'org_id': 'foo',
                    'agent': '',
                    'event_source': 'server',
                    'host': 'testserver',
                    'session': '',
                    'referer': '',
                    'client_id': '1033501218.1368477899',
                    'course_id': 'foo/bar/baz',
                    'path': self.path_with_course,
                    'page': None
                }
            }

        finally:
            middleware.process_response(request, None)

        actual_event = self.get_event()
        assert_event_matches(expected_event,
                             actual_event,
                             tolerate={
                                 'string_payload',
                             })
Пример #8
0
    def test_success(self, course_id):
        middleware = TrackMiddleware()

        request = self.create_request(data=self.create_segmentio_event_json(
            event_type=str(sentinel.event_type),
            event={'foo': 'bar'},
            course_id=course_id),
                                      content_type='application/json')
        User.objects.create(pk=USER_ID, username=str(sentinel.username))

        middleware.process_request(request)
        # The middleware normally emits an event, make sure it doesn't in this case.
        self.assertFalse(self.mock_tracker.send.called)  # pylint: disable=maybe-no-member
        try:
            response = segmentio.track_segmentio_event(request)
            self.assertEquals(response.status_code, 200)

            expected_event = {
                'username':
                str(sentinel.username),
                'ip':
                '',
                'event_source':
                'mobile',
                'event_type':
                str(sentinel.event_type),
                'name':
                str(sentinel.name),
                'event': {
                    'foo': 'bar'
                },
                'agent':
                str(sentinel.user_agent),
                'page':
                None,
                'time':
                datetime.strptime("2014-08-27T16:33:39.215Z",
                                  "%Y-%m-%dT%H:%M:%S.%fZ"),
                'host':
                'testserver',
                'context': {
                    'user_id':
                    USER_ID,
                    'course_id':
                    course_id,
                    'org_id':
                    'foo',
                    'path':
                    ENDPOINT,
                    'client': {
                        'library': {
                            'name': 'unknown',
                            'version': 'unknown'
                        },
                        'userAgent': str(sentinel.user_agent)
                    },
                    'received_at':
                    datetime.strptime("2014-08-27T16:33:39.100Z",
                                      "%Y-%m-%dT%H:%M:%S.%fZ"),
                },
            }
        finally:
            middleware.process_response(request, None)

        self.mock_tracker.send.assert_called_once_with(expected_event)  # pylint: disable=maybe-no-member
Пример #9
0
    def test_previous_builds(
        self,
        requested_skip_interval,
        expected_skip_interval,
        seek_type_key,
        seek_type,
        expected_seek_type,
        name,
        expected_name,
        platform,
        version,
    ):
        """
        Test backwards compatibility of previous app builds

        iOS version 1.0.02: Incorrectly emits the skip back 30 seconds as +30
        instead of -30.
        Android version 1.0.02: Skip and slide were both being returned as a
        skip. Skip or slide is determined by checking if the skip time is == -30
        Additionally, for both of the above mentioned versions, edx.video.seeked
        was sent instead of edx.video.position.changed
        """
        course_id = 'foo/bar/baz'
        middleware = TrackMiddleware()
        input_payload = {
            "code": "mobile",
            "new_time": 89.699177437,
            "old_time": 119.699177437,
            seek_type_key: seek_type,
            "requested_skip_interval": requested_skip_interval,
            'module_id': 'i4x://foo/bar/baz/some_module',
        }
        request = self.create_request(data=self.create_segmentio_event_json(
            name=name,
            data=input_payload,
            context={
                'open_in_browser_url':
                'https://testserver/courses/foo/bar/baz/courseware/Week_1/Activity/2',
                'course_id': course_id,
                'application': {
                    'name': platform,
                    'version': version,
                    'component': 'videoplayer'
                }
            },
        ),
                                      content_type='application/json')
        User.objects.create(pk=SEGMENTIO_TEST_USER_ID,
                            username=str(sentinel.username))

        middleware.process_request(request)
        try:
            response = segmentio.segmentio_event(request)
            self.assertEquals(response.status_code, 200)

            expected_event = {
                'accept_language':
                '',
                'referer':
                '',
                'username':
                str(sentinel.username),
                'ip':
                '',
                'session':
                '',
                'event_source':
                'mobile',
                'event_type':
                "seek_video",
                'name':
                expected_name,
                'agent':
                str(sentinel.user_agent),
                'page':
                'https://testserver/courses/foo/bar/baz/courseware/Week_1/Activity',
                'time':
                datetime.strptime("2014-08-27T16:33:39.215Z",
                                  "%Y-%m-%dT%H:%M:%S.%fZ"),
                'host':
                'testserver',
                'context': {
                    'user_id':
                    SEGMENTIO_TEST_USER_ID,
                    'course_id':
                    course_id,
                    'org_id':
                    'foo',
                    'path':
                    SEGMENTIO_TEST_ENDPOINT,
                    'client': {
                        'library': {
                            'name': 'test-app',
                            'version': 'unknown'
                        },
                        'app': {
                            'version': '1.0.1',
                        },
                    },
                    'application': {
                        'name': platform,
                        'version': version,
                        'component': 'videoplayer'
                    },
                    'received_at':
                    datetime.strptime("2014-08-27T16:33:39.100Z",
                                      "%Y-%m-%dT%H:%M:%S.%fZ"),
                },
                'event': {
                    "code": "mobile",
                    "new_time": 89.699177437,
                    "old_time": 119.699177437,
                    "type": expected_seek_type,
                    "requested_skip_interval": expected_skip_interval,
                    'id': 'i4x-foo-bar-baz-some_module',
                }
            }
        finally:
            middleware.process_response(request, None)

        actual_event = self.get_event()
        assert_event_matches(expected_event, actual_event)
Пример #10
0
    def test_video_event(self, name, event_type):
        course_id = 'foo/bar/baz'
        middleware = TrackMiddleware()

        input_payload = {
            'current_time': 132.134456,
            'module_id': 'i4x://foo/bar/baz/some_module',
            'code': 'mobile'
        }
        if name == 'edx.video.loaded':
            # We use the same expected payload for all of these types of events, but the load video event is the only
            # one that is not actually expected to contain a "current time" field. So we remove it from the expected
            # event here.
            del input_payload['current_time']

        request = self.create_request(data=self.create_segmentio_event_json(
            name=name,
            data=input_payload,
            context={
                'open_in_browser_url':
                'https://testserver/courses/foo/bar/baz/courseware/Week_1/Activity/2',
                'course_id': course_id,
                'application': {
                    'name': 'edx.mobileapp.android',
                    'version': '29',
                    'component': 'videoplayer'
                }
            }),
                                      content_type='application/json')
        User.objects.create(pk=SEGMENTIO_TEST_USER_ID,
                            username=str(sentinel.username))

        middleware.process_request(request)
        try:
            response = segmentio.segmentio_event(request)
            self.assertEquals(response.status_code, 200)

            expected_event = {
                'accept_language':
                '',
                'referer':
                '',
                'username':
                str(sentinel.username),
                'ip':
                '',
                'session':
                '',
                'event_source':
                'mobile',
                'event_type':
                event_type,
                'name':
                name,
                'agent':
                str(sentinel.user_agent),
                'page':
                'https://testserver/courses/foo/bar/baz/courseware/Week_1/Activity',
                'time':
                datetime.strptime("2014-08-27T16:33:39.215Z",
                                  "%Y-%m-%dT%H:%M:%S.%fZ"),
                'host':
                'testserver',
                'context': {
                    'user_id':
                    SEGMENTIO_TEST_USER_ID,
                    'course_id':
                    course_id,
                    'org_id':
                    'foo',
                    'path':
                    SEGMENTIO_TEST_ENDPOINT,
                    'client': {
                        'library': {
                            'name': 'test-app',
                            'version': 'unknown'
                        },
                        'app': {
                            'version': '1.0.1',
                        },
                    },
                    'application': {
                        'name': 'edx.mobileapp.android',
                        'version': '29',
                        'component': 'videoplayer'
                    },
                    'received_at':
                    datetime.strptime("2014-08-27T16:33:39.100Z",
                                      "%Y-%m-%dT%H:%M:%S.%fZ"),
                },
                'event': {
                    'currentTime': 132.134456,
                    'id': 'i4x-foo-bar-baz-some_module',
                    'code': 'mobile'
                }
            }
            if name == 'edx.video.loaded':
                # We use the same expected payload for all of these types of events, but the load video event is the
                # only one that is not actually expected to contain a "current time" field. So we remove it from the
                # expected event here.
                del expected_event['event']['currentTime']
        finally:
            middleware.process_response(request, None)

        actual_event = self.get_event()
        assert_event_matches(expected_event, actual_event)
Пример #11
0
    def test_video_event(self, name, event_type):
        course_id = 'foo/bar/baz'
        middleware = TrackMiddleware()

        input_payload = {
            'current_time': 132.134456,
            'module_id': 'i4x://foo/bar/baz/some_module',
            'code': 'mobile'
        }
        if name == 'edx.video.loaded':
            del input_payload['current_time']

        request = self.create_request(data=self.create_segmentio_event_json(
            name=name,
            data=input_payload,
            context={
                'open_in_browser_url':
                'https://testserver/courses/foo/bar/baz/courseware/Week_1/Activity/2',
                'course_id': course_id,
                'application': {
                    'name': 'edx.mobileapp.android',
                    'version': '29',
                    'component': 'videoplayer'
                }
            }),
                                      content_type='application/json')
        User.objects.create(pk=USER_ID, username=str(sentinel.username))

        middleware.process_request(request)
        try:
            response = segmentio.segmentio_event(request)
            self.assertEquals(response.status_code, 200)

            expected_event_without_payload = {
                'username':
                str(sentinel.username),
                'ip':
                '',
                'session':
                '',
                'event_source':
                'mobile',
                'event_type':
                event_type,
                'name':
                name,
                'agent':
                str(sentinel.user_agent),
                'page':
                'https://testserver/courses/foo/bar/baz/courseware/Week_1/Activity',
                'time':
                datetime.strptime("2014-08-27T16:33:39.215Z",
                                  "%Y-%m-%dT%H:%M:%S.%fZ"),
                'host':
                'testserver',
                'context': {
                    'user_id':
                    USER_ID,
                    'course_id':
                    course_id,
                    'org_id':
                    'foo',
                    'path':
                    ENDPOINT,
                    'client': {
                        'library': {
                            'name': 'test-app',
                            'version': 'unknown'
                        },
                        'app': {
                            'version': '1.0.1',
                        },
                    },
                    'application': {
                        'name': 'edx.mobileapp.android',
                        'version': '29',
                        'component': 'videoplayer'
                    },
                    'received_at':
                    datetime.strptime("2014-08-27T16:33:39.100Z",
                                      "%Y-%m-%dT%H:%M:%S.%fZ"),
                },
            }
            expected_payload = {
                'currentTime': 132.134456,
                'id': 'i4x-foo-bar-baz-some_module',
                'code': 'mobile'
            }
            if name == 'edx.video.loaded':
                del expected_payload['currentTime']
        finally:
            middleware.process_response(request, None)

        actual_event = dict(self.get_event())
        payload = json.loads(actual_event.pop('event'))

        self.assertEquals(actual_event, expected_event_without_payload)
        self.assertEquals(payload, expected_payload)
Пример #12
0
 def setUp(self):
     self.track_middleware = TrackMiddleware()
     self.request_factory = RequestFactory()