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")
Ejemplo n.º 2
0
        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)
Ejemplo n.º 3
0
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()
Ejemplo n.º 4
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
 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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
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})")
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
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