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)
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)
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)