Skip to content

Commit

Permalink
ADD get_ticket_content() method to redmine.py
Browse files Browse the repository at this point in the history
- Add ticket_content argument and get_ticket_content() method for Redmine.
- Update unit tests.
- Update documentation.
  • Loading branch information
mjagelka authored and dmranck committed Aug 28, 2018
1 parent d27e586 commit 4383699
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 40 deletions.
22 changes: 21 additions & 1 deletion read-the-docs/source/Redmine.rst
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ methods, so you can use the name instead of having to look up the id.
Methods
^^^^^^^

- `get_ticket_content() <#get_ticket_content>`__
- `create() <#create>`__
- `edit() <#edit>`__
- `add_comment() <#comment>`__
Expand All @@ -30,6 +31,21 @@ Methods
- `add_attachment() <#add_attachment>`__


get_ticket_content()
--------------------

``get_ticket_content(self, ticket_id=None)``

Queries the Redmine API to get ticket_content using ticket_id. The
ticket_content is expressed in a form of dictionary as a result of Redmine API's
get issue:
http://www.redmine.org/projects/redmine/wiki/Rest_Issues#Showing-an-issue

.. code:: python
t = ticket.get_ticket_content(<ticket_id>)
returned_ticket_content = t.ticket_content
create()
--------

Expand Down Expand Up @@ -242,9 +258,13 @@ Update existing Redmine tickets
t = ticket.edit(priority='High',
done_ratio='90')
# Check the ticket content.
t = ticket.get_ticket_id()
returned_ticket_content = t.ticket_content
# Work with a different ticket.
t = ticket.set_ticket_id(<new_ticket_id>)
t = ticket.change_status('Resolved')
# Close Requests session.
ticket.close_requests_session()
ticket.close_requests_session()
5 changes: 2 additions & 3 deletions read-the-docs/source/Usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ URL of the ticket. An example is below.

.. note::

For ServiceNow, JIRA, and Bugzilla, the user-accessible methods return a ``ticket_content``
For ServiceNow, Jira, Bugzilla and Redmine the user-accessible methods return a ``ticket_content``
field, which contains a json representation of the current ticket's content.
This will be expanded to the other ticketutil tools in the future. Access this
data with ``t.ticket_content``.
Access this data with ``t.ticket_content``.
72 changes: 52 additions & 20 deletions tests/test_redmine.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,13 @@
FAILURE_RESULT1 = RETURN_RESULT('Failure', ERROR_MESSAGE, None, None)
FAILURE_RESULT2 = RETURN_RESULT('Failure', '', TICKET_URL, None)

MOCK_CONTENT = {'issue': {'id': TICKET_ID},
'upload': {'token': 'Token'},
'project': {'id': 'ID'},
'issue_statuses': [{'name': 'started', 'id': 1}, {'name': 'finished', 'id': 2}],
'issue_priorities': [{'name': 'low', 'id': 1}, {'name': 'high', 'id': 2}],
'users': [{'login': 'me', 'id': 1}, {'login': 'you', 'id': 2}]}


