diff --git a/rhodecode/tests/vcs/test_branches.py b/rhodecode/tests/vcs/test_branches.py new file mode 100644 --- /dev/null +++ b/rhodecode/tests/vcs/test_branches.py @@ -0,0 +1,118 @@ +from __future__ import with_statement + +from rhodecode.lib import vcs +import datetime +from rhodecode.lib.vcs.utils.compat import unittest + +from base import BackendTestMixin +from conf import SCM_TESTS + +from rhodecode.lib.vcs.nodes import FileNode + + +class BranchesTestCaseMixin(BackendTestMixin): + + @classmethod + def _get_commits(cls): + commits = [ + { + 'message': 'Initial commit', + 'author': 'Joe Doe ', + 'date': datetime.datetime(2010, 1, 1, 20), + 'added': [ + FileNode('foobar', content='Foobar'), + FileNode('foobar2', content='Foobar II'), + FileNode('foo/bar/baz', content='baz here!'), + ], + }, + { + 'message': 'Changes...', + 'author': 'Jane Doe ', + 'date': datetime.datetime(2010, 1, 1, 21), + 'added': [ + FileNode('some/new.txt', content='news...'), + ], + 'changed': [ + FileNode('foobar', 'Foobar I'), + ], + 'removed': [], + }, + ] + return commits + + def test_simple(self): + tip = self.repo.get_changeset() + self.assertEqual(tip.date, datetime.datetime(2010, 1, 1, 21)) + + def test_new_branch(self): + # This check must not be removed to ensure the 'branches' LazyProperty + # gets hit *before* the new 'foobar' branch got created: + self.assertFalse('foobar' in self.repo.branches) + self.imc.add(vcs.nodes.FileNode('docs/index.txt', + content='Documentation\n')) + foobar_tip = self.imc.commit( + message=u'New branch: foobar', + author=u'joe', + branch='foobar', + ) + self.assertTrue('foobar' in self.repo.branches) + self.assertEqual(foobar_tip.branch, 'foobar') + + def test_new_head(self): + tip = self.repo.get_changeset() + self.imc.add(vcs.nodes.FileNode('docs/index.txt', + content='Documentation\n')) + foobar_tip = self.imc.commit( + message=u'New branch: foobar', + author=u'joe', + branch='foobar', + parents=[tip], + ) + self.imc.change(vcs.nodes.FileNode('docs/index.txt', + content='Documentation\nand more...\n')) + newtip = self.imc.commit( + message=u'At default branch', + author=u'joe', + branch=foobar_tip.branch, + parents=[foobar_tip], + ) + + newest_tip = self.imc.commit( + message=u'Merged with %s' % foobar_tip.raw_id, + author=u'joe', + branch=self.backend_class.DEFAULT_BRANCH_NAME, + parents=[newtip, foobar_tip], + ) + + self.assertEqual(newest_tip.branch, + self.backend_class.DEFAULT_BRANCH_NAME) + + def test_branch_with_slash_in_name(self): + self.imc.add(vcs.nodes.FileNode('extrafile', content='Some data\n')) + self.imc.commit(u'Branch with a slash!', author=u'joe', + branch='issue/123') + self.assertTrue('issue/123' in self.repo.branches) + + def test_branch_with_slash_in_name_and_similar_without(self): + self.imc.add(vcs.nodes.FileNode('extrafile', content='Some data\n')) + self.imc.commit(u'Branch with a slash!', author=u'joe', + branch='issue/123') + self.imc.add(vcs.nodes.FileNode('extrafile II', content='Some data\n')) + self.imc.commit(u'Branch without a slash...', author=u'joe', + branch='123') + self.assertIn('issue/123', self.repo.branches) + self.assertIn('123', self.repo.branches) + + +# For each backend create test case class +for alias in SCM_TESTS: + attrs = { + 'backend_alias': alias, + } + cls_name = ''.join(('%s branches test' % alias).title().split()) + bases = (BranchesTestCaseMixin, unittest.TestCase) + globals()[cls_name] = type(cls_name, bases, attrs) + + +if __name__ == '__main__': + unittest.main()