Exemple #1
0
    def test_empty(self, mock_format_age):
        stream = six.StringIO()

        reports.report('gh', [], stream, 'callback')

        self.assertEqual(stream.getvalue(), 'No open pull requests\n')
        self.assertEqual(sys.stderr.getvalue(), 'Generating report...\n')
        self.assertFalse(mock_format_age.called)
Exemple #2
0
    def test_empty(self, mock_format_age):
        stream = six.StringIO()

        reports.report('gh', [], stream, 'callback')

        self.assertEqual(stream.getvalue(), 'No open pull requests\n')
        self.assertEqual(sys.stderr.getvalue(), 'Generating report...\n')
        self.assertFalse(mock_format_age.called)
Exemple #3
0
    def test_callback(self, mock_format_age):
        prs = {
            'repo1#1': mock.Mock(**{
                'user.name': None,
                'mergeable': False,
                'created_at': 10,
                'updated_at': 90,
            }),
            'repo1#2': mock.Mock(**{
                'user.name': None,
                'mergeable': True,
                'created_at': 20,
                'updated_at': 80,
            }),
            'repo2#1': mock.Mock(**{
                'user.name': 'spam',
                'mergeable': True,
                'created_at': 30,
                'updated_at': 70,
            }),
            'user1:repo3#1': mock.Mock(**{
                'user.name': None,
                'mergeable': True,
                'created_at': 40,
                'updated_at': 60,
            }),
            'user1:repo4#1': mock.Mock(**{
                'user.name': None,
                'mergeable': False,
                'created_at': 50,
                'updated_at': 50,
            }),
            'user2:repo5#1': mock.Mock(**{
                'user.name': None,
                'mergeable': True,
                'created_at': 60,
                'updated_at': 40,
            }),
            'org1:repo6#1': mock.Mock(**{
                'user.name': 'spam',
                'mergeable': True,
                'created_at': 70,
                'updated_at': 30,
            }),
            'org1:repo7#1': mock.Mock(**{
                'user.name': 'spam',
                'mergeable': True,
                'created_at': 80,
                'updated_at': 20,
            }),
            'org2:repo8#1': mock.Mock(**{
                'user.name': 'spam',
                'mergeable': True,
                'created_at': 90,
                'updated_at': 10,
            }),
        }
        for key, pr in prs.items():
            repo, number = key.split(':')[-1].split('#')
            pr.repo.full_name = repo
            pr.number = int(number)
            pr.html_url = 'https://github/%s/pull/%s' % (repo, number)
            pr.head.label = 'me:branch'
            pr.base.label = '%s:master' % repo
            pr.user.login = '******'
        reports.targets = {
            'repo': mock.Mock(side_effect=lambda x, y, z: [
                pr for n, pr in sorted(prs.items(), key=lambda x: x[0])
                if n.startswith('%s#' % y)]),
            'user': mock.Mock(side_effect=lambda x, y, z: [
                pr for n, pr in sorted(prs.items(), key=lambda x: x[0])
                if n.startswith('%s:' % y)]),
            'organization': mock.Mock(side_effect=lambda x, y, z: [
                pr for n, pr in sorted(prs.items(), key=lambda x: x[0])
                if n.startswith('%s:' % y)]),
        }
        repos = [
            ('repo', 'repo1'),
            ('user', 'user1'),
            ('organization', 'org1'),
            ('repo', 'repo2'),
            ('user', 'user2'),
            ('organization', 'org2'),
        ]
        stream = six.StringIO()

        reports.report('gh', repos, stream, 'callback', 'other')

        reports.targets['repo'].assert_has_calls([
            mock.call('gh', 'repo1', 'callback'),
            mock.call('gh', 'repo2', 'callback'),
        ])
        self.assertEqual(reports.targets['repo'].call_count, 2)
        reports.targets['user'].assert_has_calls([
            mock.call('gh', 'user1', 'callback'),
            mock.call('gh', 'user2', 'callback'),
        ])
        self.assertEqual(reports.targets['user'].call_count, 2)
        reports.targets['organization'].assert_has_calls([
            mock.call('gh', 'org1', 'callback'),
            mock.call('gh', 'org2', 'callback'),
        ])
        self.assertEqual(reports.targets['organization'].call_count, 2)
        self.assertEqual(
            stream.getvalue(),
            'Open PRs: 9 (7 mergeable)\n'
            '    Oldest PR, from 10: repo1#1\n'
            '    Youngest PR, from 90: repo8#1\n'
            '    Least recently updated PR, at 10: repo8#1\n'
            '    Most recently updated PR, at 90: repo1#1\n'
            '\n'
            'Pull request repo1#1:\n'
            '    URL: https://github/repo1/pull/1\n'
            '    Merge me:branch -> repo1:master\n'
            '    Proposed 10 (age: 70)\n'
            '    Proposed by <unknown> (me)\n'
            '    Last updated: 90 (-10 ago)\n'
            '    Mergeable: no\n'
            '\n'
            'Pull request repo1#2:\n'
            '    URL: https://github/repo1/pull/2\n'
            '    Merge me:branch -> repo1:master\n'
            '    Proposed 20 (age: 60)\n'
            '    Proposed by <unknown> (me)\n'
            '    Last updated: 80 (0 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo3#1:\n'
            '    URL: https://github/repo3/pull/1\n'
            '    Merge me:branch -> repo3:master\n'
            '    Proposed 40 (age: 40)\n'
            '    Proposed by <unknown> (me)\n'
            '    Last updated: 60 (20 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo4#1:\n'
            '    URL: https://github/repo4/pull/1\n'
            '    Merge me:branch -> repo4:master\n'
            '    Proposed 50 (age: 30)\n'
            '    Proposed by <unknown> (me)\n'
            '    Last updated: 50 (30 ago)\n'
            '    Mergeable: no\n'
            '\n'
            'Pull request repo6#1:\n'
            '    URL: https://github/repo6/pull/1\n'
            '    Merge me:branch -> repo6:master\n'
            '    Proposed 70 (age: 10)\n'
            '    Proposed by spam (me)\n'
            '    Last updated: 30 (50 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo7#1:\n'
            '    URL: https://github/repo7/pull/1\n'
            '    Merge me:branch -> repo7:master\n'
            '    Proposed 80 (age: 0)\n'
            '    Proposed by spam (me)\n'
            '    Last updated: 20 (60 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo2#1:\n'
            '    URL: https://github/repo2/pull/1\n'
            '    Merge me:branch -> repo2:master\n'
            '    Proposed 30 (age: 50)\n'
            '    Proposed by spam (me)\n'
            '    Last updated: 70 (10 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo5#1:\n'
            '    URL: https://github/repo5/pull/1\n'
            '    Merge me:branch -> repo5:master\n'
            '    Proposed 60 (age: 20)\n'
            '    Proposed by <unknown> (me)\n'
            '    Last updated: 40 (40 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo8#1:\n'
            '    URL: https://github/repo8/pull/1\n'
            '    Merge me:branch -> repo8:master\n'
            '    Proposed 90 (age: -10)\n'
            '    Proposed by spam (me)\n'
            '    Last updated: 10 (70 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Repositories with open pull requests: 8\n'
            'Breakdown by repository:\n'
            '    Open PRs for repo1: 2 (1 mergeable)\n'
            '    Open PRs for repo2: 1 (1 mergeable)\n'
            '    Open PRs for repo3: 1 (1 mergeable)\n'
            '    Open PRs for repo4: 1 (0 mergeable)\n'
            '    Open PRs for repo5: 1 (1 mergeable)\n'
            '    Open PRs for repo6: 1 (1 mergeable)\n'
            '    Open PRs for repo7: 1 (1 mergeable)\n'
            '    Open PRs for repo8: 1 (1 mergeable)\n'
            '\n'
            'Report generated in 2 at 80\n'
        )
        self.assertEqual(sys.stderr.getvalue(),
                         'Looking up repo "repo1"...\n'
                         'Looking up user "user1"...\n'
                         'Looking up organization "org1"...\n'
                         'Looking up repo "repo2"...\n'
                         'Looking up user "user2"...\n'
                         'Looking up organization "org2"...\n'
                         'Generating report...\n'
                         'Emitting summary: Open PRs: 9 (7 mergeable)\n'
                         'Emitting pull request repo1#1\n'
                         'Emitting pull request repo1#2\n'
                         'Emitting pull request repo3#1\n'
                         'Emitting pull request repo4#1\n'
                         'Emitting pull request repo6#1\n'
                         'Emitting pull request repo7#1\n'
                         'Emitting pull request repo2#1\n'
                         'Emitting pull request repo5#1\n'
                         'Emitting pull request repo8#1\n'
                         'Emitting repositories with open pull requests: 8\n'
                         'Report generated in 2 at 80\n')
        mock_format_age.assert_has_calls([
            mock.call(80, 10, ' (age: %s)'),
            mock.call(80, 90, ' (%s ago)'),
            mock.call(80, 20, ' (age: %s)'),
            mock.call(80, 80, ' (%s ago)'),
            mock.call(80, 40, ' (age: %s)'),
            mock.call(80, 60, ' (%s ago)'),
            mock.call(80, 50, ' (age: %s)'),
            mock.call(80, 50, ' (%s ago)'),
            mock.call(80, 70, ' (age: %s)'),
            mock.call(80, 30, ' (%s ago)'),
            mock.call(80, 80, ' (age: %s)'),
            mock.call(80, 20, ' (%s ago)'),
            mock.call(80, 30, ' (age: %s)'),
            mock.call(80, 70, ' (%s ago)'),
            mock.call(80, 60, ' (age: %s)'),
            mock.call(80, 40, ' (%s ago)'),
            mock.call(80, 90, ' (age: %s)'),
            mock.call(80, 10, ' (%s ago)'),
        ])
        self.assertEqual(mock_format_age.call_count, 18)
