meyzieu_newsletters: return 503 code on webservice connection error (#10853)

This commit is contained in:
Serghei Mihai 2016-05-06 14:31:45 +02:00
parent d4aca0571f
commit 8b12e5c64a
2 changed files with 35 additions and 14 deletions

View File

@ -27,8 +27,12 @@ from jsonfield import JSONField
from passerelle.base.models import BaseResource
class SubscriptionsSetError(Exception):
http_status = 503
class SubscriptionsGetError(Exception):
pass
http_status = 503
class MeyzieuNewsletters(BaseResource):
@ -90,10 +94,7 @@ class MeyzieuNewsletters(BaseResource):
subs = {}
remove = {}
add = {}
try:
current_subscriptions = self.get_subscriptions(email)
except SubscriptionsGetError:
return False
current_subscriptions = self.get_subscriptions(email)
for current in current_subscriptions:
currents[current['id']] = current
@ -136,7 +137,7 @@ class MeyzieuNewsletters(BaseResource):
response = requests.get(self.url, params=params)
except (requests.HTTPError, requests.ConnectionError), e:
logger.error("<%r> '%r' addAbonnement failed: %r", self.slug, email, e)
return False
raise SubscriptionsGetError('error on getting subscriptions')
for i, (subscription_id, kinds) in enumerate(add.iteritems()):
params = base.copy()
@ -152,7 +153,7 @@ class MeyzieuNewsletters(BaseResource):
response = requests.get(self.url, params=params)
except (requests.HTTPError, requests.ConnectionError), e:
logger.error("<%r> '%r' addAbonnement failed: %r", self.slug, email, e)
return False
raise SubscriptionsSetError('error on setting subscriptions')
return True
def get_subscriptions(self, email):
@ -166,7 +167,7 @@ class MeyzieuNewsletters(BaseResource):
response = requests.get(self.url, params=params)
except (requests.HTTPError, requests.ConnectionError), e:
logger.error("<%r> '%r' getListAbonnement failed: %r", self.slug, email, e)
raise SubscriptionsGetError
raise SubscriptionsGetError('error on getting subscriptions')
n = dict((i.pop('id'), i) for i in self.get_newsletters())
if 'abonnement' in response.json():

View File

@ -11,6 +11,8 @@ from django.utils.http import urlencode
from passerelle.base.models import ApiUser, AccessRight
from passerelle.contrib.meyzieu_newsletters.models import MeyzieuNewsletters
from passerelle.contrib.meyzieu_newsletters.models import SubscriptionsGetError
from passerelle.contrib.meyzieu_newsletters.models import SubscriptionsSetError
pytestmark = pytest.mark.django_db
@ -50,6 +52,7 @@ WS_SUBSCRIPTIONS_RETURN = {'abonnement':
}
POST_SUBSCRIPTIONS = [{"id": "69", "text": "Enfance Jeunesse", "transports": []},
{"id": 76, "text": "Restauration scolaire", "transports": ["push_mail"]},
{"id": "46", "text": "Environnement", "transports": ["push_mail"]}
]
@ -68,9 +71,14 @@ def mocked_requests_get(*args, **kwargs):
else:
return MockResponse({})
def mocked_requests_connection_error(*args, **kwargs):
raise requests.ConnectionError
def set_subscriptions_connection_error(*args, **kwargs):
if kwargs['params'].get('method') == 'meyzieu.connection.addAbonnement':
raise requests.ConnectionError
else:
return mocked_requests_get(*args, **kwargs)
def get_subscriptions_connection_error(*args, **kwargs):
raise requests.ConnectionError
@pytest.fixture
def setup():
@ -128,6 +136,16 @@ def test_get_subscriptions(mock_get, setup):
assert 'id' in transport
assert transport['id'] in subscriptions
@mock.patch('passerelle.contrib.meyzieu_newsletters.models.requests.get',
side_effect=get_subscriptions_connection_error)
def test_get_subscriptions_with_connection_error(mock_get, setup):
app, conn = setup
resp = app.get(reverse('meyzieu-newsletters-subscriptions', kwargs={'slug': conn.slug}),
params={'apikey': API_KEY, 'email': TEST_USER}, status=503)
assert resp.json['err']
assert resp.json['err_class'] == '%s.%s' % (SubscriptionsGetError.__module__,
SubscriptionsGetError.__name__)
assert resp.json['err_desc'] == 'error on getting subscriptions'
@mock.patch('passerelle.contrib.meyzieu_newsletters.models.requests.get',
side_effect=mocked_requests_get)
@ -169,12 +187,14 @@ def test_delete_empty_subscriptions(mock_get, setup):
resp = app.delete(url, status=200)
assert resp.json['data']
# @mock.patch('passerelle.contrib.meyzieu_newsletters.models.requests.get')
@mock.patch('passerelle.contrib.meyzieu_newsletters.models.requests.get',
side_effect=mocked_requests_connection_error)
side_effect=set_subscriptions_connection_error)
def test_update_subscriptions_with_connection_error(mock_get, setup):
app, conn = setup
url = reverse('meyzieu-newsletters-subscriptions', kwargs={'slug': conn.slug})
url += '?' + urlencode({'apikey': API_KEY, 'email': TEST_USER})
resp = app.post_json(url, POST_SUBSCRIPTIONS, status=200)
assert not resp.json['data']
resp = app.post_json(url, POST_SUBSCRIPTIONS, status=503)
assert resp.json['err']
assert resp.json['err_class'] == '%s.%s' % (SubscriptionsSetError.__module__,
SubscriptionsSetError.__name__)
assert resp.json['err_desc'] == 'error on setting subscriptions'