Skip to content

Commit

Permalink
ADD get_ticket_content() method to jira.py
Browse files Browse the repository at this point in the history
- Add method get_ticket_content() and ticket_content attribute.
- Update unit tests.
- Update documentation.
  • Loading branch information
mjagelka authored and dmranck committed Aug 14, 2018
1 parent 4149d32 commit abb2efc
Show file tree
Hide file tree
Showing 4 changed files with 141 additions and 48 deletions.
20 changes: 20 additions & 0 deletions read-the-docs/source/JIRA.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ https://docs.atlassian.com/jira/REST/cloud/
Methods
^^^^^^^

- `get_ticket_content() <#get_ticket_content>`__
- `create() <#create>`__
- `edit() <#edit>`__
- `add_comment() <#comment>`__
Expand All @@ -25,6 +26,20 @@ Methods
- `add_watcher() <#add_watcher>`__
- `add_attachment() <#add_attachment>`__

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

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

Queries the JIRA API to get ticket_content using ticket_id. The ticket_content
is expressed in a form of dictionary as a result of JIRA API's get issue:
https://docs.atlassian.com/software/jira/docs/api/REST/7.6.1/#api/2/issue-getIssue

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

Expand Down Expand Up @@ -223,6 +238,7 @@ Create and update JIRA ticket
type='Task',
priority='Major',
assignee='username')
t = ticket.get_ticket_content('Ticket_ID')
t = ticket.add_comment('Test Comment')
t = ticket.edit(priority='Critical',
type='Bug')
Expand Down Expand Up @@ -252,6 +268,10 @@ Update existing JIRA tickets
t = ticket.edit(priority='Critical',
type='Bug')
# Check the actual ticket content after applied updates
t = ticket.get_ticket_content()
returned_ticket_content = t.ticket_content
# Work with a different ticket.
t = ticket.set_ticket_id(<new_ticket_id>)
t = ticket.remove_watcher('username')
Expand Down
2 changes: 1 addition & 1 deletion read-the-docs/source/Usage.rst
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ URL of the ticket. An example is below.

.. note::

For ServiceNow, the user-accessible methods return a ``ticket_content``
For ServiceNow and JIRA 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``.
83 changes: 57 additions & 26 deletions tests/test_jira.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
DESCRIPTION = 'This project is a total failure'
TYPE = 'Task'
FIELDS = {'assignee': 'me'}
TICKET_URL = "{0}/browse/{1}".format(URL, TICKET_ID)

ERROR_MESSAGE = "No ticket ID associated with ticket object. Set ticket ID with set_ticket_id(<ticket_id>)"
RETURN_RESULT = namedtuple('Result', ['status', 'error_message', 'url', 'ticket_content', 'watchers'])
Expand Down Expand Up @@ -114,14 +115,13 @@ class TestJiraTicket(TestCase):
def test_generate_ticket_url(self, mock_session):
mock_session.return_value = FakeSession()
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
TICKET_URL = "{0}/browse/{1}".format(URL, TICKET_ID)
self.assertEqual(TICKET_URL, ticket._generate_ticket_url())
self.assertEqual(ticket.request_result, SUCCESS_RESULT._replace(url=TICKET_URL))
self.assertEqual(ticket.request_result, SUCCESS_RESULT._replace(url=TICKET_URL, ticket_content=MOCK_RESULT))

@patch.object(jira.JiraTicket, '_create_requests_session')
def test_generate_ticket_url_no_ticket_id(self, mock_session):
mock_session.return_value = FakeSession()
ticket = jira.JiraTicket(URL, PROJECT, TYPE)
ticket = jira.JiraTicket(URL, PROJECT)
self.assertEqual(None, ticket._generate_ticket_url())
self.assertEqual(ticket.request_result, SUCCESS_RESULT)

Expand All @@ -139,17 +139,38 @@ def test_verify_project_unexpected_response(self, mock_session):
self.assertFalse(ticket._verify_project(PROJECT))

@patch.object(jira.JiraTicket, '_create_requests_session')
def test_verify_ticket_id(self, mock_session):
def test_get_ticket_content(self, mock_session):
mock_session.return_value = FakeSession()
ticket = jira.JiraTicket(URL, PROJECT)
self.assertTrue(ticket._verify_ticket_id(PROJECT))
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
t = ticket.get_ticket_content(ticket_id=TICKET_ID)
self.assertEqual(ticket.ticket_content, MOCK_RESULT)
self.assertEqual(t, SUCCESS_RESULT._replace(ticket_content=MOCK_RESULT, url=TICKET_URL))

@patch.object(jira.JiraTicket, '_create_requests_session')
def test_verify_ticket_id_unexpected_response(self, mock_session):
def test_get_ticket_content_unexpected_response(self, mock_session):
mock_session.return_value = FakeSession(status_code=401)
error_message = "Error getting ticket content"
with self.assertRaises(TicketException):
ticket = jira.JiraTicket(URL, PROJECT)
self.assertFalse(ticket._verify_ticket_id(PROJECT))
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
t = ticket._verify_ticket_id(ticket_id=TICKET_ID)
self.assertEqual(t, FAILURE_RESULT._replace(error_message=error_message))

