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')

        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.assertEqual(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': parser.parse("2014-08-27T16:33:39.215Z"),
                'host': 'testserver',
                'context': {
                    'application': {
                        'name': 'edx.mobile.android',
                        'version': '1.0.1',
                    },
                    'user_id': SEGMENTIO_TEST_USER_ID,
                    'course_id': course_id,
                    'org_id': u'foo',
                    'path': SEGMENTIO_TEST_ENDPOINT,
                    'client': {
                        'library': {
                            'name': 'test-app',
                            'version': 'unknown'
                        },
                        'app': {
                            'version': '1.0.1',
                        },
                    },
                    'received_at': parser.parse("2014-08-27T16:33:39.100Z"),
                },
            }
        finally:
            middleware.process_response(request, None)

        assert_event_matches(expected_event, self.get_event())
Esempio n. 2
0
 def test_timestamp_success(self, timestamp):
     sample_event_raw = self.create_segmentio_event()
     sample_event_raw['receivedAt'] = timestamp
     sample_event_raw['timestamp'] = timestamp
     request = self.create_request(
         data=json.dumps(sample_event_raw),
         content_type='application/json'
     )
     response = segmentio.segmentio_event(request)
     assert response.status_code == 200
     self.assert_events_emitted()
Esempio n. 3
0
 def test_secret_mismatch(self):
     request = self.create_request(key='y')
     response = segmentio.segmentio_event(request)
     self.assertEqual(response.status_code, 401)
     self.assert_no_events_emitted()
Esempio n. 4
0
 def test_no_secret_provided(self):
     request = self.request_factory.post(SEGMENTIO_TEST_ENDPOINT)
     response = segmentio.segmentio_event(request)
     self.assertEqual(response.status_code, 401)
     self.assert_no_events_emitted()
Esempio n. 5
0
 def test_get_request(self):
     request = self.request_factory.get(SEGMENTIO_TEST_ENDPOINT)
     response = segmentio.segmentio_event(request)
     self.assertEqual(response.status_code, 405)
     self.assert_no_events_emitted()
Esempio n. 6
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')

        middleware.process_request(request)
        try:
            response = segmentio.segmentio_event(request)
            self.assertEqual(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': parser.parse("2014-08-27T16:33:39.215Z"),
                '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': parser.parse("2014-08-27T16:33:39.100Z"),
                },
                '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)
Esempio n. 7
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')

        middleware.process_request(request)
        try:
            response = segmentio.segmentio_event(request)
            self.assertEqual(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': parser.parse("2014-08-27T16:33:39.215Z"),
                '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': parser.parse("2014-08-27T16:33:39.100Z"),
                },
                '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)
Esempio n. 8
0
 def test_no_secret_config(self):
     request = self.request_factory.post(SEGMENTIO_TEST_ENDPOINT)
     response = segmentio.segmentio_event(request)
     assert response.status_code == 401
     self.assert_no_events_emitted()