When event-tracking was fully integrated into the platform, some data was replicated in the context in the middleware and then later extracted and moved the old location by event-tracking. The legacy code path was not updated to remove this transient shim data from the context resulting in duplication of the information. This patch ensures that the transient information is removed from the context before emitting the event. Fixes: AN-2369
199 lines
6.3 KiB
Python
199 lines
6.3 KiB
Python
# pylint: disable=missing-docstring,maybe-no-member
|
|
|
|
from track import views
|
|
from track.middleware import TrackMiddleware
|
|
from mock import patch, sentinel
|
|
from freezegun import freeze_time
|
|
|
|
from django.test import TestCase
|
|
from django.test.client import RequestFactory
|
|
|
|
from eventtracking import tracker
|
|
|
|
from datetime import datetime
|
|
expected_time = datetime(2013, 10, 3, 8, 24, 55)
|
|
|
|
|
|
class TestTrackViews(TestCase):
|
|
|
|
def setUp(self):
|
|
self.request_factory = RequestFactory()
|
|
|
|
patcher = patch('track.views.tracker')
|
|
self.mock_tracker = patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
|
|
self.path_with_course = '/courses/foo/bar/baz/xmod/'
|
|
self.url_with_course = 'http://www.edx.org' + self.path_with_course
|
|
|
|
self.event = {
|
|
sentinel.key: sentinel.value
|
|
}
|
|
|
|
@freeze_time(expected_time)
|
|
def test_user_track(self):
|
|
request = self.request_factory.get('/event', {
|
|
'page': self.url_with_course,
|
|
'event_type': sentinel.event_type,
|
|
'event': {}
|
|
})
|
|
with tracker.get_tracker().context('edx.request', {'session': sentinel.session}):
|
|
views.user_track(request)
|
|
|
|
expected_event = {
|
|
'username': 'anonymous',
|
|
'session': sentinel.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',
|
|
},
|
|
}
|
|
self.mock_tracker.send.assert_called_once_with(expected_event)
|
|
|
|
@freeze_time(expected_time)
|
|
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': 'anonymous',
|
|
'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)
|
|
|
|
@freeze_time(expected_time)
|
|
def test_server_track(self):
|
|
request = self.request_factory.get(self.path_with_course)
|
|
views.server_track(request, str(sentinel.event_type), '{}')
|
|
|
|
expected_event = {
|
|
'username': 'anonymous',
|
|
'ip': '127.0.0.1',
|
|
'event_source': 'server',
|
|
'event_type': str(sentinel.event_type),
|
|
'event': '{}',
|
|
'agent': '',
|
|
'page': None,
|
|
'time': expected_time,
|
|
'host': 'testserver',
|
|
'context': {},
|
|
}
|
|
self.mock_tracker.send.assert_called_once_with(expected_event)
|
|
|
|
@freeze_time(expected_time)
|
|
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 = {
|
|
'username': 'anonymous',
|
|
'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)
|
|
|
|
@freeze_time(expected_time)
|
|
def test_server_track_with_no_request(self):
|
|
request = None
|
|
views.server_track(request, str(sentinel.event_type), '{}')
|
|
|
|
expected_event = {
|
|
'username': 'anonymous',
|
|
'ip': '',
|
|
'event_source': 'server',
|
|
'event_type': str(sentinel.event_type),
|
|
'event': '{}',
|
|
'agent': '',
|
|
'page': None,
|
|
'time': expected_time,
|
|
'host': '',
|
|
'context': {},
|
|
}
|
|
self.mock_tracker.send.assert_called_once_with(expected_event)
|
|
|
|
@freeze_time(expected_time)
|
|
def test_task_track(self):
|
|
request_info = {
|
|
'username': 'anonymous',
|
|
'ip': '127.0.0.1',
|
|
'agent': 'agent',
|
|
'host': 'testserver',
|
|
}
|
|
|
|
task_info = {
|
|
sentinel.task_key: sentinel.task_value
|
|
}
|
|
expected_event_data = dict(task_info)
|
|
expected_event_data.update(self.event)
|
|
|
|
views.task_track(request_info, task_info, str(sentinel.event_type), self.event)
|
|
|
|
expected_event = {
|
|
'username': 'anonymous',
|
|
'ip': '127.0.0.1',
|
|
'event_source': 'task',
|
|
'event_type': str(sentinel.event_type),
|
|
'event': expected_event_data,
|
|
'agent': 'agent',
|
|
'page': None,
|
|
'time': expected_time,
|
|
'host': 'testserver',
|
|
'context': {
|
|
'course_id': '',
|
|
'org_id': ''
|
|
},
|
|
}
|
|
self.mock_tracker.send.assert_called_once_with(expected_event)
|