Files @ c0ff58abe049
Branch filter:

Location: kallithea/kallithea/tests/vcs/base.py

Thomas De Schampheleire
tests: vcs: remove/update old documentation

These are no longer accurate.
"""
Module providing backend independent mixin class.
"""
import os
import time
import datetime
import pytest

from kallithea.lib import vcs
from kallithea.lib.vcs.nodes import FileNode

from kallithea.tests.vcs.conf import get_new_dir


class _BackendTestMixin(object):
    """
    This is a backend independent test case class

    It is possible to set following attributes at subclass:

    - ``backend_alias``: alias of used backend (see ``vcs.BACKENDS``)
    - ``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_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
    @pytest.fixture(autouse=True,
                    scope='class')
    def _configure_backend(cls, request):
        Backend = vcs.get_backend(cls.backend_alias)
        cls.backend_class = Backend
        cls.setup_repo(Backend)

    @classmethod
    def setup_empty_repo(cls, backend):
        repo_path = get_new_dir(str(time.time()))
        repo = backend(repo_path, create=True)
        return repo

    @classmethod
    def setup_repo(cls, backend):
        cls.repo = cls.setup_empty_repo(backend)
        cls.imc = cls.repo.in_memory_changeset
        cls.default_branch = cls.repo.DEFAULT_BRANCH_NAME

        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'])

    @pytest.fixture(autouse=True)
    def _possibly_recreate_repo(self):
        if getattr(self, 'recreate_repo_per_test', False):
            self.setup_repo(self.backend_class)