Esempio n. 1
0
 def test_state(self):
     opened = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 39)
     closed = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 6)
     merged = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 69)
     self.assertEqual(merged.state, MergeRequestStates.MERGED)
     self.assertEqual(closed.state, MergeRequestStates.CLOSED)
     self.assertEqual(opened.state, MergeRequestStates.OPEN)
Esempio n. 2
0
 def test_merge_params(self):
     commit_msg = 'Test commit title\n\nTest commit body'
     head_sha = '2dfdc8f236fd5a4683ac52addb9d92b2920d6cfe'
     mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 75)
     mr.merge(message=commit_msg, sha=head_sha,
              should_remove_source_branch=True,
              _gitlab_merge_when_pipeline_succeeds=True)
     self.assertEqual(mr.state, MergeRequestStates.MERGED)
Esempio n. 3
0
    def _handle_webhook_merge_request(self, data, repository):
        merge_request_data = data['object_attributes']
        merge_request_obj = GitLabMergeRequest.from_data(
            merge_request_data, self._token, repository,
            merge_request_data['iid'])
        trigger_event = {
            'update': MergeRequestActions.ATTRIBUTES_CHANGED,
            'open': MergeRequestActions.OPENED,
            'reopen': MergeRequestActions.REOPENED,
            'merge': MergeRequestActions.MERGED,
            'close': MergeRequestActions.CLOSED,
        }.get(merge_request_data['action'])

        # nasty workaround for finding merge request resync
        if 'oldrev' in merge_request_data:
            trigger_event = MergeRequestActions.SYNCHRONIZED

        # no such webhook event action implemented yet
        if not trigger_event:
            raise NotImplementedError('Unrecgonized action: Merge Request Hook'
                                      '/' + merge_request_data['action'])

        if (trigger_event is MergeRequestActions.ATTRIBUTES_CHANGED
                and 'labels' in data['changes']):
            yield from type(self)._handle_labels(MergeRequestActions,
                                                 merge_request_obj, data)
        else:
            yield trigger_event, [merge_request_obj]
Esempio n. 4
0
    def _handle_webhook_note(self, data, repository):
        comment = data['object_attributes']
        comment_type = {
            'MergeRequest': CommentType.MERGE_REQUEST,
            'Commit': CommentType.COMMIT,
            'Issue': CommentType.ISSUE,
            'Snippet': CommentType.SNIPPET
        }.get(comment['noteable_type'])

        if comment_type == CommentType.MERGE_REQUEST:
            iid = data['merge_request']['iid']
            iss = GitLabMergeRequest.from_data(data['merge_request'],
                                               self._token, repository, iid)
            action = MergeRequestActions.COMMENTED
        elif comment_type == CommentType.ISSUE:
            iid = data['issue']['iid']
            iss = GitLabIssue.from_data(data['issue'], self._token, repository,
                                        iid)
            action = IssueActions.COMMENTED
        else:
            raise NotImplementedError

        yield action, [
            iss,
            GitLabComment.from_data(comment, self._token, repository, iid,
                                    comment_type, comment['id'])
        ]
    def test_gitlab_pr_sync_stale_label(self, m_search_mrs, m_mr_labels):
        m_mr_labels.return_value = set()
        m_search_mrs.return_value = {
            GitLabMergeRequest(self.gl_token, self.gl_repo.full_name, 2)
        }
        self.simulate_scheduled_responder_call(
            'pr_stale_reminder.add_stale_label_to_merge_requests',
            self.gl_repo)
        m_mr_labels.assert_called_with({'status/STALE'})

        # testing updated issues
        data = {
            'object_attributes': {
                'target': {
                    'path_with_namespace': self.gl_repo.full_name
                },
                'action': 'update',
                'oldrev': 'thisisrequiredforshowingasresyncedpr',
                'iid': 2
            }
        }
        m_mr_labels.return_value = {'bug', 'status/STALE'}
        response = self.simulate_gitlab_webhook_call('Merge Request Hook',
                                                     data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # only the 'bug' label remains after removing 'status/STALE'
        m_mr_labels.assert_called_with({'bug'})
    def test_gitlab_pr_comment_stale_label(self, m_body, m_search_mrs,
                                           m_mr_labels):
        m_mr_labels.return_value = set()
        m_search_mrs.return_value = {
            GitLabMergeRequest(self.gl_token, self.gl_repo.full_name, 2)
        }
        self.simulate_scheduled_responder_call(
            'pr_stale_reminder.add_stale_label_to_merge_requests',
            self.gl_repo)
        m_mr_labels.assert_called_with({'status/STALE'})

        # testing updated issues
        data = {
            'project': {
                'path_with_namespace': self.gl_repo.full_name
            },
            'object_attributes': {
                'action': 'open',
                'id': 2,
                'iid': 0,
                'noteable_type': 'MergeRequest'
            },
            'merge_request': {
                'iid': 2
            }
        }
        m_body.return_value = 'I will find you and I will fix you.'
        m_mr_labels.return_value = {'bug', 'status/STALE'}
        response = self.simulate_gitlab_webhook_call('Note Hook', data)
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        # only the 'bug' label remains after removing 'status/STALE'
        m_mr_labels.assert_called_with({'bug'})
Esempio n. 7
0
    def _gitlab_open_merge_request(self, commit_msg, body,
                                   branch_name) -> GitLabMergeRequest:
        url = f'{IGitt.GitLab.BASE_URL}/projects/{quote_plus(self.slug)}/merge_requests'
        # Use Session as these calls are mocked based on tls_verify configuration.
        response = requests.Session().post(
            url,
            params={'private_token': self.token},
            json={
                'title': commit_msg,
                'description': body,
                'source_branch': branch_name,
                'target_branch': 'master',
                'allow_collaboration': True
            })
        try:
            response.raise_for_status()
        except Exception as exc:
            raise RuntimeError(
                f"Failed to create a pull request: {response.text}") from exc

        mr_number = response.json()['iid']
        _LOGGER.info(
            f"Newly created pull request #{mr_number} available at {response.json()['web_url']}"
        )
        return GitLabMergeRequest.from_data(response.json(),
                                            token=GitLabPrivateToken(
                                                self.token),
                                            repository=self.slug,
                                            number=mr_number)
Esempio n. 8
0
    def create_merge_request(self,
                             title: str,
                             base: str,
                             head: str,
                             body: Optional[str] = None,
                             target_project_id: Optional[int] = None,
                             target_project: Optional[str] = None):
        """
        Create a new merge request in Repository
        """
        url = self._url + '/merge_requests'
        data = {
            'title': title,
            'target_branch': base,
            'source_branch': head,
            'id': quote_plus(self.full_name),
            'target_project_id': target_project_id
        }
        json = post(self._token, url=url, data=data)

        from IGitt.GitLab.GitLabMergeRequest import GitLabMergeRequest
        return GitLabMergeRequest.from_data(json,
                                            self._token,
                                            repository=target_project,
                                            number=json['iid'])
Esempio n. 9
0
 def test_head(self):
     self.assertEqual(self.mr.head.sha,
                      'f6d2b7c66372236a090a2a74df2e47f42a54456b')
     # test for forks
     mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 26)
     self.assertEqual(mr.head.sha, '33c53a63131beb1b06c10c4d3b2d7591338dbaa0')
     # GitLab doesn't copy the commit to the base repo
     self.assertEqual(mr.head.repository.full_name, 'nkprince007/test')
