Skip to content
Snippets Groups Projects
Commit b0db7482 authored by Saurabh Kumar's avatar Saurabh Kumar Committed by Fredrik Jonsson
Browse files

Relax the testing for Mailchimp library

parent f67f5df2
No related branches found
No related tags found
No related merge requests found
...@@ -2,7 +2,6 @@ import re ...@@ -2,7 +2,6 @@ import re
from unittest import mock from unittest import mock
from urllib import parse from urllib import parse
import responses
from django.test import TestCase, override_settings from django.test import TestCase, override_settings
from django.urls import reverse from django.urls import reverse
...@@ -14,15 +13,12 @@ class TestNewsletterView(TestCase): ...@@ -14,15 +13,12 @@ class TestNewsletterView(TestCase):
def setUp(self): def setUp(self):
self.origin = 'https://testserver/' self.origin = 'https://testserver/'
self.client.defaults = {'HTTP_ORIGIN': self.origin}
def assertNewsletterRedirects(self, response, target_url, *args, **kwargs): def assertNewsletterRedirects(self, response, target_url, *args, **kwargs):
url = response.redirect_chain[0][0] url = response.redirect_chain[0][0]
parts = parse.urlsplit(url) parts = parse.urlsplit(url)
self.assertTrue(parts.query.startswith('newsletter-')) self.assertTrue(parts.query.startswith('newsletter-'))
target_url = target_url + '?' + parts.query target_url = target_url + '?' + parts.query
return self.assertRedirects(response, target_url, *args, **kwargs) return self.assertRedirects(response, target_url, *args, **kwargs)
def test_redirected_home_if_get(self): def test_redirected_home_if_get(self):
...@@ -34,45 +30,19 @@ class TestNewsletterView(TestCase): ...@@ -34,45 +30,19 @@ class TestNewsletterView(TestCase):
MAILCHIMP_API_KEY='a' * 32, MAILCHIMP_API_KEY='a' * 32,
MAILCHIMP_LIST_ID='12345' MAILCHIMP_LIST_ID='12345'
) )
@responses.activate
def test_can_subscribe(self): def test_can_subscribe(self):
responses.add(responses.POST, any_url, json={'id': '1234'}, status=200) with mock.patch("hypha.public.mailchimp.views.subscribe_to_mailchimp") as mc_mock:
mc_mock.return_value = None
response = self.client.post(self.url, data={'email': 'email@email.com'}, secure=True, follow=True)
response = self.client.post(self.url, data={'email': 'email@email.com'}, secure=True, follow=True) self.assertNewsletterRedirects(response, self.origin)
self.assertNewsletterRedirects(response, self.origin)
messages = list(response.context['messages']) mc_mock.assert_called_once_with(email='email@email.com', data={'fname': '', 'lname': ''})
self.assertEqual(len(messages), 1)
self.assertIn('Thank you', str(messages[0]))
def test_error_in_form(self): def test_error_in_form(self):
response = self.client.post(self.url, data={'email': 'email_is_bad.com'}, secure=True, follow=True) with mock.patch("hypha.public.mailchimp.views.subscribe_to_mailchimp") as mc_mock:
self.assertNewsletterRedirects(response, self.origin) mc_mock.return_value = None
response = self.client.post(self.url, data={'email': 'email_is_bad.com'}, secure=True, follow=True)
messages = list(response.context['messages']) self.assertNewsletterRedirects(response, self.origin)
self.assertEqual(len(messages), 1)
self.assertIn('errors with', str(messages[0]))
@override_settings(
MAILCHIMP_API_KEY='a' * 32,
MAILCHIMP_LIST_ID='12345'
)
@responses.activate
@mock.patch('hypha.public.mailchimp.views.logger')
def test_error_with_mailchimp(self, logger):
# Copied from the mailchimp playground
response_data = {
"title": "Invalid Resource",
"status": 400,
"detail": "Please provide a valid email address.",
}
responses.add(responses.POST, any_url, json=response_data, status=400)
response = self.client.post(self.url, data={'email': 'email@email.com'}, secure=True, follow=True)
self.assertNewsletterRedirects(response, self.origin)
messages = list(response.context['messages']) assert not mc_mock.called, 'method should not have been called'
self.assertEqual(len(messages), 1)
self.assertIn('problem', str(messages[0]))
# See hypha/public/mailchimp/views.py warning()
# logger.error.assert_called_once_with(response_data)
...@@ -16,6 +16,34 @@ from .forms import NewsletterForm ...@@ -16,6 +16,34 @@ from .forms import NewsletterForm
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def subscribe_to_mailchimp(email: str, data) -> None:
mailchimp_enabled = settings.MAILCHIMP_API_KEY and settings.MAILCHIMP_LIST_ID
dummy_key = 'a' * 32
if not mailchimp_enabled:
raise Exception(
f'Incorrect Mailchimp configuration: '
f'API_KEY: {settings.MAILCHIMP_API_KEY}, LIST_ID: {settings.MAILCHIMP_LIST_ID}'
)
client = MailChimp(
mc_api=settings.MAILCHIMP_API_KEY or dummy_key,
timeout=5.0,
enabled=mailchimp_enabled,
)
data = {k.upper(): v for k, v in data.items()}
client.lists.members.create(
settings.MAILCHIMP_LIST_ID,
{
'email_address': email,
'status': 'pending',
'merge_fields': data,
},
)
@method_decorator(csrf_exempt, name='dispatch') @method_decorator(csrf_exempt, name='dispatch')
class MailchimpSubscribeView(FormMixin, RedirectView): class MailchimpSubscribeView(FormMixin, RedirectView):
form_class = NewsletterForm form_class = NewsletterForm
...@@ -32,44 +60,27 @@ class MailchimpSubscribeView(FormMixin, RedirectView): ...@@ -32,44 +60,27 @@ class MailchimpSubscribeView(FormMixin, RedirectView):
return HttpResponseRedirect(self.get_success_url()) return HttpResponseRedirect(self.get_success_url())
def form_valid(self, form): def form_valid(self, form):
mailchimp_enabled = settings.MAILCHIMP_API_KEY and settings.MAILCHIMP_LIST_ID
dummy_key = 'a' * 32
client = MailChimp(mc_api=settings.MAILCHIMP_API_KEY or dummy_key, timeout=5.0, enabled=mailchimp_enabled)
data = form.cleaned_data.copy() data = form.cleaned_data.copy()
email = data.pop('email') email = data.pop('email')
data = {
k.upper(): v
for k, v in data.items()
}
try: try:
client.lists.members.create(settings.MAILCHIMP_LIST_ID, { subscribe_to_mailchimp(email=email, data=data)
'email_address': email, self.success()
'status': 'pending',
'merge_fields': data,
})
except Exception as e: except Exception as e:
self.warning(e) self.warning(e)
else:
if mailchimp_enabled:
self.success()
else:
self.warning(Exception(
'Incorrect Mailchimp configuration: API_KEY: {}, LIST_ID: {}'.format(
str(settings.MAILCHIMP_API_KEY),
str(settings.MAILCHIMP_LIST_ID),
)
))
return super().form_valid(form) return super().form_valid(form)
def error(self, form): def error(self, form):
messages.error(self.request, _('Sorry, there were errors with your form.') + str(form.errors)) messages.error(
self.request,
_('Sorry, there were errors with your form.') + str(form.errors),
)
def warning(self, e): def warning(self, e):
messages.warning(self.request, _('Sorry, there has been an problem. Please try again later.')) messages.warning(
self.request, _('Sorry, there has been an problem. Please try again later.')
)
# If there is a problem with subscribing uncomment this to get notifications. # If there is a problem with subscribing uncomment this to get notifications.
# When things work warnings is only about spam scipts. # When things work warnings is only about spam scipts.
# logger.error(e.args[0]) # logger.error(e.args[0])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment