class Jira_Map: def __init__(self, root_id): self.root_id = root_id self.api_jira = API_Jira() self.wmap = Wardley_Map() self.link_type = 'needs' self.api_jira._jira = JIRA( server='https://ubuntu-policy.atlassian.net/') def add_node(self, issue_id, depth_delta=0): issue = self.api_jira.issue(issue_id) summary = issue['Summary'] self.wmap.add_node(issue['Summary'], issue['Status'], depth_delta) issue.get('Issue Links') summary = issue.get('Summary') issue_links = issue.get('Issue Links') for link_id in issue_links: for issue_link in issue_links[link_id]: if issue_link['Link Type'] == self.link_type: self.add_node(link_id, depth_delta + 1.5) self.wmap.add_link(summary, issue_link.get('Summary')) def create(self): self.add_node(self.root_id) return self def show(self, height=300): self.create() self.wmap.show_map(height)
class Test_API_Jira(unittest.TestCase): def setUp(self): self.api = API_Jira() # check connection def test_jira_server_info(self): jira = self.api.jira() assert jira.server_info().get('version') == '7.5.0' def test_jira(self): jira = self.api.jira() assert jira.__class__.__name__ == 'JIRA' assert jira.current_user() == 'gsbot' # methods def test_covert_issue(self): raw_issue = self.api.jira().issue('TASK-502') # 'FACT-10') # issue = self.api.convert_issue(raw_issue) Dev.pprint(issue) # raw_issue = self.api.jira().issue('SEC-9195')# 'FACT-10') # # issue = self.api.convert_issue(raw_issue) # self.api.convert_issue(self.api.jira().issue('SEC-9195')) # assert issue['Labels' ] == ['SEC-9195', 'SEC-9195-CFO'] # check the fields added recently # assert issue['Priority' ] == 'Minor' # # raw_issue = self.api.jira().issue('GSOKR-900') # check epic link # issue = self.api.convert_issue(raw_issue) # assert issue['Epic Link'] == 'GSOKR-924' # # raw_issue = self.api.jira().issue('GSOKR-872') # check parent (for sub taks) # issue = self.api.convert_issue(raw_issue) # assert issue['Parent'] == 'GSOKR-279' # #Dev.pprint(issue) def test_fields(self): fields = self.api.fields() assert len(fields) > 10 # data = {} # for field in fields: # data[field['name']] = field # print() # print('|--------------------------------------------------------------------------------------------------|') # print('| name | id | custom |') # print('|--------------------------------------------------------------------------------------------------|') # for name in sorted(set(data.keys())): # field = data[name] # print('| {0:55} | {1:25} | {2:10} |'.format(field['name'], field['id'], str(field['custom']))) def test_fields_by_name(self): fields_by_name = self.api.fields_by_name() assert len(set(fields_by_name)) > 300 @unittest.skip('this needs to be fixed top reflect the latest added fields' ) def test_issue(self): issue = self.api.issue('RISK-1083') assert issue == { 'Components': [], 'Issue Type': 'Risk', 'Issue Links': [], 'Key': 'RISK-1083', 'Issue Links': { 'RISK-1060': { 'Direction': 'Inward', 'Issue Type': 'Risk', 'Link Type': 'is blocked by', 'Priority': 'Minor', 'Status': 'Fixed', 'Summary': 'Test Risk' }, 'RISK-45': { 'Direction': 'Outward', 'Issue Type': 'Risk', 'Link Type': 'is child of', 'Priority': 'High', 'Status': 'Fixed', 'Summary': 'Test issue creation' }, 'RISK-32': { 'Direction': 'Outward', 'Issue Type': 'Risk', 'Link Type': 'relates to', 'Priority': 'Medium', 'Status': 'Fixed', 'Summary': 'TEST' } }, 'Rating': 'To be determined', 'Risk Description': 'This is an description', 'Risk Owner': 'Dinis Cruz', 'Status': 'Fixed', 'Summary': 'Test risk to GS-Bot' } def test_issue_add_link__error(self): try: Dev.pprint(self.api.issue_add_link('from', 'link_type', 'to')) except Exception as error: assert error.text == "No issue link type with name 'link_type' found." @unittest.skip( 'needs to be refactored (this method will get the change log for the issues' ) def _test_issue_change_log_only_status(self): statuses = self.api.issue_changes_log_only_status("Project=VULN", 300) Dev.pprint(statuses) #Dev.pprint(list(set(types))) def test_issue_update(self): issue_data = { "Key": "RISK-12", "Summary": "new summary value", "Risk Description": "el risk description", "Description": "the description" } #"Risk Rating" : "Low" } #"Status" : "Blocked" ,} result = self.api.issue_update(issue_data) Dev.pprint(result) # def test_issues_updated_in_last_hour(self): # results = self.api.issues_updated_in_last_hour() # assert len(results) > 0 # # # results_1h = self.api.issues_updated_in_last_hour(1) # results_10h = self.api.issues_updated_in_last_hour(10) # assert results == results_1h # assert set(results_1h) == {'FACT-13', 'RISK-1597'} # assert len(set(results_10h)) == 19 # def test_issues_updated_in_last_day(self): # results = self.api.issues_updated_in_last_day() # assert len(set(results)) > 1 # #Dev.pprint(len(set(results))) def test_projects(self): results = self.api.jira().projects() assert len(results) > 100 def test_search(self): issues = self.api.search('labels=R1') assert issues['RISK-1592']['Summary'] == '6 - Risk to Brand' assert len(set(issues)) == 6 def test_search_just_return_keys(self): keys = self.api.search_just_return_keys('labels=R1') assert keys == [ 'RISK-1592', 'RISK-1534', 'RISK-1498', 'RISK-1496', 'RISK-1495', 'RISK-1494' ] #keys = self.api.search_just_return_keys('project=RISK') #assert len(set(keys)) > 100 def test_covert_issue_vuln_priority(self): assert self.api.issue('VULN-1205').get('VULN Priority') == 'P3' assert self.api.issue('VULN-1624').get('VULN Priority') is None