def test_private_newsletter_success( self, mock_api_key, mock_private, mock_group_slugs, mock_slugs, ): """ If subscribing to a private newsletter and the request has an invalid API key, return a 401. """ mock_private.return_value = ["private"] mock_slugs.return_value = ["private", "other"] mock_group_slugs.return_value = ["private", "other"] data = {"newsletters": "private", "email": "*****@*****.**"} request = self.factory.post("/", data) mock_api_key.return_value = True response = views.update_user_task(request, SUBSCRIBE, data) self.assert_response_ok(response) mock_api_key.assert_called_with(request, data["email"]) response = views.update_user_task(request, SET, data) self.assert_response_ok(response) mock_api_key.assert_called_with(request, data["email"])
def test_rate_limit_user_update(self): """Should raise Ratelimited if token attempts to update same newsletters quickly""" views.EMAIL_SUBSCRIBE_RATE_LIMIT = "2/1m" request = self.factory.post("/") data = {"token": "*****@*****.**", "newsletters": "foo,bar"} with patch("basket.news.views.newsletter_slugs") as newsletter_slugs: newsletter_slugs.return_value = ["foo", "bar"] views.update_user_task(request, SET, data, sync=False) response = views.update_user_task(request, SET, data, sync=False) self.assert_response_ok(response) with self.assertRaises(Ratelimited): views.update_user_task(request, SET, data, sync=False)
def test_rate_limit_user_update(self): """Should raise Ratelimited if token attempts to update same newsletters quickly""" request = self.factory.post('/') data = {'token': '*****@*****.**', 'newsletters': 'foo,bar'} with patch('basket.news.views.newsletter_slugs') as newsletter_slugs: newsletter_slugs.return_value = ['foo', 'bar'] update_user_task(request, SET, data, sync=False) response = update_user_task(request, SET, data, sync=False) self.assert_response_ok(response) with self.assertRaises(Ratelimited): update_user_task(request, SET, data, sync=False)
def test_rate_limit(self): """Should raise Ratelimited if email attempts to sign up for same newsletter quickly""" request = self.factory.post('/') data = {'email': '*****@*****.**', 'newsletters': 'foo,bar'} with patch('basket.news.views.newsletter_and_group_slugs' ) as newsletter_slugs: newsletter_slugs.return_value = ['foo', 'bar'] update_user_task(request, SUBSCRIBE, data, sync=False) response = update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response) with self.assertRaises(Ratelimited): update_user_task(request, SUBSCRIBE, data, sync=False)
def test_missing_email(self): """ If the email is missing, return a 400 error. """ request = self.factory.post('/') response = update_user_task(request, SUBSCRIBE) self.assert_response_error(response, 400, errors.BASKET_USAGE_ERROR)
def test_success_with_valid_lang(self): """If the specified language is valid, return an OK response.""" request = self.factory.post('/') data = {'email': '*****@*****.**', 'lang': 'pt-BR'} with patch('basket.news.views.language_code_is_valid' ) as mock_language_code_is_valid: mock_language_code_is_valid.return_value = True response = update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response)
def test_invalid_newsletter(self): """If an invalid newsletter is given, return a 400 error.""" request = self.factory.post('/') with patch('basket.news.views.newsletter_slugs') as newsletter_slugs: newsletter_slugs.return_value = ['foo', 'baz'] response = update_user_task(request, SUBSCRIBE, {'newsletters': 'foo,bar'}) self.assert_response_error(response, 400, errors.BASKET_INVALID_NEWSLETTER)
def test_private_newsletter_success(self, mock_api_key, mock_private, mock_group_slugs, mock_slugs): """ If subscribing to a private newsletter and the request has an invalid API key, return a 401. """ mock_private.return_value = ['private'] mock_slugs.return_value = ['private', 'other'] mock_group_slugs.return_value = ['private', 'other'] data = {'newsletters': 'private', 'email': '*****@*****.**'} request = self.factory.post('/', data) mock_api_key.return_value = True response = update_user_task(request, SUBSCRIBE, data) self.assert_response_ok(response) mock_api_key.assert_called_with(request, data['email']) response = update_user_task(request, SET, data) self.assert_response_ok(response) mock_api_key.assert_called_with(request, data['email'])
def test_success_with_valid_newsletters(self): """ If the specified newsletters are valid, return an OK response. """ request = self.factory.post('/') data = {'email': '*****@*****.**', 'newsletters': 'foo,bar'} with patch('basket.news.views.newsletter_and_group_slugs' ) as newsletter_slugs: newsletter_slugs.return_value = ['foo', 'bar'] response = update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response)
def test_accept_lang_header(self, get_best_language_mock): """If accept-language header is provided, should set the lang in data.""" get_best_language_mock.return_value = 'pt' request = self.factory.post('/', HTTP_ACCEPT_LANGUAGE='pt-pt,fr;q=0.8') data = {'email': '*****@*****.**'} after_data = {'email': '*****@*****.**', 'lang': 'pt'} response = update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response) self.upsert_user.delay.assert_called_with(SUBSCRIBE, after_data, start_time=ANY)
def test_success_with_request_data(self): """ If no data is provided, fall back to using the POST data from the request. """ data = {'email': '*****@*****.**', 'lang': 'en'} request = self.factory.post('/', data) response = update_user_task(request, SUBSCRIBE, sync=False) self.assert_response_ok(response) self.upsert_user.delay.assert_called_with(SUBSCRIBE, data, start_time=ANY)
def test_success_with_request_data(self): """ If no data is provided, fall back to using the POST data from the request. """ data = {"email": "*****@*****.**", "lang": "en"} request = self.factory.post("/", data) response = views.update_user_task(request, SUBSCRIBE, sync=False) self.assert_response_ok(response) self.upsert_user.delay.assert_called_with(SUBSCRIBE, data, start_time=ANY)
def test_accept_lang(self, nl_mock, get_best_language_mock): """If accept_lang param is provided, should set the lang in data.""" get_best_language_mock.return_value = 'pt' nl_mock.return_value = ['pt', 'en', 'de'] request = self.factory.post('/') data = {'email': '*****@*****.**', 'accept_lang': 'pt-pt,fr;q=0.8'} after_data = {'email': '*****@*****.**', 'lang': 'pt'} response = views.update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response) self.upsert_user.delay.assert_called_with(SUBSCRIBE, after_data, start_time=ANY)
def test_success_with_valid_lang(self): """If the specified language is valid, return an OK response.""" request = self.factory.post("/") data = {"email": "*****@*****.**", "lang": "pt-BR"} with patch("basket.news.views.language_code_is_valid", ) as mock_language_code_is_valid: mock_language_code_is_valid.return_value = True response = views.update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response)
def test_accept_lang_header(self, nl_mock, get_best_language_mock): """If accept-language header is provided, should set the lang in data.""" get_best_language_mock.return_value = "pt" nl_mock.return_value = ["pt", "en", "de"] request = self.factory.post("/", HTTP_ACCEPT_LANGUAGE="pt-pt,fr;q=0.8") data = {"email": "*****@*****.**"} after_data = {"email": "*****@*****.**", "lang": "pt"} response = views.update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response) self.upsert_user.delay.assert_called_with(SUBSCRIBE, after_data, start_time=ANY)
def test_invalid_newsletter(self): """If an invalid newsletter is given, return a 400 error.""" request = self.factory.post("/") with patch("basket.news.views.newsletter_slugs") as newsletter_slugs: newsletter_slugs.return_value = ["foo", "baz"] response = views.update_user_task( request, SUBSCRIBE, {"newsletters": "foo,bar"}, ) self.assert_response_error(response, 400, errors.BASKET_INVALID_NEWSLETTER)
def test_set_private_newsletter_invalid_api_key(self, mock_api_key, mock_private, mock_slugs): """ If subscribing to a private newsletter and the request has an invalid API key, return a 401. """ mock_private.return_value = ['private'] mock_slugs.return_value = ['private', 'other'] data = {'newsletters': 'private', 'email': '*****@*****.**'} request = self.factory.post('/', data) mock_api_key.return_value = False response = update_user_task(request, SET, data) self.assert_response_error(response, 401, errors.BASKET_AUTH_ERROR) mock_api_key.assert_called_with(request, data['email'])
def test_success_with_unsubscribe_private_newsletter( self, mock_private, mock_slugs): """ Should be able to unsubscribe from a private newsletter regardless. """ mock_private.return_value = ['private'] mock_slugs.return_value = ['private', 'other'] request = self.factory.post('/') data = {'token': 'mytoken', 'newsletters': 'private'} response = update_user_task(request, UNSUBSCRIBE, data) self.assert_response_ok(response) self.upsert_user.delay.assert_called_with(UNSUBSCRIBE, data, start_time=ANY)
def test_success_with_sync(self, gud_mock): """ If sync is True look up the user with get_or_create_user_data and return an OK response with the token and created from the fetched subscriber. """ request = self.factory.post('/') data = {'email': '*****@*****.**'} gud_mock.return_value = {'token': 'mytoken', 'email': '*****@*****.**'} self.upsert_contact.return_value = 'mytoken', True response = update_user_task(request, SUBSCRIBE, data, sync=True) self.assert_response_ok(response, token='mytoken', created=True) self.upsert_contact.assert_called_with(SUBSCRIBE, data, gud_mock.return_value)
def test_success_with_valid_newsletters(self): """ If the specified newsletters are valid, return an OK response. """ request = self.factory.post("/") data = {"email": "*****@*****.**", "newsletters": "foo,bar"} with patch("basket.news.views.newsletter_and_group_slugs" ) as newsletter_slugs: newsletter_slugs.return_value = ["foo", "bar"] response = views.update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response)
def test_success_with_sync(self, gud_mock): """ If sync is True look up the user with get_or_create_user_data and return an OK response with the token and created from the fetched subscriber. """ request = self.factory.post("/") data = {"email": "*****@*****.**"} gud_mock.return_value = {"token": "mytoken", "email": "*****@*****.**"} self.upsert_contact.return_value = "mytoken", True response = views.update_user_task(request, SUBSCRIBE, data, sync=True) self.assert_response_ok(response, token="mytoken", created=True) self.upsert_contact.assert_called_with(SUBSCRIBE, data, gud_mock.return_value)
def test_lang_overrides_accept_lang(self, get_best_language_mock): """ If lang is provided it was from the user, and accept_lang isn't as reliable, so we should prefer lang. """ get_best_language_mock.return_value = 'pt-BR' request = self.factory.post('/') data = {'email': '*****@*****.**', 'lang': 'de', 'accept_lang': 'pt-BR'} response = update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response) # basically asserts that the data['lang'] value wasn't changed. self.upsert_user.delay.assert_called_with(SUBSCRIBE, data, start_time=ANY)
def test_lang_overrides_accept_lang(self, nl_mock, get_best_language_mock): """ If lang is provided it was from the user, and accept_lang isn't as reliable, so we should prefer lang. """ get_best_language_mock.return_value = "pt-BR" nl_mock.return_value = ["pt", "en", "de"] request = self.factory.post("/") data = {"email": "*****@*****.**", "lang": "de", "accept_lang": "pt-BR"} response = views.update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response) # basically asserts that the data['lang'] value wasn't changed. self.upsert_user.delay.assert_called_with(SUBSCRIBE, data, start_time=ANY)
def test_lang_default_if_not_in_list(self, nl_mock, get_best_language_mock): """ If lang is provided it was from the user, and accept_lang isn't as reliable, so we should prefer lang. """ get_best_language_mock.return_value = 'pt-BR' nl_mock.return_value = ['pt', 'en', 'de'] request = self.factory.post('/') data = {'email': '*****@*****.**', 'lang': 'hi'} after_data = {'email': '*****@*****.**', 'lang': 'en'} response = views.update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response) # basically asserts that the data['lang'] value wasn't changed. self.upsert_user.delay.assert_called_with(SUBSCRIBE, after_data, start_time=ANY)
def test_success_with_unsubscribe_private_newsletter( self, mock_private, mock_slugs, ): """ Should be able to unsubscribe from a private newsletter regardless. """ mock_private.return_value = ["private"] mock_slugs.return_value = ["private", "other"] request = self.factory.post("/") data = {"token": "mytoken", "newsletters": "private"} response = views.update_user_task(request, UNSUBSCRIBE, data) self.assert_response_ok(response) self.upsert_user.delay.assert_called_with(UNSUBSCRIBE, data, start_time=ANY)
def test_success_no_sync(self): """ If sync is False, do not generate a token via get_or_create_user_data and return an OK response without a token. """ request = self.factory.post('/') data = { 'email': '*****@*****.**', 'first_name': 'The', 'last_name': 'Dude' } response = update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response) self.upsert_user.delay.assert_called_with(SUBSCRIBE, data, start_time=ANY) self.assertFalse(self.upsert_contact.called)
def test_success_no_sync(self): """ If sync is False, do not generate a token via get_or_create_user_data and return an OK response without a token. """ request = self.factory.post("/") data = { "email": "*****@*****.**", "first_name": "The", "last_name": "Dude" } response = views.update_user_task(request, SUBSCRIBE, data, sync=False) self.assert_response_ok(response) self.upsert_user.delay.assert_called_with(SUBSCRIBE, data, start_time=ANY) self.assertFalse(self.upsert_contact.called)
def test_set_private_newsletter_invalid_api_key( self, mock_api_key, mock_private, mock_slugs, ): """ If subscribing to a private newsletter and the request has an invalid API key, return a 401. """ mock_private.return_value = ["private"] mock_slugs.return_value = ["private", "other"] data = {"newsletters": "private", "email": "*****@*****.**"} request = self.factory.post("/", data) mock_api_key.return_value = False response = views.update_user_task(request, SET, data) self.assert_response_error(response, 401, errors.BASKET_AUTH_ERROR) mock_api_key.assert_called_with(request, data["email"])