@patch.object(jira.JiraTicket, 'get_ticket_content')
@patch.object(jira.JiraTicket, '_create_requests_session')
def test_verify_ticket_id_success(self, mock_session, mock_content):
mock_session.return_value = FakeSession()
mock_content.return_value = SUCCESS_RESULT
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
self.assertTrue(ticket._verify_ticket_id(ticket_id=TICKET_ID))

@patch.object(jira.JiraTicket, 'get_ticket_content')
@patch.object(jira.JiraTicket, '_create_requests_session')
def test_verify_ticket_id_failure(self, mock_session, mock_content):
mock_session.return_value = FakeSession()
mock_content.return_value = FAILURE_RESULT
with self.assertRaises(TicketException):
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
self.assertFalse(ticket._verify_ticket_id(ticket_id=TICKET_ID))

@patch.object(jira.JiraTicket, '_create_ticket_parameters')
@patch.object(jira.JiraTicket, '_create_ticket_request')
Expand Down Expand Up @@ -182,16 +203,17 @@ def test_create_ticket_parameters(self, mock_session, mock_fields):
'assignee': 'me'}}
self.assertEqual(params, expected_params)

@patch.object(jira.JiraTicket, 'get_ticket_content')
@patch.object(jira.JiraTicket, '_generate_ticket_url')
@patch.object(jira.JiraTicket, '_create_requests_session')
def test_create_ticket_request(self, mock_session, mock_url):
def test_create_ticket_request(self, mock_session, mock_url, mock_content):
mock_session.return_value = FakeSession()
ticket = jira.JiraTicket(URL, PROJECT)
mock_url.return_value = 'TICKET_URL'
request_result = ticket._create_ticket_request(FIELDS)
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(jira.JiraTicket, '_create_requests_session')
@patch.object(jira.JiraTicket, '_verify_project')
Expand All @@ -202,14 +224,15 @@ def test_create_ticket_request_unexpected_response(self, mock_verify, mock_sessi
error_message = "Error creating ticket - No internet connection"
self.assertEqual(request_result, FAILURE_RESULT._replace(error_message=error_message))

@patch.object(jira.JiraTicket, 'get_ticket_content')
@patch.object(jira, '_prepare_ticket_fields')
@patch.object(jira.JiraTicket, '_generate_ticket_url')
@patch.object(jira.JiraTicket, '_create_requests_session')
def test_edit(self, mock_session, mock_url, mock_fields):
def test_edit(self, mock_session, mock_url, mock_fields, mock_content):
mock_session.return_value = FakeSession()
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.edit(summary='Edited summary')
self.assertEqual(request_result, SUCCESS_RESULT._replace(url=mock_url.return_value))
self.assertEqual(request_result, mock_content.return_value)

@patch.object(jira, '_prepare_ticket_fields')
@patch.object(jira.JiraTicket, '_create_requests_session')
Expand All @@ -232,13 +255,14 @@ def test_edit_unexpected_response(self, mock_session, mock_url, mock_fields, moc
error_message = "Error editing ticket - No internet connection"
self.assertEqual(request_result, RETURN_RESULT('Failure', error_message, mock_url.return_value, None, None))

@patch.object(jira.JiraTicket, 'get_ticket_content')
@patch.object(jira.JiraTicket, '_generate_ticket_url')
@patch.object(jira.JiraTicket, '_create_requests_session')
def test_add_comment(self, mock_session, mock_url):
def test_add_comment(self, mock_session, mock_url, mock_content):
mock_session.return_value = FakeSession()
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.add_comment('Status update: ...')
self.assertEqual(request_result, SUCCESS_RESULT._replace(url=mock_url.return_value))
self.assertEqual(request_result, mock_content.return_value)

@patch.object(jira.JiraTicket, '_create_requests_session')
def test_add_comment_no_ticket_id(self, mock_session):
Expand All @@ -258,15 +282,16 @@ def test_add_comment_unexpected_response(self, mock_session, mock_url, mock_veri
error_message = "Error adding comment to ticket - No internet connection"
self.assertEqual(request_result, RETURN_RESULT('Failure', error_message, mock_url.return_value, None, None))

@patch.object(jira.JiraTicket, 'get_ticket_content')
@patch.object(jira.JiraTicket, '_get_status_id')
@patch.object(jira.JiraTicket, '_generate_ticket_url')
@patch.object(jira.JiraTicket, '_create_requests_session')
def test_change_status(self, mock_session, mock_url, mock_get_id):
def test_change_status(self, mock_session, mock_url, mock_get_id, mock_content):
mock_session.return_value = FakeSession()
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
mock_get_id.return_value = 'STATUS_ID'
request_result = ticket.change_status('Done')
self.assertEqual(request_result, SUCCESS_RESULT._replace(url=mock_url.return_value))
self.assertEqual(request_result, mock_content.return_value)

@patch.object(jira.JiraTicket, '_create_requests_session')
def test_change_status_no_ticket_id(self, mock_session):
Expand All @@ -288,16 +313,18 @@ def test_change_status_unexpected_response(self, mock_session, mock_url, mock_ve
error_message = "Error changing status of ticket"
self.assertEqual(request_result, RETURN_RESULT('Failure', error_message, mock_url.return_value, None, None))

@patch.object(jira.JiraTicket, 'get_ticket_content')
@patch.object(jira.JiraTicket, '_get_watchers_list')
@patch.object(jira.JiraTicket, '_generate_ticket_url')
@patch.object(jira.JiraTicket, '_create_requests_session')
def test_remove_all_watchers(self, mock_session, mock_url, mock_get_list):
def test_remove_all_watchers(self, mock_session, mock_url, mock_get_list, mock_content):
mock_session.return_value = FakeSession()
mock_content.return_value = SUCCESS_RESULT
watchers = ['me', 'you']
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
mock_get_list.return_value = watchers
request_result = ticket.remove_all_watchers()
self.assertEqual(request_result, RETURN_RESULT('Success', None, mock_url.return_value, None, watchers))
self.assertEqual(request_result, SUCCESS_RESULT._replace(watchers=watchers))

@patch.object(jira.JiraTicket, '_create_requests_session')
def test_remove_all_watchers_no_ticket_id(self, mock_session):
Expand All @@ -320,13 +347,14 @@ def test_remove_all_watchers_unexpected_response(self, mock_session, mock_url, m
error_message = "Error removing 2 watchers from ticket"
self.assertEqual(request_result, RETURN_RESULT('Failure', error_message, mock_url.return_value, None, None))

@patch.object(jira.JiraTicket, 'get_ticket_content')
@patch.object(jira.JiraTicket, '_generate_ticket_url')
@patch.object(jira.JiraTicket, '_create_requests_session')
def test_remove_watcher(self, mock_session, mock_url):
def test_remove_watcher(self, mock_session, mock_url, mock_content):
mock_session.return_value = FakeSession()
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.remove_watcher('me')
self.assertEqual(request_result, SUCCESS_RESULT._replace(url=mock_url.return_value))
self.assertEqual(request_result, mock_content.return_value)

@patch.object(jira.JiraTicket, '_create_requests_session')
def test_remove_watcher_no_ticket_id(self, mock_session):
Expand All @@ -347,13 +375,14 @@ def test_remove_watcher_unexpected_response(self, mock_session, mock_url, mock_v
error_message = "Error removing watcher me from ticket"
self.assertEqual(request_result, RETURN_RESULT('Failure', error_message, mock_url.return_value, None, None))

@patch.object(jira.JiraTicket, 'get_ticket_content')
@patch.object(jira.JiraTicket, '_generate_ticket_url')
@patch.object(jira.JiraTicket, '_create_requests_session')
def test_add_watcher(self, mock_session, mock_url):
def test_add_watcher(self, mock_session, mock_url, mock_content):
mock_session.return_value = FakeSession()
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.add_watcher('me')
self.assertEqual(request_result, SUCCESS_RESULT._replace(url=mock_url.return_value))
self.assertEqual(request_result, mock_content.return_value)

@patch.object(jira.JiraTicket, '_create_requests_session')
def test_add_watcher_no_ticket_id(self, mock_session):
Expand Down Expand Up @@ -381,16 +410,18 @@ def test_add_watcher_empty(self, mock_session, mock_url):
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.add_watcher('')
error_message = 'Error adding as a watcher to ticket'
self.assertEqual(request_result, RETURN_RESULT('Failure', error_message, mock_url.return_value, None, None))
self.assertEqual(request_result, RETURN_RESULT('Failure', error_message, mock_url.return_value, MOCK_RESULT,
None))

@patch.object(jira.JiraTicket, 'get_ticket_content')
@patch('builtins.open')
@patch.object(jira.JiraTicket, '_generate_ticket_url')
@patch.object(jira.JiraTicket, '_create_requests_session')
def test_add_attachment(self, mock_session, mock_url, mock_open):
def test_add_attachment(self, mock_session, mock_url, mock_open, mock_content):
mock_session.return_value = FakeSession()
ticket = jira.JiraTicket(URL, PROJECT, ticket_id=TICKET_ID)
request_result = ticket.add_attachment('file_name')
self.assertEqual(request_result, SUCCESS_RESULT._replace(url=mock_url.return_value))
self.assertEqual(request_result, mock_content.return_value)

@patch.object(jira.JiraTicket, '_create_requests_session')
def test_add_attachment_no_ticket_id(self, mock_session):
Expand Down

0 comments on commit abb2efc

Please sign in to comment.