Chromium Code Reviews| Index: appengine/findit/lib/gitiles/test/local_git_repository_test.py |
| diff --git a/appengine/findit/lib/gitiles/test/local_git_parsers_test.py b/appengine/findit/lib/gitiles/test/local_git_repository_test.py |
| similarity index 51% |
| copy from appengine/findit/lib/gitiles/test/local_git_parsers_test.py |
| copy to appengine/findit/lib/gitiles/test/local_git_repository_test.py |
| index 56bac5f50b39d2040ce5b81f3ce4627a201fb101..045a387c3321d45ec6490e824227a2178fdbc5b4 100644 |
| --- a/appengine/findit/lib/gitiles/test/local_git_parsers_test.py |
| +++ b/appengine/findit/lib/gitiles/test/local_git_repository_test.py |
| @@ -3,74 +3,68 @@ |
| # found in the LICENSE file. |
| from datetime import datetime |
| -from datetime import timedelta |
| +import pytz |
| +import os |
| +import subprocess |
| import textwrap |
| from testing_utils import testing |
| -from lib.gitiles import local_git_parsers |
| from lib.gitiles import blame |
| from lib.gitiles import change_log |
| +from lib.gitiles import repo_util |
| +from lib.gitiles.local_git_repository import LocalGitRepository |
| -class LocalGitParsersTest(testing.AppengineTestCase): |
| +class LocalGitRepositoryTest(testing.AppengineTestCase): |
| - def testGitBlameParser(self): |
| - output = textwrap.dedent( |
| - """ |
| - revision_hash 18 18 3 |
| - author test@google.com |
| - author-mail <test@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> |
| - author-time 1363032816 |
| - author-tz +0000 |
| - committer test@google.com |
| - committer-mail <test@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> |
| - committer-time 1363032816 |
| - committer-tz +0000 |
| - summary add (mac) test for ttcindex in SkFontStream |
| - previous fe7533eebe777cc66c7f8fa7a03f00572755c5b4 src/core/SkFont.h |
| - filename src/core/SkFont.h |
| - * blabla line 1 |
| - revision_hash 19 19 |
| - * blabla line 2 |
| - revision_hash 20 20 |
| - * blabla line 3 |
| + def setUp(self): |
| + super(LocalGitRepositoryTest, self).setUp() |
| + def _MockProcessCall(*_, **kwargs): # pylint: disable=W |
| + return |
| - revision_hash 29 29 2 |
| - * blabla line 4 |
| - """ |
| - ) |
| + self.mock(subprocess, 'call', _MockProcessCall) |
| + self.mock(subprocess, 'check_call', _MockProcessCall) |
| + self.local_repo = LocalGitRepository('https://repo/path') |
| - expected_regions = [blame.Region(18, 3, 'revision_hash', 'test@google.com', |
| - 'test@google.com', |
| - datetime(2013, 03, 11, 17, 13, 36)), |
| - blame.Region(29, 2, 'revision_hash', 'test@google.com', |
| - 'test@google.com', |
| - datetime(2013, 03, 11, 17, 13, 36))] |
| - expected_blame = blame.Blame('src/core/SkFont.h', 'rev') |
| - for expected_region in expected_regions: |
| - expected_blame.AddRegion(expected_region) |
| + def testCloneOrUpdateRepoIfNeeded(self): |
|
wrengr
2016/11/01 20:26:53
This should be broken out as three different tests
Sharu Jiang
2016/11/05 01:18:16
Done.
|
| + self.local_repo._CloneOrUpdateRepoIfNeeded() |
| + self.assertTrue(self.local_repo.repo_url in |
| + LocalGitRepository._updated_repos) |
| - blame_result = local_git_parsers.GitBlameParser()(output, |
| - 'src/core/SkFont.h', |
| - 'rev') |
| - self.assertTrue(blame_result.revision, expected_blame.revision) |
| - self.assertTrue(blame_result.path, expected_blame.path) |
| - for region, expected_region in zip(blame_result, expected_blame): |
| - self.assertTrue(region.ToDict(), expected_region.ToDict()) |
| + LocalGitRepository._updated_repos.remove(self.local_repo.repo_url) |
| + self.mock(os.path, 'exists', lambda path: True) |
| + self.local_repo._CloneOrUpdateRepoIfNeeded() |
| + self.assertTrue(self.local_repo.repo_url in |
| + LocalGitRepository._updated_repos) |
| + |
| + self.local_repo._CloneOrUpdateRepoIfNeeded() |
| + self.assertTrue(self.local_repo.repo_url in |
| + LocalGitRepository._updated_repos) |
| + |
| + def testRepoUrlSetter(self): |
| + def _MockCloneOrUpdateRepoIfNeeded(*_): |
| + if not hasattr(_MockCloneOrUpdateRepoIfNeeded, 'clone_or_update_count'): |
| + _MockCloneOrUpdateRepoIfNeeded.clone_or_update_count = 0 |
| + _MockCloneOrUpdateRepoIfNeeded.clone_or_update_count += 1 |
| + |
| + repo = LocalGitRepository() |
| + self.mock(repo, '_CloneOrUpdateRepoIfNeeded', |
| + _MockCloneOrUpdateRepoIfNeeded) |
| + |
| + repo.repo_url = 'https://repo/path' |
| + self.assertEqual(_MockCloneOrUpdateRepoIfNeeded.clone_or_update_count, 1) |
| - def testGitBlameParserEmptyOutput(self): |
| - output = '' |
| - blame_result = local_git_parsers.GitBlameParser()(output, |
| - 'src/core/SkFont.h', |
| - 'rev') |
| - self.assertEqual(len(blame_result), 0) |
| + repo.repo_url = 'https://repo/path' |
| + self.assertEqual(_MockCloneOrUpdateRepoIfNeeded.clone_or_update_count, 1) |
| - def testGetFileChangeInfo(self): |
| - self.assertIsNone(local_git_parsers.GetFileChangeInfo('change type', |
| - None, None)) |
| + repo.repo_url = 'https://repo/path2' |
| + self.assertEqual(_MockCloneOrUpdateRepoIfNeeded.clone_or_update_count, 2) |
| - def testGitChangeLogParser(self): |
| + repo.repo_url = None |
| + self.assertIsNone(repo.repo_url) |
| + |
| + def testGetChangeLog(self): |
| output = textwrap.dedent( |
| """ |
| commit revision |
| @@ -86,35 +80,28 @@ class LocalGitParsersTest(testing.AppengineTestCase): |
| committer-time 2016-07-13 20:37:06 |
| --Message start-- |
| - Revert commit messages... |
| - > Committed: https://c.com/+/c9cc182781484f9010f062859cda048afefefefe |
| - Review-Url: https://codereview.chromium.org/2391763002 |
| - Cr-Commit-Position: refs/heads/master@{#425880} |
| + blabla |
| --Message end-- |
| :100644 100644 25f95f c766f1 M src/a/b.py |
| """ |
| ) |
| - message = ('Revert commit messages...\n' |
| - '> Committed: https://c.com/+/' |
| - 'c9cc182781484f9010f062859cda048afefefefe\n' |
| - 'Review-Url: https://codereview.chromium.org/2391763002\n' |
| - 'Cr-Commit-Position: refs/heads/master@{#425880}') |
| - |
| expected_changelog = change_log.ChangeLog( |
| 'Test', 'test@google.com', datetime(2016, 7, 13, 20, 37, 6), |
| 'Test', 'test@google.com', datetime(2016, 7, 13, 20, 37, 6), |
| - 'revision', 425880, message, [change_log.FileChangeInfo( |
| + 'revision', None, 'blabla', [change_log.FileChangeInfo( |
| 'modify', 'src/a/b.py', 'src/a/b.py')], |
| - 'https://repo/+/revision', |
| - 'https://codereview.chromium.org/2391763002', |
| - 'c9cc182781484f9010f062859cda048afefefefe') |
| + 'https://repo/path/+/revision', None, None) |
| + self.mock(repo_util, 'GetCommandOutput', lambda *_: output) |
| + self.assertEqual(self.local_repo.GetChangeLog('revision').ToDict(), |
| + expected_changelog.ToDict()) |
| - changelog = local_git_parsers.GitChangeLogParser()(output, 'https://repo') |
| - self.assertTrue(expected_changelog.ToDict(), changelog.ToDict()) |
| + def testGetChangeLogNoneCommandOutput(self): |
| + self.mock(repo_util, 'GetCommandOutput', lambda *_: None) |
| + self.assertIsNone(self.local_repo.GetChangeLog('revision')) |
| - def testGitChangeLogsParser(self): |
| + def testGetChangeLogs(self): |
| output = textwrap.dedent( |
| """ |
| **Changelog start** |
| @@ -155,25 +142,6 @@ class LocalGitParsersTest(testing.AppengineTestCase): |
| --Message end-- |
| :100644 100644 7280f df186 A b/c.py |
| - |
| - **Changelog start** |
| - commit rev3 |
| - tree d22d3786e135b83183cfeba5f3d8913959f56299 |
| - parents ac7ee4ce7b8d39b22a710c58d110e0039c11cf9a |
| - |
| - author author3 |
| - author-mail author3@chromium.org |
| - author-time 2016-06-02 10:53:03 |
| - |
| - committer Commit bot |
| - committer-mail commit-bot@chromium.org |
| - committer-time 2016-06-02 10:54:14 |
| - |
| - --Message start-- |
| - Message 3 |
| - --Message end-- |
| - |
| - :100644 100644 3f2e 20a5 R078 b/c.py b/cc.py |
| """ |
| ) |
| @@ -187,7 +155,7 @@ class LocalGitParsersTest(testing.AppengineTestCase): |
| 'rev1', None, |
| 'Message 1', [change_log.FileChangeInfo( |
| 'delete', 'a/b.py', None)], |
| - 'http://repo/+/rev1', None, None), |
| + 'https://repo/path/+/rev1', None, None), |
| change_log.ChangeLog('author2', |
| 'author2@chromium.org', |
| datetime(2016, 6, 2, 10, 53, 3), |
| @@ -197,32 +165,72 @@ class LocalGitParsersTest(testing.AppengineTestCase): |
| 'rev2', None, |
| 'Message 2', [change_log.FileChangeInfo( |
| 'add', None, 'b/c.py')], |
| - 'http://repo/+/rev2', None, None), |
| - change_log.ChangeLog('author3', |
| - 'author3@chromium.org', |
| - datetime(2016, 6, 2, 10, 53, 3), |
| - 'Commit bot', |
| - 'commit-bot@chromium.org', |
| - datetime(2016, 6, 2, 10, 54, 14), |
| - 'rev3', None, |
| - 'Message 3', [change_log.FileChangeInfo( |
| - 'rename', 'b/c.py', 'b/cc.py')], |
| - 'http://repo/+/rev3', None, None), |
| + 'https://repo/path/+/rev2', None, None), |
| ] |
| - changelogs = local_git_parsers.GitChangeLogsParser()(output, 'http://repo') |
| + self.mock(repo_util, 'GetCommandOutput', lambda *_: output) |
| + changelogs = self.local_repo.GetChangeLogs('rev0', 'rev2') |
| for changelog, expected_changelog in zip(changelogs, expected_changelogs): |
| self.assertEqual(changelog.ToDict(), expected_changelog.ToDict()) |
| - def testGitChangeLogsParserWithEmptyChangelog(self): |
| - output = '**Changelog start**\nblablabla' |
| - self.assertEqual(local_git_parsers.GitChangeLogsParser()(output, |
| - 'http://repo'), []) |
| + def testGetChangeLogsNoneCommandOutput(self): |
| + self.mock(repo_util, 'GetCommandOutput', lambda *_: None) |
| + self.assertIsNone(self.local_repo.GetChangeLogs('rev0', 'rev2')) |
| + |
| + def testGetChangeDiff(self): |
| + self.mock(repo_util, 'GetCommandOutput', lambda *_: 'diff') |
| + self.assertEqual(self.local_repo.GetChangeDiff('rev'), 'diff') |
| + self.assertEqual(self.local_repo.GetChangeDiff('rev', 'file_path'), 'diff') |
| + |
| + def testGetChangeDiffNoneCommandOutput(self): |
| + self.mock(repo_util, 'GetCommandOutput', lambda *_: None) |
| + self.assertIsNone(self.local_repo.GetChangeDiff('rev')) |
| + |
| + def testGetBlame(self): |
| + output = textwrap.dedent( |
| + """ |
| + revision_hash 18 18 3 |
| + author test@google.com |
| + author-mail <test@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> |
| + author-time 2013-03-11 17:13:36 |
| + committer test@google.com |
| + committer-mail <test@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> |
| + committer-time 2013-03-11 17:13:36 |
| + summary add (mac) test for ttcindex in SkFontStream |
| + previous fe7533eebe777cc66c7f8fa7a03f00572755c5b4 src/core/SkFont.h |
| + filename src/core/SkFont.h |
| + * blabla line 1 |
| + revision_hash 19 19 |
| + * blabla line 2 |
| + revision_hash 20 20 |
| + * blabla line 3 |
| + """ |
| + ) |
| + self.mock(repo_util, 'GetCommandOutput', lambda *_: output) |
| + expected_regions = [blame.Region(18, 3, 'revision_hash', 'test@google.com', |
| + 'test@google.com', |
| + datetime(2013, 03, 11, 17, 13, 36))] |
| + expected_blame = blame.Blame('src/core/SkFont.h', 'rev') |
| + for expected_region in expected_regions: |
| + expected_blame.AddRegion(expected_region) |
| + |
| + blame_result = self.local_repo.GetBlame('src/core/SkFont.h', 'rev') |
| + self.assertTrue(blame_result.revision, expected_blame.revision) |
| + self.assertTrue(blame_result.path, expected_blame.path) |
| + for region, expected_region in zip(blame_result, expected_blame): |
| + self.assertTrue(region.ToDict(), expected_region.ToDict()) |
|
wrengr
2016/11/01 20:26:53
Why compare the results of ToDict rather than comp
Sharu Jiang
2016/11/05 01:18:15
Added a TODO.
|
| + |
| + def testGetBlameNoneCommandOutput(self): |
| + self.mock(repo_util, 'GetCommandOutput', lambda *_: None) |
| + self.assertIsNone(self.local_repo.GetBlame('src/core/SkFont.h', 'rev')) |
| - def testGitDiffParser(self): |
| - output = 'output' |
| - self.assertEqual(output, local_git_parsers.GitDiffParser()(output)) |
| + def testGetSource(self): |
| + self.mock(repo_util, 'GetCommandOutput', lambda *_: 'source') |
| + self.assertIsNone(self.local_repo.GetSource('file_path', 'rev')) |
| + self.mock(os.path, 'isfile', lambda path: True) |
| + self.assertEqual(self.local_repo.GetSource('file_path', 'rev'), 'source') |
| - def testGitSourceParser(self): |
| - output = 'output' |
| - self.assertEqual(output, local_git_parsers.GitSourceParser()(output)) |
| + def testGetSourceNoneCommandOutput(self): |
| + self.mock(repo_util, 'GetCommandOutput', lambda *_: None) |
| + self.mock(os.path, 'isfile', lambda path: True) |
| + self.assertIsNone(self.local_repo.GetSource('file_path', 'rev')) |