Esempio n. 10
0
    def get_mr(self, mr_number: int):
        """
        Retrieves an MR.

        :param mr_number: The MR IID of the merge_request on GitLab.
        :return: A MergeRequest object.
        :raises ElementDoesntExistError: If the MR doesn't exist.
        :raises RuntimeError: If something goes wrong (network, auth...).
        """
        from IGitt.GitLab.GitLabMergeRequest import GitLabMergeRequest
        return GitLabMergeRequest(self._token, self.full_name, mr_number)
Esempio n. 11
0
    def test_assignees(self):
        # test merge request with no assignees
        mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 25)
        self.assertEqual(mr.assignees, set())

        sils = GitLabUser(self.token, 104269)
        user = GitLabUser(self.token, 707601)
        with self.assertRaises(NotImplementedError):
            self.mr.assignees = {user, sils}
        self.mr.assignees = {user}
        self.assertEqual(self.mr.assignees, {user})
        self.mr.assignees = set()
        self.assertEqual(self.mr.assignees, set())
Esempio n. 12
0
    def mrs_closed_by(self):
        """
        Returns the merge requests that close this issue.
        """
        from IGitt.GitLab.GitLabMergeRequest import GitLabMergeRequest

        url = '{url}/closed_by'.format(url=self._url)
        mrs = get(self._token, url)

        return {
            GitLabMergeRequest.from_data(mr, self._token, self._repository,
                                         mr['iid'])
            for mr in mrs if mr['state'] == MergeRequestStates.MERGED.value
        }
Esempio n. 13
0
    def merge_requests(self) -> set:
        """
        Retrieves a set of merge request objects.

        >>> from os import environ
        >>> repo = GitLabRepository(
        ...     GitLabOAuthToken(environ['GITLAB_TEST_TOKEN']),
        ...     'gitmate-test-user/test'
        ... )
        >>> len(repo.merge_requests)
        4
        """
        from IGitt.GitLab.GitLabMergeRequest import GitLabMergeRequest
        return {
            GitLabMergeRequest.from_data(res, self._token, self.full_name,
                                         res['iid'])
            for res in get(self._token, self._url + '/merge_requests')
        }
Esempio n. 14
0
 def test_mentioned_issues(self):
     mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 16)
     self.assertEqual({int(issue.number) for issue in mr.mentioned_issues},
                      {10, 11, 12, 13})
