def test_email_fxos_malformed_post_bad_data(self, update_user_mock): """Should be able to parse data from the raw request body even with bad data.""" # example from real error with PII details changed self.process_email.return_value = '*****@*****.**' req = self.factory.generic( 'POST', '/news/subscribe/', data='newsletters=mozilla-foundation&' 'source_url=https%3A%2F%2Fadvocacy.mozilla.org%2Fencrypt' '&lang=en&[email protected]' '&country=DE&first_name=Dude&Walter', content_type='text/plain; charset=UTF-8') views.subscribe(req) update_user_mock.assert_called_with( req, views.SUBSCRIBE, data={ 'email': '*****@*****.**', 'newsletters': 'mozilla-foundation', 'source_url': 'https%3A%2F%2Fadvocacy.mozilla.org%2Fencrypt', 'lang': 'en', 'country': 'DE', 'first_name': 'Dude', }, optin=False, sync=False)
def test_success_sync_optin_lowercase(self): """Test success case with optin and sync, using lowercase y.""" request_data = { 'newsletters': 'news,lets', 'optin': 'y', 'sync': 'y', 'email': '*****@*****.**' } update_data = request_data.copy() del update_data['optin'] del update_data['sync'] request = self.factory.post('/', request_data) self.process_email.return_value = update_data['email'] self.is_authorized.return_value = True response = views.subscribe(request) self.is_authorized.assert_called_with(request, self.process_email.return_value) self.assertEqual(response, self.update_user_task.return_value) self.process_email.assert_called_with('*****@*****.**') self.update_user_task.assert_called_with(request, SUBSCRIBE, data=update_data, optin=True, sync=True)
def test_success(self): """Test basic success case with no optin or sync.""" request_data = { 'newsletters': 'news,lets', 'optin': 'N', 'sync': 'N', 'email': '*****@*****.**', 'first_name': 'The', 'last_name': 'Dude' } update_data = request_data.copy() del update_data['optin'] del update_data['sync'] self.process_email.return_value = update_data['email'] request = self.factory.post('/', request_data) response = views.subscribe(request) self.assertEqual(response, self.update_user_task.return_value) self.process_email.assert_called_with(request_data['email']) self.update_user_task.assert_called_with(request, SUBSCRIBE, data=update_data, optin=False, sync=False)
def test_source_url_overrides_referrer(self): """Test source_url used when referrer also provided.""" request_data = { 'newsletters': 'news,lets', 'optin': 'N', 'sync': 'N', 'email': '*****@*****.**', 'first_name': 'The', 'last_name': 'Dude', 'source_url': 'https://example.com/thedude' } update_data = request_data.copy() del update_data['optin'] del update_data['sync'] self.process_email.return_value = update_data['email'] request = self.factory.post('/', request_data, HTTP_REFERER='https://example.com/donnie') response = views.subscribe(request) self.assertEqual(response, self.update_user_task.return_value) self.process_email.assert_called_with(request_data['email']) self.update_user_task.assert_called_with(request, SUBSCRIBE, data=update_data, optin=False, sync=False)
def test_non_ascii_email_fxos_malformed_post(self, update_user_mock): """Should be able to parse data from the raw request body including non-ascii chars.""" req = self.rf.generic('POST', '/news/subscribe/', data='email=dude@黒川.日本&newsletters=firefox-os', content_type='text/plain; charset=UTF-8') views.subscribe(req) update_user_mock.assert_called_with(req, views.SUBSCRIBE, data={ 'email': u'[email protected]', 'newsletters': 'firefox-os', }, optin=False, sync=False)
def test_email_fxos_malformed_post(self, update_user_mock): """Should be able to parse data from the raw request body.""" self.process_email.return_value = '*****@*****.**' req = self.factory.generic( 'POST', '/news/subscribe/', data='[email protected]&newsletters=firefox-os', content_type='text/plain; charset=UTF-8') views.subscribe(req) update_user_mock.assert_called_with(req, views.SUBSCRIBE, data={ 'email': '*****@*****.**', 'newsletters': 'firefox-os', }, optin=False, sync=False)
def test_non_ascii_email(self, update_user_mock): """Should be able to accept valid email including non-ascii chars.""" req = self.rf.post('/news/subscribe/', data={ 'email': 'dude@黒川.日本', 'newsletters': 'firefox-os' }) views.subscribe(req) update_user_mock.assert_called_with(req, views.SUBSCRIBE, data={ 'email': u'[email protected]', 'newsletters': 'firefox-os', }, optin=False, sync=False)
def test_empty_email_invalid(self, update_user_mock): """Should report an error for missing or empty value.""" req = self.rf.post('/news/subscribe/', data={ 'email': '', 'newsletters': 'firefox-os' }) resp = views.subscribe(req) resp_data = json.loads(resp.content) self.assertEqual(resp_data['status'], 'error') self.assertEqual(resp_data['code'], errors.BASKET_INVALID_EMAIL) self.assertFalse(update_user_mock.called) # no email at all req = self.rf.post('/news/subscribe/', data={'newsletters': 'firefox-os'}) resp = views.subscribe(req) resp_data = json.loads(resp.content) self.assertEqual(resp_data['status'], 'error') self.assertEqual(resp_data['code'], errors.BASKET_USAGE_ERROR) self.assertFalse(update_user_mock.called)
def test_blocked_email(self, get_block_list_mock): """Test basic success case with no optin or sync.""" get_block_list_mock.return_value = ['example.com'] request_data = { 'newsletters': 'news,lets', 'optin': 'N', 'sync': 'N', 'email': '*****@*****.**' } request = self.factory.post('/', request_data) response = views.subscribe(request) self.assertEqual(response.status_code, 200) self.assertFalse(self.update_user_task.called)
def test_deals_with_broken_post_data(self, update_user_mock): """Should be able to parse data from the raw request body. FxOS sends POST requests with the wrong mime-type, so request.POST is never filled out. We should parse the raw request body to get the data until this is fixed in FxOS in bug 949170. """ req = self.rf.generic( 'POST', '/news/subscribe/', data='[email protected]&newsletters=firefox-os', content_type='text/plain; charset=UTF-8') self.assertFalse(bool(req.POST)) views.subscribe(req) update_user_mock.assert_called_with(req, views.SUBSCRIBE, data={ 'email': '*****@*****.**', 'newsletters': 'firefox-os', }, optin=False, sync=False)
def test_email_validation_error(self): """ If process_email returns None, return an invalid email response. """ request_data = {'newsletters': 'asdf', 'email': '*****@*****.**'} request = self.factory.post('/', request_data) self.process_email.return_value = None with patch('basket.news.views.invalid_email_response' ) as invalid_email_response: response = views.subscribe(request) self.assertEqual(response, invalid_email_response.return_value) self.process_email.assert_called_with(request_data['email']) invalid_email_response.assert_called()
def test_sync_invalid_api_key(self): """ If sync is set to 'Y' and the request has an invalid API key, return a 401. """ request = self.factory.post('/', { 'newsletters': 'asdf', 'sync': 'Y', 'email': '*****@*****.**' }) self.is_authorized.return_value = False response = views.subscribe(request) self.assert_response_error(response, 401, errors.BASKET_AUTH_ERROR) self.is_authorized.assert_called_with(request, self.process_email.return_value)
def test_optin_valid_api_key_required(self): """ If optin is 'Y' but the API key isn't valid, disable optin. """ request_data = { 'newsletters': 'asdf', 'optin': 'Y', 'email': '*****@*****.**' } update_data = request_data.copy() del update_data['optin'] self.process_email.return_value = update_data['email'] request = self.factory.post('/', request_data) self.is_authorized.return_value = False response = views.subscribe(request) self.assertEqual(response, self.update_user_task.return_value) self.update_user_task.assert_called_with(request, SUBSCRIBE, data=update_data, optin=False, sync=False)
def test_newsletters_missing(self): """If the newsletters param is missing, return a 400.""" request = self.factory.post('/') response = views.subscribe(request) self.assert_response_error(response, 400, errors.BASKET_USAGE_ERROR)