diff --git a/common/djangoapps/student/tests/test_create_account.py b/common/djangoapps/student/tests/test_create_account.py index a997838035..56d18992c6 100644 --- a/common/djangoapps/student/tests/test_create_account.py +++ b/common/djangoapps/student/tests/test_create_account.py @@ -360,6 +360,49 @@ class TestCreateAccount(TestCase): self.assertIsNone(UserAttribute.get_user_attribute(user, REGISTRATION_UTM_PARAMETERS.get('utm_content'))) self.assertIsNone(UserAttribute.get_user_attribute(user, REGISTRATION_UTM_CREATED_AT)) + @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms') + def test_incomplete_utm_referral(self): + """Verify that no referral is recorded when a cookie is not present.""" + utm_cookie_name = 'edx.test.utm' + with mock.patch('student.models.RegistrationCookieConfiguration.current') as config: + instance = config.return_value + instance.utm_cookie_name = utm_cookie_name + + utm_cookie = { + 'utm_source': 'test-source', + 'utm_medium': 'test-medium', + # No campaign + 'utm_term': 'test-term', + 'utm_content': 'test-content', + # No created at + } + + self.client.cookies[utm_cookie_name] = json.dumps(utm_cookie) + user = self.create_account_and_fetch_profile().user + + self.assertEqual( + UserAttribute.get_user_attribute(user, REGISTRATION_UTM_PARAMETERS.get('utm_source')), + utm_cookie.get('utm_source') + ) + self.assertEqual( + UserAttribute.get_user_attribute(user, REGISTRATION_UTM_PARAMETERS.get('utm_medium')), + utm_cookie.get('utm_medium') + ) + self.assertEqual( + UserAttribute.get_user_attribute(user, REGISTRATION_UTM_PARAMETERS.get('utm_term')), + utm_cookie.get('utm_term') + ) + self.assertEqual( + UserAttribute.get_user_attribute(user, REGISTRATION_UTM_PARAMETERS.get('utm_content')), + utm_cookie.get('utm_content') + ) + self.assertIsNone( + UserAttribute.get_user_attribute(user, REGISTRATION_UTM_PARAMETERS.get('utm_campaign')) + ) + self.assertIsNone( + UserAttribute.get_user_attribute(user, REGISTRATION_UTM_CREATED_AT) + ) + @ddt.ddt class TestCreateAccountValidation(TestCase): diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index 9456883c76..b7722e9287 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -1903,25 +1903,25 @@ def record_utm_registration_attribution(request, user): utm_cookie = request.COOKIES.get(utm_cookie_name) if user and utm_cookie: utm = json.loads(utm_cookie) - for utm_parameter in REGISTRATION_UTM_PARAMETERS: - UserAttribute.set_user_attribute( - user, - REGISTRATION_UTM_PARAMETERS.get(utm_parameter), - utm.get(utm_parameter) - ) + for utm_parameter_name in REGISTRATION_UTM_PARAMETERS: + utm_parameter = utm.get(utm_parameter_name) + if utm_parameter: + UserAttribute.set_user_attribute( + user, + REGISTRATION_UTM_PARAMETERS.get(utm_parameter_name), + utm_parameter + ) created_at_unixtime = utm.get('created_at') if created_at_unixtime: # We divide by 1000 here because the javascript timestamp generated is in milliseconds not seconds. # PYTHON: time.time() => 1475590280.823698 # JS: new Date().getTime() => 1475590280823 created_at_datetime = datetime.datetime.fromtimestamp(int(created_at_unixtime) / float(1000), tz=UTC) - else: - created_at_datetime = None - UserAttribute.set_user_attribute( - user, - REGISTRATION_UTM_CREATED_AT, - created_at_datetime - ) + UserAttribute.set_user_attribute( + user, + REGISTRATION_UTM_CREATED_AT, + created_at_datetime + ) def record_registration_attributions(request, user):