Esempio n. 15
0
class GitLabMergeRequestTest(IGittTestCase):

    def setUp(self):
        self.token = GitLabOAuthToken(os.environ.get('GITLAB_TEST_TOKEN', ''))
        self.mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 7)

    def test_base(self):
        self.assertEqual(self.mr.base.sha,
                         '7747ee49b7d322e7d82520126ca275115aa67447')

    def test_head(self):
        self.assertEqual(self.mr.head.sha,
                         'f6d2b7c66372236a090a2a74df2e47f42a54456b')
        # test for forks
        mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 26)
        self.assertEqual(mr.head.sha, '33c53a63131beb1b06c10c4d3b2d7591338dbaa0')
        # GitLab doesn't copy the commit to the base repo
        self.assertEqual(mr.head.repository.full_name, 'nkprince007/test')

    def test_base_branch_name(self):
        self.assertEqual(self.mr.base_branch_name, 'master')

    def test_head_branch_name(self):
        self.assertEqual(self.mr.head_branch_name, 'gitmate-test-user-patch-2')

    def test_commits(self):
        self.assertEqual([commit.sha for commit in self.mr.commits],
                         ['f6d2b7c66372236a090a2a74df2e47f42a54456b'])

    def test_repository(self):
        self.assertEqual(self.mr.target_repository.full_name,
                         'gitmate-test-user/test')
        self.assertEqual(self.mr.source_repository.full_name,
                         'gitmate-test-user/test')

    def test_diffstat(self):
        self.assertEqual(self.mr.diffstat, (2, 0))
        mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 39)
        self.assertEqual(mr.diffstat, (0, 0))

    def test_time(self):
        self.assertEqual(self.mr.created, datetime.datetime(
            2017, 6, 7, 12, 1, 20, 476000))
        self.assertEqual(self.mr.updated, datetime.datetime(
            2017, 9, 24, 17, 45, 50, 540000))

    def test_affected_files(self):
        self.assertEqual(self.mr.affected_files, {'README.md'})

    def test_number(self):
        self.assertEqual(self.mr.number, 7)

    def test_url(self):
        self.assertEqual(self.mr.url,
                         'https://gitlab.com/api/v4/projects/gitmate-test-user%2Ftest/merge_requests/7')

    def test_web_url(self):
        self.assertEqual(self.mr.web_url,
                         'https://gitlab.com/gitmate-test-user/test/merge_requests/7')

    def test_change_state(self):
        self.mr.close()
        self.assertEqual(self.mr.state, MergeRequestStates.CLOSED)
        self.mr.reopen()
        self.assertEqual(self.mr.state, MergeRequestStates.OPEN)

    def test_closes_issues(self):
        mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 25)
        self.assertEqual({int(issue.number) for issue in mr.closes_issues},
                         {21, 22, 23, 26, 27, 30})

    def test_mentioned_issues(self):
        mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 16)
        self.assertEqual({int(issue.number) for issue in mr.mentioned_issues},
                         {10, 11, 12, 13})

    def test_assignees(self):
        # test merge request with no assignees
        mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 25)
        self.assertEqual(mr.assignees, set())

        sils = GitLabUser(self.token, 104269)
        user = GitLabUser(self.token, 707601)
        with self.assertRaises(NotImplementedError):
            self.mr.assignees = {user, sils}
        self.mr.assignees = {user}
        self.assertEqual(self.mr.assignees, {user})
        self.mr.assignees = set()
        self.assertEqual(self.mr.assignees, set())


    def test_author(self):
        self.assertEqual(self.mr.author.username, 'nkprince007')

    def test_state(self):
        opened = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 39)
        closed = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 6)
        merged = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 69)
        self.assertEqual(merged.state, MergeRequestStates.MERGED)
        self.assertEqual(closed.state, MergeRequestStates.CLOSED)
        self.assertEqual(opened.state, MergeRequestStates.OPEN)

    def test_merge_empty(self):
        mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 74)
        mr.merge()
        self.assertEqual(mr.state, MergeRequestStates.MERGED)

    def test_merge_params(self):
        commit_msg = 'Test commit title\n\nTest commit body'
        head_sha = '2dfdc8f236fd5a4683ac52addb9d92b2920d6cfe'
        mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 75)
        mr.merge(message=commit_msg, sha=head_sha,
                 should_remove_source_branch=True,
                 _gitlab_merge_when_pipeline_succeeds=True)
        self.assertEqual(mr.state, MergeRequestStates.MERGED)
Esempio n. 16
0
 def test_merge_empty(self):
     mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 74)
     mr.merge()
     self.assertEqual(mr.state, MergeRequestStates.MERGED)
Esempio n. 17
0
 def setUp(self):
     self.token = GitLabOAuthToken(os.environ.get('GITLAB_TEST_TOKEN', ''))
     self.mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 7)
Esempio n. 18
0
 def test_diffstat(self):
     self.assertEqual(self.mr.diffstat, (2, 0))
     mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 39)
     self.assertEqual(mr.diffstat, (0, 0))
Esempio n. 19
0
 def test_closes_issues(self):
     mr = GitLabMergeRequest(self.token, 'gitmate-test-user/test', 25)
     self.assertEqual({int(issue.number) for issue in mr.closes_issues},
                      {21, 22, 23, 26, 27, 30})