class FakeSession(object):
"""
Expand Down Expand Up @@ -63,12 +70,7 @@ def raise_for_status(self):
raise IOError

def json(self):
return {'issue': {'id': TICKET_ID},
'upload': {'token': 'Token'},
'project': {'id': 'ID'},
'issue_statuses': [{'name': 'started', 'id': 1}, {'name': 'finished', 'id': 2}],
'issue_priorities': [{'name': 'low', 'id': 1}, {'name': 'high', 'id': 2}],
'users': [{'login': 'me', 'id': 1}, {'login': 'you', 'id': 2}]}
return MOCK_CONTENT


class TestRedmineTicket(TestCase):
Expand Down Expand Up @@ -100,6 +102,29 @@ def test_verify_project_not_valid(self, mock_session):
ticket = redmine.RedmineTicket(URL, PROJECT)
self.assertFalse(ticket._verify_project(PROJECT))

@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_get_ticket_content_no_id(self, mock_session):
mock_session.return_value = FakeSession()
ticket = redmine.RedmineTicket(URL, PROJECT)
t = ticket.get_ticket_content()
self.assertEqual(t, FAILURE_RESULT1)

@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_get_ticket_content_unexpected_response(self, mock_session):
mock_session.return_value = FakeSession(status_code=400)
error_message = "Error getting ticket content"
with patch.object(redmine.RedmineTicket, '_verify_project'):
ticket = redmine.RedmineTicket(URL, PROJECT, TICKET_ID)
t = ticket.get_ticket_content(ticket_id=TICKET_ID)
self.assertEqual(t, FAILURE_RESULT1._replace(error_message=error_message))

@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_get_ticket_content(self, mock_session):
mock_session.return_value = FakeSession()
ticket = redmine.RedmineTicket(URL, PROJECT, TICKET_ID)
t = ticket.get_ticket_content(ticket_id=TICKET_ID)
self.assertEqual(t.ticket_content, MOCK_CONTENT)

@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_verify_ticket_id(self, mock_session):
mock_session.return_value = FakeSession()
Expand Down Expand Up @@ -155,14 +180,15 @@ def test_create_ticket_request_unexpected_response(self, mock_session, mock_id,
request_result = ticket._create_ticket_request({})
self.assertEqual(request_result, FAILURE_RESULT1._replace(error_message=''))

@patch.object(redmine.RedmineTicket, 'get_ticket_content')
@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_create_ticket_request(self, mock_session):
def test_create_ticket_request(self, mock_session, mock_content):
mock_session.return_value = FakeSession()
ticket = redmine.RedmineTicket(URL, PROJECT)
request_result = ticket._create_ticket_request({})
self.assertEqual(ticket.ticket_id, TICKET_ID)
self.assertEqual(ticket.ticket_url, TICKET_URL)
self.assertEqual(request_result, SUCCESS_RESULT)
self.assertEqual(request_result, mock_content.return_value)

@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_edit_no_id(self, mock_session):
Expand All @@ -181,13 +207,14 @@ def test_edit_unexpected_response(self, mock_session, mock_id, mock_project, moc
request_result = ticket.edit()
self.assertEqual(request_result, RETURN_RESULT('Failure', '', TICKET_URL, None))

@patch.object(redmine.RedmineTicket, 'get_ticket_content')
@patch.object(redmine.RedmineTicket, '_prepare_ticket_fields')
@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_edit(self, mock_session, mock_fields):
def test_edit(self, mock_session, mock_fields, mock_content):
mock_session.return_value = FakeSession()
ticket = redmine.RedmineTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.edit()
self.assertEqual(request_result, SUCCESS_RESULT)
self.assertEqual(request_result, mock_content.return_value)

@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_add_comment_no_id(self, mock_session):
Expand All @@ -205,13 +232,14 @@ def test_add_comment_unexpected_response(self, mock_session, mock_id, mock_proje
request_result = ticket.add_comment('')
self.assertEqual(request_result, RETURN_RESULT('Failure', '', TICKET_URL, None))

@patch.object(redmine.RedmineTicket, 'get_ticket_content')
@patch.object(redmine.RedmineTicket, '_prepare_ticket_fields')
@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_add_comment(self, mock_session, mock_fields):
def test_add_comment(self, mock_session, mock_fields, mock_content):
mock_session.return_value = FakeSession()
ticket = redmine.RedmineTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.add_comment('')
self.assertEqual(request_result, SUCCESS_RESULT)
self.assertEqual(request_result, mock_content.return_value)

@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_change_status_no_ticket_id(self, mock_session):
Expand Down Expand Up @@ -241,14 +269,15 @@ def test_change_status_unexpected_response(self, mock_session, mock_id, mock_pro
request_result = ticket.change_status('')
self.assertEqual(request_result, RETURN_RESULT('Failure', '', TICKET_URL, None))

@patch.object(redmine.RedmineTicket, 'get_ticket_content')
@patch.object(redmine.RedmineTicket, '_get_status_id')
@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_change_status(self, mock_session, mock_get_id):
def test_change_status(self, mock_session, mock_get_id, mock_content):
mock_session.return_value = FakeSession()
mock_get_id.return_value = 1
ticket = redmine.RedmineTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.change_status('')
self.assertEqual(request_result, SUCCESS_RESULT)
self.assertEqual(request_result, mock_content.return_value)

@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_remove_watcher_no_ticket_id(self, mock_session):
Expand All @@ -267,13 +296,14 @@ def test_remove_watcher_unexpected_response(self, mock_session, mock_project, mo
request_result = ticket.remove_watcher('me')
self.assertEqual(request_result, RETURN_RESULT('Failure', '', TICKET_URL, None))

@patch.object(redmine.RedmineTicket, 'get_ticket_content')
@patch.object(redmine.RedmineTicket, '_get_user_id')
@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_remove_watcher(self, mock_session, mock_get_id):
def test_remove_watcher(self, mock_session, mock_get_id, mock_content):
mock_session.return_value = FakeSession()
ticket = redmine.RedmineTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.remove_watcher('me')
self.assertEqual(request_result, SUCCESS_RESULT)
self.assertEqual(request_result, mock_content.return_value)

@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_add_watcher_no_ticket_id(self, mock_session):
Expand All @@ -282,14 +312,15 @@ def test_add_watcher_no_ticket_id(self, mock_session):
request_result = ticket.add_watcher('me')
self.assertEqual(request_result, FAILURE_RESULT1)

@patch.object(redmine.RedmineTicket, 'get_ticket_content')
@patch.object(redmine.RedmineTicket, '_get_user_id')
@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_add_watcher(self, mock_session, mock_get_id):
def test_add_watcher(self, mock_session, mock_get_id, mock_content):
mock_session.return_value = FakeSession()
mock_get_id.return_value = 1
ticket = redmine.RedmineTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.add_watcher('me')
self.assertEqual(request_result, SUCCESS_RESULT)
self.assertEqual(request_result, mock_content.return_value)

@patch.object(redmine.RedmineTicket, '_get_user_id')
@patch.object(redmine.RedmineTicket, '_verify_ticket_id')
Expand Down Expand Up @@ -319,14 +350,15 @@ def test_add_attachment_no_ticket_id(self, mock_session):
request_result = ticket.add_attachment('file_name')
self.assertEqual(request_result, FAILURE_RESULT1)

@patch.object(redmine.RedmineTicket, 'get_ticket_content')
@patch.object(redmine.RedmineTicket, '_upload_file')
@patch.object(redmine.RedmineTicket, '_create_requests_session')
def test_add_attachment(self, mock_session, mock_upload):
def test_add_attachment(self, mock_session, mock_upload, mock_content):
mock_session.return_value = FakeSession()
mock_upload.return_value = 1
ticket = redmine.RedmineTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.add_attachment('file_name')
self.assertEqual(request_result, SUCCESS_RESULT)
self.assertEqual(request_result, mock_content.return_value)

@patch.object(redmine.RedmineTicket, '_upload_file')
@patch.object(redmine.RedmineTicket, '_verify_ticket_id')
Expand Down

0 comments on commit 4383699

Please sign in to comment.