Mercurial > kallithea
diff rhodecode/tests/vcs/base.py @ 2451:402a96fcfa22 beta
Added vcs testsuite for better integration tests + added fetching
of two new repos into test env for rhodecode
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Wed, 13 Jun 2012 23:27:33 +0200 |
parents | |
children | d2a528b60e50 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rhodecode/tests/vcs/base.py Wed Jun 13 23:27:33 2012 +0200 @@ -0,0 +1,111 @@ +""" +Module providing backend independent mixin class. It requires that +InMemoryChangeset class is working properly at backend class. +""" +import os +from rhodecode.lib import vcs +import time +import shutil +import datetime +from rhodecode.lib.vcs.utils.compat import unittest + +from conf import SCM_TESTS, get_new_dir + +from rhodecode.lib.vcs.nodes import FileNode + + +class BackendTestMixin(object): + """ + This is a backend independent test case class which should be created + with ``type`` method. + + It is required to set following attributes at subclass: + + - ``backend_alias``: alias of used backend (see ``vcs.BACKENDS``) + - ``repo_path``: path to the repository which would be created for set of + tests + - ``recreate_repo_per_test``: If set to ``False``, repo would NOT be created + before every single test. Defaults to ``True``. + """ + recreate_repo_per_test = True + + @classmethod + def get_backend(cls): + return vcs.get_backend(cls.backend_alias) + + @classmethod + def _get_commits(cls): + commits = [ + { + 'message': u'Initial commit', + 'author': u'Joe Doe <joe.doe@example.com>', + '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': u'Changes...', + 'author': u'Jane Doe <jane.doe@example.com>', + 'date': datetime.datetime(2010, 1, 1, 21), + 'added': [ + FileNode('some/new.txt', content='news...'), + ], + 'changed': [ + FileNode('foobar', 'Foobar I'), + ], + 'removed': [], + }, + ] + return commits + + @classmethod + def setUpClass(cls): + Backend = cls.get_backend() + cls.backend_class = Backend + cls.repo_path = get_new_dir(str(time.time())) + cls.repo = Backend(cls.repo_path, create=True) + cls.imc = cls.repo.in_memory_changeset + + for commit in cls._get_commits(): + for node in commit.get('added', []): + cls.imc.add(FileNode(node.path, content=node.content)) + for node in commit.get('changed', []): + cls.imc.change(FileNode(node.path, content=node.content)) + for node in commit.get('removed', []): + cls.imc.remove(FileNode(node.path)) + + cls.tip = cls.imc.commit(message=unicode(commit['message']), + author=unicode(commit['author']), + date=commit['date']) + + @classmethod + def tearDownClass(cls): + if not getattr(cls, 'recreate_repo_per_test', False) and \ + 'VCS_REMOVE_TEST_DIRS' in os.environ: + shutil.rmtree(cls.repo_path) + + def setUp(self): + if getattr(self, 'recreate_repo_per_test', False): + self.__class__.setUpClass() + + def tearDown(self): + if getattr(self, 'recreate_repo_per_test', False) and \ + 'VCS_REMOVE_TEST_DIRS' in os.environ: + shutil.rmtree(self.repo_path) + + +# For each backend create test case class +for alias in SCM_TESTS: + attrs = { + 'backend_alias': alias, + } + cls_name = ''.join(('%s base backend test' % alias).title().split()) + bases = (BackendTestMixin, unittest.TestCase) + globals()[cls_name] = type(cls_name, bases, attrs) + + +if __name__ == '__main__': + unittest.main()