From 54b7f5e8d398fe2bd805cbf554305cd0c09e4611 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jan 19 2017 10:41:17 +0000 Subject: [PATCH 1/4] Do not convert the milestones and priorities to string randomly Rather, rely on the current/default behavior which seems to be doing what is expected. Fixes https://pagure.io/pagure/issue/1699 --- diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index 574474b..ac56587 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -947,8 +947,8 @@ def view_issue(repo, issueid, username=None, namespace=None): close_status=repo.close_status, ) form.status.data = issue.status - form.priority.data = str(issue.priority) - form.milestone.data = str(issue.milestone) + form.priority.data = issue.priority + form.milestone.data = issue.milestone form.private.data = issue.private form.close_status.data = '' if issue.close_status: From 33ff8d7e073b7187f097d39b7b65d69deaef5a21 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jan 19 2017 10:41:17 +0000 Subject: [PATCH 2/4] Fix running the unit-tests without a local smtp server --- diff --git a/tests/test_pagure_flask_ui_login.py b/tests/test_pagure_flask_ui_login.py index 966a35f..c59d50c 100644 --- a/tests/test_pagure_flask_ui_login.py +++ b/tests/test_pagure_flask_ui_login.py @@ -23,7 +23,7 @@ import os import flask import pygit2 -from mock import patch +from mock import patch, MagicMock sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) @@ -53,6 +53,7 @@ class PagureFlaskLogintests(tests.Modeltests): self.app = pagure.APP.test_client() + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) def test_new_user(self): """ Test the new_user endpoint. """ @@ -329,6 +330,7 @@ class PagureFlaskLogintests(tests.Modeltests): self.assertIn( 'Email confirmed, account activated', output.data) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) def test_lost_password(self): """ Test the lost_password endpoint. """ @@ -381,6 +383,7 @@ class PagureFlaskLogintests(tests.Modeltests): 'check your spam folder? Otherwise, try again after some time.', output.data) + @patch('pagure.lib.notify.send_email', MagicMock(return_value=True)) def test_reset_password(self): """ Test the reset_password endpoint. """ diff --git a/tests/test_pagure_lib_notify.py b/tests/test_pagure_lib_notify.py index e8f2ba4..99ad3ce 100644 --- a/tests/test_pagure_lib_notify.py +++ b/tests/test_pagure_lib_notify.py @@ -16,7 +16,7 @@ import shutil import sys import os -from mock import patch +from mock import patch, MagicMock sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) @@ -169,8 +169,11 @@ class PagureLibNotifytests(tests.Modeltests): out = pagure.lib.notify._get_emails_for_obj(iss) self.assertEqual(out, exp) - def test_get_emails_for_obj_pr(self): + @patch('pagure.lib.notify.smtplib.SMTP') + def test_get_emails_for_obj_pr(self, mock_smtp): """ Test the _get_emails_for_obj method from pagure.lib.notify. """ + mock_smtp.return_value = MagicMock() + tests.create_projects(self.session) # Create the project ns/test @@ -246,8 +249,11 @@ class PagureLibNotifytests(tests.Modeltests): out = pagure.lib.notify._get_emails_for_obj(req) self.assertEqual(out, exp) - def test_get_emails_for_obj_pr_watching_project(self): + @patch('pagure.lib.notify.smtplib.SMTP') + def test_get_emails_for_obj_pr_watching_project(self, mock_smtp): """ Test the _get_emails_for_obj method from pagure.lib.notify. """ + mock_smtp.return_value = MagicMock() + tests.create_projects(self.session) # Create the project ns/test @@ -324,8 +330,11 @@ class PagureLibNotifytests(tests.Modeltests): out = pagure.lib.notify._get_emails_for_obj(req) self.assertEqual(out, exp) - def test_send_email(self): + @patch('pagure.lib.notify.smtplib.SMTP') + def test_send_email(self, mock_smtp): """ Test the notify_new_comment method from pagure.lib.notify. """ + mock_smtp.return_value = MagicMock() + email = pagure.lib.notify.send_email( 'Email content', 'Email “Subject“', From 78fa9ed4ed08f98bc78d9d88fef0b1157ab75037 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jan 19 2017 10:41:17 +0000 Subject: [PATCH 3/4] Add unit-tests checking the behavior of view_issue when non-ascii milestone --- diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index 3451282..eb29e77 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -509,6 +509,44 @@ class PagureFlaskIssuestests(tests.Modeltests): output = self.app.get('/test/issue/1') self.assertEqual(output.status_code, 404) + # Issue with a non-ascii milestone but project has no milestone + repo = pagure.lib.get_project(self.session, 'test') + repo.settings = {'issue_tracker': True} + self.session.add(repo) + self.session.commit() + + issue = pagure.lib.search_issues(self.session, repo, issueid=1) + message = pagure.lib.edit_issue( + self.session, + issue=issue, + milestone=b'käpy'.decode('utf-8'), + private=False, + user='pingou', + ticketfolder=None, + ) + self.assertEqual(message, 'Successfully edited issue #1') + self.session.commit() + + output = self.app.get('/test/issue/1') + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Issue #1: Test issue - test - Pagure', + output.data) + self.assertNotIn(b'käpy'.decode('utf-8'), output.data) + + # Issue with non-ascii milestone and project as well + repo = pagure.lib.get_project(self.session, 'test') + repo.milestones = {b'käpy'.decode('utf-8'): None} + self.session.add(repo) + self.session.commit() + + output = self.app.get('/test/issue/1') + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Issue #1: Test issue - test - Pagure', + output.data) + self.assertIn(b'käpy'.decode('utf-8'), output.data.decode('utf-8')) + @patch('pagure.lib.git.update_git') @patch('pagure.lib.notify.send_email') def test_update_issue(self, p_send_email, p_ugt): From 56da109c217416767361cc4ffaf75047ada98768 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Jan 19 2017 10:41:17 +0000 Subject: [PATCH 4/4] Rework the test-case --- diff --git a/tests/test_pagure_flask_ui_issues.py b/tests/test_pagure_flask_ui_issues.py index eb29e77..f8c3c77 100644 --- a/tests/test_pagure_flask_ui_issues.py +++ b/tests/test_pagure_flask_ui_issues.py @@ -509,12 +509,37 @@ class PagureFlaskIssuestests(tests.Modeltests): output = self.app.get('/test/issue/1') self.assertEqual(output.status_code, 404) - # Issue with a non-ascii milestone but project has no milestone + @patch('pagure.lib.git.update_git') + @patch('pagure.lib.notify.send_email') + def test_view_issue_non_ascii_milestone(self, p_send_email, p_ugt): + """ Test the view_issue endpoint with non-ascii milestone. """ + p_send_email.return_value = True + p_ugt.return_value = True + + output = self.app.get('/foo/issue/1') + self.assertEqual(output.status_code, 404) + + tests.create_projects(self.session) + tests.create_projects_git( + os.path.join(self.path), bare=True) + + output = self.app.get('/test/issue/1') + self.assertEqual(output.status_code, 404) + + # Create issues to play with repo = pagure.lib.get_project(self.session, 'test') - repo.settings = {'issue_tracker': True} - self.session.add(repo) + msg = pagure.lib.new_issue( + session=self.session, + repo=repo, + title='Test issue', + content='We should work on this', + user='pingou', + ticketfolder=None + ) self.session.commit() + self.assertEqual(msg.title, 'Test issue') + # Add a non-ascii milestone to the issue but project has no milestone issue = pagure.lib.search_issues(self.session, repo, issueid=1) message = pagure.lib.edit_issue( self.session, @@ -534,12 +559,13 @@ class PagureFlaskIssuestests(tests.Modeltests): output.data) self.assertNotIn(b'käpy'.decode('utf-8'), output.data) - # Issue with non-ascii milestone and project as well + # Add a non-ascii milestone to the project repo = pagure.lib.get_project(self.session, 'test') repo.milestones = {b'käpy'.decode('utf-8'): None} self.session.add(repo) self.session.commit() + # View the issue output = self.app.get('/test/issue/1') self.assertEqual(output.status_code, 200) self.assertIn(