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)