123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- from __future__ import unicode_literals, absolute_import
- from mock import patch, MagicMock, Mock
- from collections import namedtuple
- import os
- import unittest
- from pagure.lib import tasks
- MockUser = namedtuple('MockUser', ['fullname', 'default_email'])
- class MockCommit(object):
- def __init__(self, name, email, time='1970-01-01 00:00'):
- self.author = Mock(email=email)
- self.author.name = name
- self.commit_time = time
- @patch('pagure.lib.query.create_session', new=Mock())
- class TestCommitsAuthorStats(unittest.TestCase):
- def setUp(self):
- self.search_user_patcher = patch('pagure.lib.query.search_user')
- mock_search_user = self.search_user_patcher.start()
- mock_search_user.side_effect = lambda _, email: self.authors.get(email)
- self.pygit_patcher = patch('pygit2.Repository')
- mock_repo = self.pygit_patcher.start().return_value
- def mock_walk_impl(*args, **kwargs):
- for commit in self.commits:
- yield commit
- mock_repo.walk.side_effect = mock_walk_impl
- self.repopath = Mock()
- exists = os.path.exists
- def mock_exists_impl(path):
- if path == self.repopath:
- return True
- return exists(path)
- self.exists_patcher = patch('os.path.exists')
- mock_exists = self.exists_patcher.start()
- mock_exists.side_effect = mock_exists_impl
- def tearDown(self):
- self.search_user_patcher.stop()
- self.pygit_patcher.stop()
- self.exists_patcher.stop()
- def test_no_change(self):
- self.commits = [
- MockCommit('Alice', 'alice@example.com', '2018-01-01 00:00'),
- ]
- self.authors = {
- 'alice@example.com': MockUser('Alice', 'alice@example.com'),
- }
- num_commits, authors, num_authors, last_time = \
- tasks.commits_author_stats(self.repopath)
- self.assertEqual(num_commits, 1)
- self.assertEqual(num_authors, 1)
- self.assertEqual(last_time, '2018-01-01 00:00')
- self.assertIn(
- authors,
- [
- [(1, [(
- 'Alice', 'alice@example.com',
- 'https://seccdn.libravatar.org/avatar/'
- 'ff8d9819fc0e12bf0d24892e45987e249a28dce836a85cad60e28eaaa8c6d976'
- '?s=32&d=retro'
- )])],
- [(1, [(
- 'Alice', 'alice@example.com',
- 'https://seccdn.libravatar.org/avatar/'
- 'ff8d9819fc0e12bf0d24892e45987e249a28dce836a85cad60e28eaaa8c6d976'
- '?d=retro&s=32'
- )])]
- ]
- )
- def test_rename_user_and_merge(self):
- self.commits = [
- MockCommit('Alice', 'alice@example.com'),
- MockCommit('Bad name', 'alice@example.com', '2018-01-01 00:00'),
- ]
- self.authors = {
- 'alice@example.com': MockUser('Alice', 'alice@example.com'),
- }
- num_commits, authors, num_authors, last_time = \
- tasks.commits_author_stats(self.repopath)
- self.assertEqual(num_commits, 2)
- self.assertEqual(num_authors, 1)
- self.assertEqual(last_time, '2018-01-01 00:00')
- self.assertIn(
- authors,
- [
- [(2, [(
- 'Alice', 'alice@example.com',
- 'https://seccdn.libravatar.org/avatar/'
- 'ff8d9819fc0e12bf0d24892e45987e249a28dce836a85cad60e28eaaa8c6d976'
- '?s=32&d=retro'
- )])],
- [(2, [(
- 'Alice', 'alice@example.com',
- 'https://seccdn.libravatar.org/avatar/'
- 'ff8d9819fc0e12bf0d24892e45987e249a28dce836a85cad60e28eaaa8c6d976'
- '?d=retro&s=32'
- )])]
- ]
- )
- def test_preserve_unknown_author(self):
- self.commits = [
- MockCommit('Alice', 'alice@example.com', '2018-01-01 00:00'),
- ]
- self.authors = {}
- num_commits, authors, num_authors, last_time = \
- tasks.commits_author_stats(self.repopath)
- self.assertEqual(num_commits, 1)
- self.assertEqual(num_authors, 1)
- self.assertEqual(last_time, '2018-01-01 00:00')
- self.assertIn(
- authors,
- [
- [(1, [(
- 'Alice', 'alice@example.com',
- 'https://seccdn.libravatar.org/avatar/'
- 'ff8d9819fc0e12bf0d24892e45987e249a28dce836a85cad60e28eaaa8c6d976'
- '?s=32&d=retro'
- )])],
- [(1, [(
- 'Alice', 'alice@example.com',
- 'https://seccdn.libravatar.org/avatar/'
- 'ff8d9819fc0e12bf0d24892e45987e249a28dce836a85cad60e28eaaa8c6d976'
- '?d=retro&s=32'
- )])]
- ]
- )
- def test_handle_empty_email(self):
- self.commits = [
- # Two commits for Alice to ensure order of the result.
- MockCommit('Alice', None),
- MockCommit('Alice', None),
- MockCommit('Bob', '', '2018-01-01 00:00'),
- ]
- self.authors = {}
- num_commits, authors, num_authors, last_time = \
- tasks.commits_author_stats(self.repopath)
- self.assertEqual(num_commits, 3)
- self.assertEqual(num_authors, 2)
- self.assertEqual(last_time, '2018-01-01 00:00')
- self.assertEqual(authors, [(2, [('Alice', None, None)]),
- (1, [('Bob', '', None)])])
- class TestGitolitePostCompileOnly(object):
- @patch('pagure.lib.git_auth.get_git_auth_helper')
- def test_backend_has_post_compile_only(self, get_helper):
- helper = MagicMock()
- get_helper.return_value = helper
- helper.post_compile_only = MagicMock()
- tasks.gitolite_post_compile_only()
- helper.post_compile_only.assert_called_once()
- @patch('pagure.lib.git_auth.get_git_auth_helper')
- def test_backend_doesnt_have_post_compile_only(self, get_helper):
- helper = MagicMock()
- get_helper.return_value = helper
- helper.generate_acls = MagicMock()
- del helper.post_compile_only
- tasks.gitolite_post_compile_only()
- helper.generate_acls.assert_called_once_with(project=None)
|