def test_search_users(JIRA_MOCK): user_1 = mock.MagicMock() user_1.raw = {"raw_field": "raw_value"} user_1.name = "test" user_1.displayName = "Test test" user_1.emailAddress = "email at lol dot wut" user_1.deleted = False user_1.active = True user_2 = mock.MagicMock() user_2.name = "test 2" user_2.displayName = "Test test 2" user_2.emailAddress = "email2 at lol dot wut" user_2.deleted = True user_2.active = False jira_mock = JIRA_MOCK.return_value jira_mock.search_assignable_users_for_issues.return_value = [ user_1, user_2 ] jira_wrapper = Jira(server="http://lol.wut", auth=("lol", "wut")) result = jira_wrapper.search_users(project="LOL") assert len(result) == 1 assert result[0].raw == user_1.raw jira_mock.search_assignable_users_for_issues.assert_called_once_with( username=None, project="LOL")
def wrapper(**params: Any) -> Any: jira_kwargs = get_jira_kwargs_by_params(params=params, clean=True) params[c.JIRA_PARAM] = Jira(fast=False, **jira_kwargs) f(**params)
def config_init(local: bool, config_values: List[ConfigValue], **params: Dict[str, Any]) -> None: """Создать (перезаписать) конфигурационный файл.""" jira_kwargs = get_jira_kwargs_by_params(params=params, clean=False) Jira.check_authentication(**jira_kwargs) if local: config_path = get_local_config_path() else: config_path = get_global_config_path() config = Config(path=config_path) for value in config_values: config.set(**value._asdict()) config.save()
def create_issue_set( jira: Jira, issue_template: Optional[IssueTemplate], open_in_browser: bool, issue_set: List[IssueFieldsT], ) -> None: """Создание набора Issue из yaml-файла ISSUE_SET_FILE""" if issue_template is not None: for index, issue_fields in enumerate(issue_set): issue_set[index] = issue_template.apply_template( issue_fields=issue_fields) issues = jira.create_issue_set(issue_set=issue_set, ) for issue in issues: if isinstance(issue, SuperIssue): click.echo( f"Created super-issue: {jira.server}/browse/{issue.key}") for sub_issue in issue.sub_issues: click.echo( f" Created sub-issue: {jira.server}/browse/{sub_issue.key}" ) if open_in_browser: webbrowser.open_new_tab(sub_issue.link) else: click.echo(f"Created issue: {jira.server}/browse/{issue.key}") if open_in_browser: webbrowser.open_new_tab(issue.link)
def test_create_issue_set(JIRA_MOCK): jira_mock = JIRA_MOCK.return_value sub_issue = mock.MagicMock( fields=mock.MagicMock(summary="Test sub-issue"), key="LOL-2", ) super_issue = mock.MagicMock( fields=mock.MagicMock(summary="Test issue"), key="LOL-1", ) jira_mock.create_issue.side_effect = [super_issue, sub_issue] jira_wrapper = Jira(server="http://lol.wut", auth=("lol", "wut")) result = jira_wrapper.create_issue_set(issue_set=[{ "summary": "Test issue", "issuetype": "Story", "description": "Test description", "jtl_sub_issues": [{ "summary": "Test sub-issue", "issuetype": "Task", }], }], ) assert len(result) == 1 result_super_issue = result[0] assert isinstance(result_super_issue, SuperIssue) assert result_super_issue.key == "LOL-1" assert result_super_issue.summary == "Test issue" assert len(result_super_issue.sub_issues) == 1 result_sub_issue = result_super_issue.sub_issues[0] assert isinstance(result_sub_issue, SubIssue) assert result_sub_issue.key == "LOL-2" assert result_sub_issue.summary == "Test sub-issue" assert jira_mock.create_issue.call_count == 2
def search_projects(jira: Jira, search_string: Optional[str]) -> List[Project]: projects = jira.get_projects() found: List[Project] = [] for project in projects: if is_empty_or_match(search_string, project.key) or is_empty_or_match( search_string, project.name): found.append(project) return found
def autocompletion_wrapper(ctx: click.Context, args: list, incomplete: str) -> List[str]: jira_kwargs = get_jira_kwargs_by_params(params=ctx.params, clean=False) try: jira = Jira(fast=True, **jira_kwargs) result = autocompletion(jira, ctx.params, incomplete) except JiraError: return [] else: return result
def search_issue_types( jira: Jira, search_string: Optional[str], ) -> List[IssueType]: issue_types = jira.get_issue_types() found: List[IssueType] = [] for issue_type in issue_types: if is_empty_or_match(search_string, issue_type.name): found.append(issue_type) return found
def search_users( jira: Jira, project: str, search_string: str, ) -> None: """Показать пользовательские логины, доступные для поля assignee. Доступна фильтрация по SEARCH_STRING. """ users = jira.search_users(project=project, search_string=search_string) for user in users: click.echo(f"{user.name} ({user.displayName}, {user.emailAddress})")
def get_issue( ctx: click.Context, jira: Jira, issue_id: str, ) -> None: """Получить все доступные поля задачи в формате YAML.""" try: issue = jira.get_issue(issue_id=issue_id) except JiraError as e: raise_jira_response_error(jira_error_wrapper=e, ctx=ctx) fields = issue.raw["fields"] yaml_string = yaml.dump(fields, allow_unicode=True) click.echo(yaml_string)
def create_issue( ctx: click.Context, jira: Jira, issue_template: Optional["IssueTemplate"], project: str, issue_type: str, assignee: Optional[str], summary: str, open_in_browser: bool, ) -> None: """Создание задачи.""" fields = { "project": { "key": project, }, "issuetype": { "name": issue_type, }, "summary": summary, } if assignee is not None: assignee_field = {"assignee": {"name": assignee}} fields.update(assignee_field) if issue_template is not None: fields = issue_template.apply_template(issue_fields=fields) try: created_issue = jira.create_issue(fields=fields) except JiraError as e: raise_jira_response_error(jira_error_wrapper=e, ctx=ctx) else: click.echo(f"Created issue: {created_issue.link}") if open_in_browser: webbrowser.open_new_tab(created_issue.link)
def assignee_autocompletion(jira: Jira, params: dict, incomplete: str) -> List[str]: project: str = params[PROJECT_PARAM] users = jira.search_users(project=project, search_string=incomplete) usernames = [u.name for u in users] return usernames