From fdcd3058e9aafa5bd0597ee7c59a709a387ae2a6 Mon Sep 17 00:00:00 2001 From: caiquepereira Date: Tue, 7 Jun 2016 17:46:23 -0300 Subject: [PATCH 1/8] Create method to verify list on user list Signed-off-by: Eduardo Moreira --- src/colab_superarchives/views.py | 23 +++++++++++++---------- tests/test_privatelist.py | 22 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/src/colab_superarchives/views.py b/src/colab_superarchives/views.py index c8e9b17..30c207c 100644 --- a/src/colab_superarchives/views.py +++ b/src/colab_superarchives/views.py @@ -31,7 +31,6 @@ class ThreadView(View): http_method_names = [u'get', u'post'] def get(self, request, mailinglist, thread_token): - thread = get_object_or_404(Thread, subject_token=thread_token, mailinglist__name=mailinglist) @@ -43,16 +42,10 @@ def get(self, request, mailinglist, thread_token): ) if all_privates.count(thread.mailinglist.name): - if not request.user.is_authenticated(): + if not request.user.is_authenticated() or \ + not self.mailing_list_in_user_list(request.user, + thread.mailinglist.name): raise PermissionDenied - else: - user = User.objects.get(username=request.user) - emails = user.emails.values_list('address', flat=True) - lists_for_user = mailman.get_user_mailinglists(user) - listnames_for_user = mailman.extract_listname_from_list( - lists_for_user) - if thread.mailinglist.name not in listnames_for_user: - raise PermissionDenied thread.hit(request) @@ -138,6 +131,16 @@ def post(self, request, mailinglist, thread_token): return self.get(request, mailinglist, thread_token) + def mailing_list_in_user_list(self, user_name, name_mailing_list): + user = User.objects.get(username=user_name) + lists_for_user = mailman.get_user_mailinglists(user) + listnames_for_user = mailman.extract_listname_from_list( + lists_for_user) + if name_mailing_list not in listnames_for_user: + return False + else: + return True + class ThreadDashboardView(ListView): http_method_names = ['get'] diff --git a/tests/test_privatelist.py b/tests/test_privatelist.py index 8e80e19..3d5af64 100644 --- a/tests/test_privatelist.py +++ b/tests/test_privatelist.py @@ -4,7 +4,7 @@ from colab_superarchives.utils import mailman from django.test import TestCase, Client from colab_superarchives.widgets.dashboard_latest_threads import DashboardLatestThreadsWidget - +from colab_superarchives.views import ThreadView class ArchivesViewTest(TestCase): @@ -72,3 +72,23 @@ def test_dont_see_private_threads_in_profile_if_logged_out(self): emails = request.context['emails'] self.assertEqual(1, len(emails)) + +class ThreadViewTest(TestCase): + + fixtures = ['mailinglistdata.json'] + + def setUp(self): + self.client = Client() + + def authenticate_user(self): + self.client.login(username='johndoe', password='1234') + + def test_mailing_list_in_user_list(self): + self.authenticate_user() + thread = ThreadView() + + user_name = "johndoe" + list_name = "privatelist" + + list_in_user = thread.mailing_list_in_user_list(user_name, list_name) + self.assertTrue(list_in_user) From 3c3bea0e68dfcb1b7788f9a1b4aebf79edc98bc9 Mon Sep 17 00:00:00 2001 From: Eduardo Moreira Date: Thu, 9 Jun 2016 17:08:24 -0300 Subject: [PATCH 2/8] Separating complex methods in put request ThreadView Signed-off-by: caiquepereira --- src/colab_superarchives/views.py | 64 +++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/src/colab_superarchives/views.py b/src/colab_superarchives/views.py index 30c207c..34d7110 100644 --- a/src/colab_superarchives/views.py +++ b/src/colab_superarchives/views.py @@ -100,14 +100,11 @@ def post(self, request, mailinglist, thread_token): 'sendmail/' + mailinglist) error_msg = None - try: - resp = requests.post(url, data=data, timeout=2) - except requests.exceptions.ConnectionError: - resp = None - error_msg = _('Error trying to connect to Mailman API') - except requests.exceptions.Timeout: - resp = None - error_msg = _('Timeout trying to connect to Mailman API') + + response_data = self.get_response_message_sent(url, data) + + resp = response_data[0] + error_msg = response_data[1] if resp and resp.status_code == 200: messages.success(request, _( @@ -118,19 +115,31 @@ def post(self, request, mailinglist, thread_token): )) else: if not error_msg: - if resp is not None: - if resp.status_code == 400: - error_msg = _('You cannot send an empty email') - elif resp.status_code == 404: - error_msg = _('Mailing list does not exist') - else: - error_msg = \ - _('Unknown error trying to connect to Mailman API') + error_msg = self.return_error_message(resp) messages.error(request, error_msg) return self.get(request, mailinglist, thread_token) + def get_response_message_sent(self, url, data): + print "entrou na funcao get_response_message_sent" + error_msg = "" + + try: + resp = requests.post(url, data=data, timeout=2) + except requests.exceptions.ConnectionError: + resp = None + error_msg = _('Error trying to connect to Mailman API') + except requests.exceptions.Timeout: + resp = None + error_msg = _('Timeout trying to connect to Mailman API') + + response_data = [] + response_data.append(resp) + response_data.append(error_msg) + + return response_data + def mailing_list_in_user_list(self, user_name, name_mailing_list): user = User.objects.get(username=user_name) lists_for_user = mailman.get_user_mailinglists(user) @@ -141,6 +150,21 @@ def mailing_list_in_user_list(self, user_name, name_mailing_list): else: return True + def return_error_message(self, response): + print "entrou na funcao return_error_message" + return_message = "" + + if response is not None: + if response.status_code == 400: + return_message = _('You cannot send an empty email') + elif response.status_code == 404: + return_message = _('Mailing list does not exist') + else: + return_message = \ + _('Unknown error trying to connect to Mailman API') + + return return_message + class ThreadDashboardView(ListView): http_method_names = ['get'] @@ -166,8 +190,7 @@ class EmailView(View): http_method_names = [u'head', u'get', u'post', u'delete', u'update'] def get(self, request, key): - """Validate an email with the given key""" - + """Validate an email with the given key.""" try: email_val = EmailAddressValidation.objects.get(validation_key=key) except EmailAddressValidation.DoesNotExist: @@ -201,8 +224,7 @@ def get(self, request, key): @method_decorator(login_required) def post(self, request, key): - """Create new email address that will wait for validation""" - + """Create new email address that will wait for validation.""" email = request.POST.get('email') user_id = request.POST.get('user') if not email: @@ -222,7 +244,6 @@ def post(self, request, key): @method_decorator(login_required) def delete(self, request, key): """Remove an email address, validated or not.""" - request.DELETE = http.QueryDict(request.body) email_addr = request.DELETE.get('email') user_id = request.DELETE.get('user') @@ -252,7 +273,6 @@ def delete(self, request, key): @method_decorator(login_required) def update(self, request, key): """Set an email address as primary address.""" - request.UPDATE = http.QueryDict(request.body) email_addr = request.UPDATE.get('email') From f1f639e86c74d2bcb9c66413fba145f69e71718e Mon Sep 17 00:00:00 2001 From: caiquepereira Date: Thu, 9 Jun 2016 17:39:00 -0300 Subject: [PATCH 3/8] Test empty email message Signed-off-by: Eduardo Moreira --- src/colab_superarchives/views.py | 7 +++---- tests/test_privatelist.py | 21 +++++++++++++++++++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/colab_superarchives/views.py b/src/colab_superarchives/views.py index 34d7110..4d431d8 100644 --- a/src/colab_superarchives/views.py +++ b/src/colab_superarchives/views.py @@ -99,7 +99,8 @@ def post(self, request, mailinglist, thread_token): url = urlparse.urljoin(settings.MAILMAN_API_URL, 'sendmail/' + mailinglist) - error_msg = None + print (data) + print (url) response_data = self.get_response_message_sent(url, data) @@ -122,8 +123,7 @@ def post(self, request, mailinglist, thread_token): return self.get(request, mailinglist, thread_token) def get_response_message_sent(self, url, data): - print "entrou na funcao get_response_message_sent" - error_msg = "" + error_msg = None try: resp = requests.post(url, data=data, timeout=2) @@ -151,7 +151,6 @@ def mailing_list_in_user_list(self, user_name, name_mailing_list): return True def return_error_message(self, response): - print "entrou na funcao return_error_message" return_message = "" if response is not None: diff --git a/tests/test_privatelist.py b/tests/test_privatelist.py index 3d5af64..5456947 100644 --- a/tests/test_privatelist.py +++ b/tests/test_privatelist.py @@ -1,6 +1,7 @@ # -*- coding:utf-8 -*- import mock +import requests from colab_superarchives.utils import mailman from django.test import TestCase, Client from colab_superarchives.widgets.dashboard_latest_threads import DashboardLatestThreadsWidget @@ -79,16 +80,32 @@ class ThreadViewTest(TestCase): def setUp(self): self.client = Client() + self.thread_view = ThreadView() + data = { + 'in_reply_to': 1, + 'email_from': "test@test.com", + 'name_from': "John Doe", + 'subject': "Subject Test", + 'body': "Email body test", + } + url = "http://localhost:8124/v2/sendmail/privatelist" + + self.response = requests.post(url, data=data, timeout=2) def authenticate_user(self): self.client.login(username='johndoe', password='1234') def test_mailing_list_in_user_list(self): self.authenticate_user() - thread = ThreadView() user_name = "johndoe" list_name = "privatelist" - list_in_user = thread.mailing_list_in_user_list(user_name, list_name) + list_in_user = self.thread_view.mailing_list_in_user_list(user_name, + list_name) self.assertTrue(list_in_user) + + def test_empty_email_message(self): + self.response.status_code = 400 + error_message = self.thread_view.return_error_message(self.response) + self.assertEqual(error_message, 'You cannot send an empty email') From c651bb4f40330ce77091d023a5addf9fbfbe3aed Mon Sep 17 00:00:00 2001 From: Eduardo Moreira Date: Thu, 9 Jun 2016 17:45:53 -0300 Subject: [PATCH 4/8] Testing other error messages to post ThreadView response Signed-off-by: caiquepereira --- tests/test_privatelist.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tests/test_privatelist.py b/tests/test_privatelist.py index 5456947..4e1d62d 100644 --- a/tests/test_privatelist.py +++ b/tests/test_privatelist.py @@ -105,7 +105,18 @@ def test_mailing_list_in_user_list(self): list_name) self.assertTrue(list_in_user) - def test_empty_email_message(self): + def test_error_message_empty_email(self): self.response.status_code = 400 error_message = self.thread_view.return_error_message(self.response) self.assertEqual(error_message, 'You cannot send an empty email') + + def test_error_message_mailing_list_not_exist(self): + self.response.status_code = 404 + error_message = self.thread_view.return_error_message(self.response) + self.assertEqual(error_message, 'Mailing list does not exist') + + def test_error_message_unknown_error(self): + self.response = None + error_message = self.thread_view.return_error_message(self.response) + self.assertEqual(error_message, + 'Unknown error trying to connect to Mailman API') From fc601034f43dd87e32063f5b38c1bb1ec4e52c3f Mon Sep 17 00:00:00 2001 From: caiquepereira Date: Thu, 9 Jun 2016 17:55:13 -0300 Subject: [PATCH 5/8] Test get response connection error Signed-off-by: Eduardo Moreira --- tests/test_privatelist.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tests/test_privatelist.py b/tests/test_privatelist.py index 4e1d62d..5c4f292 100644 --- a/tests/test_privatelist.py +++ b/tests/test_privatelist.py @@ -81,7 +81,7 @@ class ThreadViewTest(TestCase): def setUp(self): self.client = Client() self.thread_view = ThreadView() - data = { + self.data = { 'in_reply_to': 1, 'email_from': "test@test.com", 'name_from': "John Doe", @@ -90,7 +90,7 @@ def setUp(self): } url = "http://localhost:8124/v2/sendmail/privatelist" - self.response = requests.post(url, data=data, timeout=2) + self.response = requests.post(url, data=self.data, timeout=2) def authenticate_user(self): self.client.login(username='johndoe', password='1234') @@ -116,7 +116,14 @@ def test_error_message_mailing_list_not_exist(self): self.assertEqual(error_message, 'Mailing list does not exist') def test_error_message_unknown_error(self): - self.response = None - error_message = self.thread_view.return_error_message(self.response) + response = None + error_message = self.thread_view.return_error_message(response) self.assertEqual(error_message, 'Unknown error trying to connect to Mailman API') + + def test_get_response_connection_error(self): + wrong_url = "http://error.url.not.exist" + return_message = self.thread_view.get_response_message_sent( + wrong_url, self.data)[1] + self.assertEqual(return_message, + 'Error trying to connect to Mailman API') From 50a9eea4c38a6eca4ac43d1dba75addafe47ca75 Mon Sep 17 00:00:00 2001 From: Eduardo Moreira Date: Thu, 9 Jun 2016 18:45:37 -0300 Subject: [PATCH 6/8] Testing timeout error in ThreadView put method Signed-off-by: caiquepereira --- src/colab_superarchives/views.py | 3 --- tests/test_mailinglist_view.py | 4 +--- tests/test_privatelist.py | 12 +++++++++++- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/colab_superarchives/views.py b/src/colab_superarchives/views.py index 4d431d8..ca9799b 100644 --- a/src/colab_superarchives/views.py +++ b/src/colab_superarchives/views.py @@ -99,9 +99,6 @@ def post(self, request, mailinglist, thread_token): url = urlparse.urljoin(settings.MAILMAN_API_URL, 'sendmail/' + mailinglist) - print (data) - print (url) - response_data = self.get_response_message_sent(url, data) resp = response_data[0] diff --git a/tests/test_mailinglist_view.py b/tests/test_mailinglist_view.py index 9736bf0..e8e6524 100644 --- a/tests/test_mailinglist_view.py +++ b/tests/test_mailinglist_view.py @@ -109,9 +109,7 @@ def test_private_list_access_with_user_without_permission(self, mock): return_value=[{'listname': 'privatelist'}]) def test_private_list_access_with_user_permission(self, mock): self.authenticate_user() - response = self.client.get( - '/archives/mailinglist/privatelist' - ) + response = self.client.get('/archives/mailinglist/privatelist') self.assertEqual(200, response.status_code) self.assertEqual(len(response.context['thread_list']), 1) diff --git a/tests/test_privatelist.py b/tests/test_privatelist.py index 5c4f292..f921e94 100644 --- a/tests/test_privatelist.py +++ b/tests/test_privatelist.py @@ -1,7 +1,9 @@ # -*- coding:utf-8 -*- import mock +from mock import patch import requests +from requests.exceptions import Timeout from colab_superarchives.utils import mailman from django.test import TestCase, Client from colab_superarchives.widgets.dashboard_latest_threads import DashboardLatestThreadsWidget @@ -88,7 +90,7 @@ def setUp(self): 'subject': "Subject Test", 'body': "Email body test", } - url = "http://localhost:8124/v2/sendmail/privatelist" + url = "http://localhost/" self.response = requests.post(url, data=self.data, timeout=2) @@ -127,3 +129,11 @@ def test_get_response_connection_error(self): wrong_url, self.data)[1] self.assertEqual(return_message, 'Error trying to connect to Mailman API') + + @patch('requests.post', side_effect=Timeout()) + def test_get_response_timeout(self, mock): + any_url = "http://anything.com" + return_message = self.thread_view.get_response_message_sent( + any_url, self.data)[1] + self.assertEqual(return_message, + 'Timeout trying to connect to Mailman API') From a2fbae1919662222b53aa3c3384f4c5ee7c5dba6 Mon Sep 17 00:00:00 2001 From: caiquepereira Date: Thu, 9 Jun 2016 18:56:01 -0300 Subject: [PATCH 7/8] Test get response successfully Signed-off-by: Eduardo Moreira --- tests/test_privatelist.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/tests/test_privatelist.py b/tests/test_privatelist.py index f921e94..9573a78 100644 --- a/tests/test_privatelist.py +++ b/tests/test_privatelist.py @@ -1,7 +1,6 @@ # -*- coding:utf-8 -*- -import mock - from mock import patch +from mock import Mock import requests from requests.exceptions import Timeout from colab_superarchives.utils import mailman @@ -20,11 +19,11 @@ def authenticate_user(self): self.client.login(username='johndoe', password='1234') def test_see_only_private_list_if_member(self): - mailman.get_user_mailinglists = mock.Mock( + mailman.get_user_mailinglists = Mock( return_value=[{'listname': 'privatelist'}]) - mailman.extract_listname_from_list = mock.Mock( + mailman.extract_listname_from_list = Mock( return_value=['privatelist']) - mailman.list_users = mock.Mock(return_value="['johndoe@example.com']") + mailman.list_users = Mock(return_value="['johndoe@example.com']") self.authenticate_user() request = self.client.get('/archives/thread/') @@ -44,9 +43,9 @@ def test_see_only_public_if_not_logged_in(self): self.assertEqual(1, len(list_data)) def test_see_private_thread_in_dashboard_if_member(self): - mailman.get_user_mailinglists = mock.Mock( + mailman.get_user_mailinglists = Mock( return_value="[{'listname': 'privatelist'}]") - mailman.extract_listname_from_list = mock.Mock( + mailman.extract_listname_from_list = Mock( return_value="['privatelist']") self.authenticate_user() @@ -137,3 +136,10 @@ def test_get_response_timeout(self, mock): any_url, self.data)[1] self.assertEqual(return_message, 'Timeout trying to connect to Mailman API') + + @patch('requests.post', return_value=None) + def test_get_response_successfully(self, mock): + any_url = "http://anything.com" + return_message = self.thread_view.get_response_message_sent( + any_url, self.data)[1] + self.assertEqual(return_message, None) From de565a8727d6b79aa64d9381d80f0c8834fa9f1a Mon Sep 17 00:00:00 2001 From: Eduardo Moreira Date: Thu, 9 Jun 2016 19:03:03 -0300 Subject: [PATCH 8/8] Testing unkown error when getting ThreadView POST response Signed-off-by: caiquepereira --- src/colab_superarchives/views.py | 23 +++++++++++++---------- tests/test_privatelist.py | 6 ++++++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/colab_superarchives/views.py b/src/colab_superarchives/views.py index ca9799b..1894a9c 100644 --- a/src/colab_superarchives/views.py +++ b/src/colab_superarchives/views.py @@ -81,6 +81,16 @@ def get(self, request, mailinglist, thread_token): return render(request, 'message-thread.html', context) + def mailing_list_in_user_list(self, user_name, name_mailing_list): + user = User.objects.get(username=user_name) + lists_for_user = mailman.get_user_mailinglists(user) + listnames_for_user = mailman.extract_listname_from_list( + lists_for_user) + if name_mailing_list not in listnames_for_user: + return False + else: + return True + def post(self, request, mailinglist, thread_token): try: thread = Thread.objects.get(subject_token=thread_token, @@ -137,16 +147,6 @@ def get_response_message_sent(self, url, data): return response_data - def mailing_list_in_user_list(self, user_name, name_mailing_list): - user = User.objects.get(username=user_name) - lists_for_user = mailman.get_user_mailinglists(user) - listnames_for_user = mailman.extract_listname_from_list( - lists_for_user) - if name_mailing_list not in listnames_for_user: - return False - else: - return True - def return_error_message(self, response): return_message = "" @@ -155,6 +155,9 @@ def return_error_message(self, response): return_message = _('You cannot send an empty email') elif response.status_code == 404: return_message = _('Mailing list does not exist') + else: + return_message = \ + _('Unknown error trying to connect to Mailman API') else: return_message = \ _('Unknown error trying to connect to Mailman API') diff --git a/tests/test_privatelist.py b/tests/test_privatelist.py index 9573a78..a6f1f73 100644 --- a/tests/test_privatelist.py +++ b/tests/test_privatelist.py @@ -117,6 +117,12 @@ def test_error_message_mailing_list_not_exist(self): self.assertEqual(error_message, 'Mailing list does not exist') def test_error_message_unknown_error(self): + self.response.status_code = 999999 + error_message = self.thread_view.return_error_message(self.response) + self.assertEqual(error_message, + 'Unknown error trying to connect to Mailman API') + + def test_error_message_with_response_none(self): response = None error_message = self.thread_view.return_error_message(response) self.assertEqual(error_message,