Exemple #4
0
    def test_callback(self, mock_format_age):
        prs = {
            'repo1#1':
            mock.Mock(
                **{
                    'user.name': None,
                    'mergeable': False,
                    'created_at': 10,
                    'updated_at': 90,
                }),
            'repo1#2':
            mock.Mock(
                **{
                    'user.name': None,
                    'mergeable': True,
                    'created_at': 20,
                    'updated_at': 80,
                }),
            'repo2#1':
            mock.Mock(
                **{
                    'user.name': 'spam',
                    'mergeable': True,
                    'created_at': 30,
                    'updated_at': 70,
                }),
            'user1:repo3#1':
            mock.Mock(
                **{
                    'user.name': None,
                    'mergeable': True,
                    'created_at': 40,
                    'updated_at': 60,
                }),
            'user1:repo4#1':
            mock.Mock(
                **{
                    'user.name': None,
                    'mergeable': False,
                    'created_at': 50,
                    'updated_at': 50,
                }),
            'user2:repo5#1':
            mock.Mock(
                **{
                    'user.name': None,
                    'mergeable': True,
                    'created_at': 60,
                    'updated_at': 40,
                }),
            'org1:repo6#1':
            mock.Mock(
                **{
                    'user.name': 'spam',
                    'mergeable': True,
                    'created_at': 70,
                    'updated_at': 30,
                }),
            'org1:repo7#1':
            mock.Mock(
                **{
                    'user.name': 'spam',
                    'mergeable': True,
                    'created_at': 80,
                    'updated_at': 20,
                }),
            'org2:repo8#1':
            mock.Mock(
                **{
                    'user.name': 'spam',
                    'mergeable': True,
                    'created_at': 90,
                    'updated_at': 10,
                }),
        }
        for key, pr in prs.items():
            repo, number = key.split(':')[-1].split('#')
            pr.repo.full_name = repo
            pr.number = int(number)
            pr.html_url = 'https://github/%s/pull/%s' % (repo, number)
            pr.head.label = 'me:branch'
            pr.base.label = '%s:master' % repo
            pr.user.login = '******'
        reports.targets = {
            'repo':
            mock.Mock(side_effect=lambda x, y, z: [
                pr for n, pr in sorted(prs.items(), key=lambda x: x[0])
                if n.startswith('%s#' % y)
            ]),
            'user':
            mock.Mock(side_effect=lambda x, y, z: [
                pr for n, pr in sorted(prs.items(), key=lambda x: x[0])
                if n.startswith('%s:' % y)
            ]),
            'organization':
            mock.Mock(side_effect=lambda x, y, z: [
                pr for n, pr in sorted(prs.items(), key=lambda x: x[0])
                if n.startswith('%s:' % y)
            ]),
        }
        repos = [
            ('repo', 'repo1'),
            ('user', 'user1'),
            ('organization', 'org1'),
            ('repo', 'repo2'),
            ('user', 'user2'),
            ('organization', 'org2'),
        ]
        stream = six.StringIO()

        reports.report('gh', repos, stream, 'callback', 'other')

        reports.targets['repo'].assert_has_calls([
            mock.call('gh', 'repo1', 'callback'),
            mock.call('gh', 'repo2', 'callback'),
        ])
        self.assertEqual(reports.targets['repo'].call_count, 2)
        reports.targets['user'].assert_has_calls([
            mock.call('gh', 'user1', 'callback'),
            mock.call('gh', 'user2', 'callback'),
        ])
        self.assertEqual(reports.targets['user'].call_count, 2)
        reports.targets['organization'].assert_has_calls([
            mock.call('gh', 'org1', 'callback'),
            mock.call('gh', 'org2', 'callback'),
        ])
        self.assertEqual(reports.targets['organization'].call_count, 2)
        self.assertEqual(
            stream.getvalue(), 'Open PRs: 9 (7 mergeable)\n'
            '    Oldest PR, from 10: repo1#1\n'
            '    Youngest PR, from 90: repo8#1\n'
            '    Least recently updated PR, at 10: repo8#1\n'
            '    Most recently updated PR, at 90: repo1#1\n'
            '\n'
            'Pull request repo1#1:\n'
            '    URL: https://github/repo1/pull/1\n'
            '    Merge me:branch -> repo1:master\n'
            '    Proposed 10 (age: 70)\n'
            '    Proposed by <unknown> (me)\n'
            '    Last updated: 90 (-10 ago)\n'
            '    Mergeable: no\n'
            '\n'
            'Pull request repo1#2:\n'
            '    URL: https://github/repo1/pull/2\n'
            '    Merge me:branch -> repo1:master\n'
            '    Proposed 20 (age: 60)\n'
            '    Proposed by <unknown> (me)\n'
            '    Last updated: 80 (0 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo3#1:\n'
            '    URL: https://github/repo3/pull/1\n'
            '    Merge me:branch -> repo3:master\n'
            '    Proposed 40 (age: 40)\n'
            '    Proposed by <unknown> (me)\n'
            '    Last updated: 60 (20 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo4#1:\n'
            '    URL: https://github/repo4/pull/1\n'
            '    Merge me:branch -> repo4:master\n'
            '    Proposed 50 (age: 30)\n'
            '    Proposed by <unknown> (me)\n'
            '    Last updated: 50 (30 ago)\n'
            '    Mergeable: no\n'
            '\n'
            'Pull request repo6#1:\n'
            '    URL: https://github/repo6/pull/1\n'
            '    Merge me:branch -> repo6:master\n'
            '    Proposed 70 (age: 10)\n'
            '    Proposed by spam (me)\n'
            '    Last updated: 30 (50 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo7#1:\n'
            '    URL: https://github/repo7/pull/1\n'
            '    Merge me:branch -> repo7:master\n'
            '    Proposed 80 (age: 0)\n'
            '    Proposed by spam (me)\n'
            '    Last updated: 20 (60 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo2#1:\n'
            '    URL: https://github/repo2/pull/1\n'
            '    Merge me:branch -> repo2:master\n'
            '    Proposed 30 (age: 50)\n'
            '    Proposed by spam (me)\n'
            '    Last updated: 70 (10 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo5#1:\n'
            '    URL: https://github/repo5/pull/1\n'
            '    Merge me:branch -> repo5:master\n'
            '    Proposed 60 (age: 20)\n'
            '    Proposed by <unknown> (me)\n'
            '    Last updated: 40 (40 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Pull request repo8#1:\n'
            '    URL: https://github/repo8/pull/1\n'
            '    Merge me:branch -> repo8:master\n'
            '    Proposed 90 (age: -10)\n'
            '    Proposed by spam (me)\n'
            '    Last updated: 10 (70 ago)\n'
            '    Mergeable: yes\n'
            '\n'
            'Repositories with open pull requests: 8\n'
            'Breakdown by repository:\n'
            '    Open PRs for repo1: 2 (1 mergeable)\n'
            '    Open PRs for repo2: 1 (1 mergeable)\n'
            '    Open PRs for repo3: 1 (1 mergeable)\n'
            '    Open PRs for repo4: 1 (0 mergeable)\n'
            '    Open PRs for repo5: 1 (1 mergeable)\n'
            '    Open PRs for repo6: 1 (1 mergeable)\n'
            '    Open PRs for repo7: 1 (1 mergeable)\n'
            '    Open PRs for repo8: 1 (1 mergeable)\n'
            '\n'
            'Report generated in 2 at 80\n')
        self.assertEqual(
            sys.stderr.getvalue(), 'Looking up repo "repo1"...\n'
            'Looking up user "user1"...\n'
            'Looking up organization "org1"...\n'
            'Looking up repo "repo2"...\n'
            'Looking up user "user2"...\n'
            'Looking up organization "org2"...\n'
            'Generating report...\n'
            'Emitting summary: Open PRs: 9 (7 mergeable)\n'
            'Emitting pull request repo1#1\n'
            'Emitting pull request repo1#2\n'
            'Emitting pull request repo3#1\n'
            'Emitting pull request repo4#1\n'
            'Emitting pull request repo6#1\n'
            'Emitting pull request repo7#1\n'
            'Emitting pull request repo2#1\n'
            'Emitting pull request repo5#1\n'
            'Emitting pull request repo8#1\n'
            'Emitting repositories with open pull requests: 8\n'
            'Report generated in 2 at 80\n')
        mock_format_age.assert_has_calls([
            mock.call(80, 10, ' (age: %s)'),
            mock.call(80, 90, ' (%s ago)'),
            mock.call(80, 20, ' (age: %s)'),
            mock.call(80, 80, ' (%s ago)'),
            mock.call(80, 40, ' (age: %s)'),
            mock.call(80, 60, ' (%s ago)'),
            mock.call(80, 50, ' (age: %s)'),
            mock.call(80, 50, ' (%s ago)'),
            mock.call(80, 70, ' (age: %s)'),
            mock.call(80, 30, ' (%s ago)'),
            mock.call(80, 80, ' (age: %s)'),
            mock.call(80, 20, ' (%s ago)'),
            mock.call(80, 30, ' (age: %s)'),
            mock.call(80, 70, ' (%s ago)'),
            mock.call(80, 60, ' (age: %s)'),
            mock.call(80, 40, ' (%s ago)'),
            mock.call(80, 90, ' (age: %s)'),
            mock.call(80, 10, ' (%s ago)'),
        ])
        self.assertEqual(mock_format_age.call_count, 18)