Blame tests/__init__.py

Pierre-Yves Chibon 33b534
# -*- coding: utf-8 -*-
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
"""
Pierre-Yves Chibon 413073
 (c) 2015 - Copyright Red Hat Inc
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
 Authors:
Pierre-Yves Chibon 413073
   Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
"""
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
__requires__ = ['SQLAlchemy >= 0.7']
Pierre-Yves Chibon 413073
import pkg_resources
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
import unittest
Pierre-Yves Chibon 59d644
import shutil
Pierre-Yves Chibon 413073
import sys
Pierre-Yves Chibon c27b0d
import tempfile
Pierre-Yves Chibon 413073
import os
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
from datetime import date
Pierre-Yves Chibon 21f499
from datetime import datetime
Pierre-Yves Chibon 413073
from datetime import timedelta
Pierre-Yves Chibon 413073
from functools import wraps
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 4e9b76
import pygit2
Pierre-Yves Chibon 4e9b76
Pierre-Yves Chibon 413073
from contextlib import contextmanager
Pierre-Yves Chibon 413073
from sqlalchemy import create_engine
Pierre-Yves Chibon 413073
from sqlalchemy.orm import sessionmaker
Pierre-Yves Chibon 413073
from sqlalchemy.orm import scoped_session
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
sys.path.insert(0, os.path.join(os.path.dirname(
Pierre-Yves Chibon 413073
    os.path.abspath(__file__)), '..'))
Pierre-Yves Chibon 413073
Pierre-Yves Chibon fe5017
import pagure
Pierre-Yves Chibon fe5017
import pagure.lib
Pierre-Yves Chibon fe5017
import pagure.lib.model
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
DB_PATH = 'sqlite:///:memory:'
Pierre-Yves Chibon 413073
FAITOUT_URL = 'http://209.132.184.152/faitout/'
Pierre-Yves Chibon f62635
HERE = os.path.join(os.path.dirname(os.path.abspath(__file__)))
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
if os.environ.get('BUILD_ID'):
Pierre-Yves Chibon 413073
    try:
Pierre-Yves Chibon 413073
        import requests
Pierre-Yves Chibon 413073
        req = requests.get('%s/new' % FAITOUT_URL)
Pierre-Yves Chibon 413073
        if req.status_code == 200:
Pierre-Yves Chibon 413073
            DB_PATH = req.text
Pierre-Yves Chibon 413073
            print 'Using faitout at: %s' % DB_PATH
Pierre-Yves Chibon 413073
    except:
Pierre-Yves Chibon 413073
        pass
Pierre-Yves Chibon 413073
Pierre-Yves Chibon d14b61
# Remove the log handlers for the tests
Pierre-Yves Chibon fe5017
pagure.LOG.handlers = []
Pierre-Yves Chibon d14b61
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
@contextmanager
Pierre-Yves Chibon 413073
def user_set(APP, user):
Pierre-Yves Chibon 413073
    """ Set the provided user as fas_user in the provided application."""
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
    # Hack used to remove the before_request function set by
Pierre-Yves Chibon 413073
    # flask.ext.fas_openid.FAS which otherwise kills our effort to set a
Pierre-Yves Chibon 413073
    # flask.g.fas_user.
Pierre-Yves Chibon 413073
    from flask import appcontext_pushed, g
Pierre-Yves Chibon 413073
    APP.before_request_funcs[None] = []
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
    def handler(sender, **kwargs):
Pierre-Yves Chibon 413073
        g.fas_user = user
Pierre-Yves Chibon e120d5
        g.fas_session_id = b'123'
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
    with appcontext_pushed.connected_to(handler, APP):
Pierre-Yves Chibon 413073
        yield
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
class Modeltests(unittest.TestCase):
Pierre-Yves Chibon 413073
    """ Model tests. """
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
    def __init__(self, method_name='runTest'):
Pierre-Yves Chibon 413073
        """ Constructor. """
Pierre-Yves Chibon 413073
        unittest.TestCase.__init__(self, method_name)
Pierre-Yves Chibon 413073
        self.session = None
Pierre-Yves Chibon fe5017
        self.path = tempfile.mkdtemp(prefix='pagure-tests')
Pierre-Yves Chibon 3a4d42
        self.gitrepo = None
Pierre-Yves Chibon 619b9a
        self.gitrepos = None
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
    # pylint: disable=C0103
Pierre-Yves Chibon 413073
    def setUp(self):
Pierre-Yves Chibon 413073
        """ Set up the environnment, ran before every tests. """
Pierre-Yves Chibon aab707
        # Clean up eventual git repo left in the present folder.
Pierre-Yves Chibon aab707
        for filename in os.listdir(HERE):
Pierre-Yves Chibon ad1cac
            filename = os.path.join(HERE, filename)
Pierre-Yves Chibon aab707
            if filename.endswith('.git') and os.path.isdir(filename):
Pierre-Yves Chibon aab707
                shutil.rmtree(filename)
Pierre-Yves Chibon aab707
Pierre-Yves Chibon ed8d1c
        for folder in ['tickets', 'repos', 'forks', 'docs', 'requests']:
Pierre-Yves Chibon 58e731
            folder = os.path.join(HERE, folder)
Pierre-Yves Chibon 58e731
            if os.path.exists(folder):
Pierre-Yves Chibon 58e731
                shutil.rmtree(folder)
Pierre-Yves Chibon 58e731
            os.mkdir(folder)
Pierre-Yves Chibon 58e731
Pierre-Yves Chibon fe5017
        self.session = pagure.lib.model.create_tables(DB_PATH)
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
        # Create a couple of users
Pierre-Yves Chibon fe5017
        item = pagure.lib.model.User(
Pierre-Yves Chibon 413073
            user='pingou',
Pierre-Yves Chibon 413073
            fullname='PY C',
Pierre-Yves Chibon 413073
            password='foo',
Pierre-Yves Chibon 0e3e63
            default_email='bar@pingou.com',
Pierre-Yves Chibon 413073
        )
Pierre-Yves Chibon 413073
        self.session.add(item)
Pierre-Yves Chibon fe5017
        item = pagure.lib.model.UserEmail(
Pierre-Yves Chibon 0daa1b
            user_id=1,
Pierre-Yves Chibon 0daa1b
            email='bar@pingou.com')
Pierre-Yves Chibon 0daa1b
        self.session.add(item)
Pierre-Yves Chibon fe5017
        item = pagure.lib.model.UserEmail(
Pierre-Yves Chibon 0daa1b
            user_id=1,
Pierre-Yves Chibon 0daa1b
            email='foo@pingou.com')
Pierre-Yves Chibon 0daa1b
        self.session.add(item)
Pierre-Yves Chibon 413073
Pierre-Yves Chibon fe5017
        item = pagure.lib.model.User(
Pierre-Yves Chibon 413073
            user='foo',
Pierre-Yves Chibon 413073
            fullname='foo bar',
Pierre-Yves Chibon 413073
            password='foo',
Pierre-Yves Chibon 0e3e63
            default_email='foo@bar.com',
Pierre-Yves Chibon 413073
        )
Pierre-Yves Chibon 413073
        self.session.add(item)
Pierre-Yves Chibon fe5017
        item = pagure.lib.model.UserEmail(
Pierre-Yves Chibon 0daa1b
            user_id=2,
Pierre-Yves Chibon 0daa1b
            email='foo@bar.com')
Pierre-Yves Chibon 0daa1b
        self.session.add(item)
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
        self.session.commit()
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
    # pylint: disable=C0103
Pierre-Yves Chibon 413073
    def tearDown(self):
Pierre-Yves Chibon 413073
        """ Remove the test.db database if there is one. """
Pierre-Yves Chibon 413073
        self.session.close()
Pierre-Yves Chibon 7cbc4e
Pierre-Yves Chibon 7cbc4e
        # Clear temp directory
Pierre-Yves Chibon 7cbc4e
        if sys.exc_info() == (None, None, None):
Pierre-Yves Chibon 7cbc4e
            shutil.rmtree(self.path)
Pierre-Yves Chibon 7cbc4e
        else:
Pierre-Yves Chibon 7cbc4e
            print('FAILED TESTS AT %s' % self.path)
Pierre-Yves Chibon 7cbc4e
Pierre-Yves Chibon 7cbc4e
        # Clear DB
Pierre-Yves Chibon 413073
        if os.path.exists(DB_PATH):
Pierre-Yves Chibon 413073
            os.unlink(DB_PATH)
Pierre-Yves Chibon 413073
        if DB_PATH.startswith('postgres'):
Pierre-Yves Chibon 413073
            if 'localhost' in DB_PATH:
Pierre-Yves Chibon fe5017
                pagure.lib.model.drop_tables(DB_PATH, self.session.bind)
Pierre-Yves Chibon 413073
            else:
Pierre-Yves Chibon 413073
                db_name = DB_PATH.rsplit('/', 1)[1]
Pierre-Yves Chibon 413073
                requests.get('%s/clean/%s' % (FAITOUT_URL, db_name))
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
class FakeGroup(object):
Pierre-Yves Chibon 413073
    """ Fake object used to make the FakeUser object closer to the
Pierre-Yves Chibon 413073
    expectations.
Pierre-Yves Chibon 413073
    """
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
    def __init__(self, name):
Pierre-Yves Chibon 413073
        """ Constructor.
Pierre-Yves Chibon 413073
        :arg name: the name given to the name attribute of this object.
Pierre-Yves Chibon 413073
        """
Pierre-Yves Chibon 413073
        self.name = name
Pierre-Yves Chibon 413073
        self.group_type = 'cla'
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
# pylint: disable=R0903
Pierre-Yves Chibon 413073
class FakeUser(object):
Pierre-Yves Chibon 413073
    """ Fake user used to test the fedocallib library. """
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
    def __init__(self, groups=[], username='username', cla_done=True):
Pierre-Yves Chibon 413073
        """ Constructor.
Pierre-Yves Chibon 413073
        :arg groups: list of the groups in which this fake user is
Pierre-Yves Chibon 413073
            supposed to be.
Pierre-Yves Chibon 413073
        """
Pierre-Yves Chibon 413073
        if isinstance(groups, basestring):
Pierre-Yves Chibon 413073
            groups = [groups]
Pierre-Yves Chibon 413073
        self.groups = groups
Pierre-Yves Chibon 413073
        self.username = username
Pierre-Yves Chibon 413073
        self.name = username
Pierre-Yves Chibon c52718
        self.email = 'foo@bar.com'
Pierre-Yves Chibon 413073
        self.approved_memberships = [
Pierre-Yves Chibon 413073
            FakeGroup('packager'),
Pierre-Yves Chibon 413073
            FakeGroup('design-team')
Pierre-Yves Chibon 413073
        ]
Pierre-Yves Chibon 413073
        self.dic = {}
Pierre-Yves Chibon 413073
        self.dic['timezone'] = 'Europe/Paris'
Pierre-Yves Chibon 9fe7c1
        self.login_time = datetime.utcnow()
Pierre-Yves Chibon 413073
        self.cla_done = cla_done
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
    def __getitem__(self, key):
Pierre-Yves Chibon 413073
        return self.dic[key]
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
def create_projects(session):
Pierre-Yves Chibon 413073
    """ Create some projects in the database. """
Pierre-Yves Chibon fe5017
    item = pagure.lib.model.Project(
Pierre-Yves Chibon 413073
        user_id=1,  # pingou
Pierre-Yves Chibon 413073
        name='test',
Pierre-Yves Chibon 413073
        description='test project #1',
Pierre-Yves Chibon e2259d
        hook_token='aaabbbccc',
Pierre-Yves Chibon 413073
    )
Pierre-Yves Chibon 413073
    session.add(item)
Pierre-Yves Chibon 413073
Pierre-Yves Chibon fe5017
    item = pagure.lib.model.Project(
Pierre-Yves Chibon 413073
        user_id=1,  # pingou
Pierre-Yves Chibon 413073
        name='test2',
Pierre-Yves Chibon 413073
        description='test project #2',
Pierre-Yves Chibon e2259d
        hook_token='aaabbbddd',
Pierre-Yves Chibon 413073
    )
Pierre-Yves Chibon 413073
    session.add(item)
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
    session.commit()
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 413073
Pierre-Yves Chibon 05b648
def create_projects_git(folder, bare=False):
Pierre-Yves Chibon 4e9b76
    """ Create some projects in the database. """
Pierre-Yves Chibon 4e9b76
    repos = []
Pierre-Yves Chibon 4e9b76
    for project in ['test.git', 'test2.git']:
Pierre-Yves Chibon 4e9b76
        repo_path = os.path.join(folder, project)
Pierre-Yves Chibon 4e9b76
        repos.append(repo_path)
Pierre-Yves Chibon 63d161
        if not os.path.exists(repo_path):
Pierre-Yves Chibon 63d161
            os.makedirs(repo_path)
Pierre-Yves Chibon 05b648
        pygit2.init_repository(repo_path, bare=bare)
Pierre-Yves Chibon 4e9b76
Pierre-Yves Chibon 4e9b76
    return repos
Pierre-Yves Chibon 4e9b76
Pierre-Yves Chibon 4e9b76
Pierre-Yves Chibon f0ad75
def add_content_git_repo(folder):
Pierre-Yves Chibon f0ad75
    """ Create some content for the specified git repo. """
Pierre-Yves Chibon f0ad75
    if not os.path.exists(folder):
Pierre-Yves Chibon f0ad75
        os.makedirs(folder)
Pierre-Yves Chibon f0ad75
    repo = pygit2.init_repository(folder)
Pierre-Yves Chibon f0ad75
Pierre-Yves Chibon f0ad75
    # Create a file in that git repo
Pierre-Yves Chibon f0ad75
    with open(os.path.join(folder, 'sources'), 'w') as stream:
Pierre-Yves Chibon f0ad75
        stream.write('foo\n bar')
Pierre-Yves Chibon f0ad75
    repo.index.add('sources')
Pierre-Yves Chibon f0ad75
    repo.index.write()
Pierre-Yves Chibon f0ad75
Pierre-Yves Chibon a71c8d
    parents = []
Pierre-Yves Chibon a71c8d
    commit = None
Pierre-Yves Chibon a71c8d
    try:
Pierre-Yves Chibon a71c8d
        commit = repo.revparse_single('HEAD')
Pierre-Yves Chibon a71c8d
    except KeyError:
Pierre-Yves Chibon a71c8d
        pass
Pierre-Yves Chibon a71c8d
    if commit:
Pierre-Yves Chibon a71c8d
        parents = [commit.oid.hex]
Pierre-Yves Chibon a71c8d
Pierre-Yves Chibon f0ad75
    # Commits the files added
Pierre-Yves Chibon f0ad75
    tree = repo.index.write_tree()
Pierre-Yves Chibon f0ad75
    author = pygit2.Signature(
Pierre-Yves Chibon f0ad75
        'Alice Author', 'alice@authors.tld')
Pierre-Yves Chibon f0ad75
    committer = pygit2.Signature(
Pierre-Yves Chibon f0ad75
        'Cecil Committer', 'cecil@committers.tld')
Pierre-Yves Chibon f0ad75
    repo.create_commit(
Pierre-Yves Chibon f0ad75
        'refs/heads/master',  # the name of the reference to update
Pierre-Yves Chibon f0ad75
        author,
Pierre-Yves Chibon f0ad75
        committer,
Pierre-Yves Chibon f0ad75
        'Add sources file for testing',
Pierre-Yves Chibon f0ad75
        # binary string representing the tree object ID
Pierre-Yves Chibon f0ad75
        tree,
Pierre-Yves Chibon f0ad75
        # list of binary strings representing parents of the new commit
Pierre-Yves Chibon a71c8d
        parents,
Pierre-Yves Chibon f0ad75
    )
Pierre-Yves Chibon a71c8d
Pierre-Yves Chibon a71c8d
    parents = []
Pierre-Yves Chibon a71c8d
    commit = None
Pierre-Yves Chibon a71c8d
    try:
Pierre-Yves Chibon a71c8d
        commit = repo.revparse_single('HEAD')
Pierre-Yves Chibon a71c8d
    except KeyError:
Pierre-Yves Chibon a71c8d
        pass
Pierre-Yves Chibon a71c8d
    if commit:
Pierre-Yves Chibon a71c8d
        parents = [commit.oid.hex]
Pierre-Yves Chibon f0ad75
Pierre-Yves Chibon f0ad75
    subfolder = os.path.join('folder1', 'folder2')
Pierre-Yves Chibon f0ad75
    if not os.path.exists(os.path.join(folder, subfolder)):
Pierre-Yves Chibon f0ad75
        os.makedirs(os.path.join(folder, subfolder))
Pierre-Yves Chibon f0ad75
    # Create a file in that git repo
Pierre-Yves Chibon f0ad75
    with open(os.path.join(folder, subfolder, 'file'), 'w') as stream:
Pierre-Yves Chibon f0ad75
        stream.write('foo\n bar\nbaz')
Pierre-Yves Chibon f0ad75
    repo.index.add(os.path.join(subfolder, 'file'))
Pierre-Yves Chibon f0ad75
    repo.index.write()
Pierre-Yves Chibon f0ad75
Pierre-Yves Chibon f0ad75
    # Commits the files added
Pierre-Yves Chibon f0ad75
    tree = repo.index.write_tree()
Pierre-Yves Chibon f0ad75
    author = pygit2.Signature(
Pierre-Yves Chibon f0ad75
        'Alice Author', 'alice@authors.tld')
Pierre-Yves Chibon f0ad75
    committer = pygit2.Signature(
Pierre-Yves Chibon f0ad75
        'Cecil Committer', 'cecil@committers.tld')
Pierre-Yves Chibon f0ad75
    repo.create_commit(
Pierre-Yves Chibon f0ad75
        'refs/heads/master',  # the name of the reference to update
Pierre-Yves Chibon f0ad75
        author,
Pierre-Yves Chibon f0ad75
        committer,
Pierre-Yves Chibon f0ad75
        'Add some directory and a file for more testing',
Pierre-Yves Chibon f0ad75
        # binary string representing the tree object ID
Pierre-Yves Chibon f0ad75
        tree,
Pierre-Yves Chibon f0ad75
        # list of binary strings representing parents of the new commit
Pierre-Yves Chibon a71c8d
        parents
Pierre-Yves Chibon f0ad75
    )
Pierre-Yves Chibon f0ad75
Pierre-Yves Chibon f0ad75
Pierre-Yves Chibon 87ffe2
def add_readme_git_repo(folder):
Pierre-Yves Chibon 87ffe2
    """ Create a README file for the specified git repo. """
Pierre-Yves Chibon 87ffe2
    if not os.path.exists(folder):
Pierre-Yves Chibon 87ffe2
        os.makedirs(folder)
Pierre-Yves Chibon 87ffe2
    repo = pygit2.init_repository(folder)
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon fe5017
    content = """Pagure
Pierre-Yves Chibon 87ffe2
======
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon 87ffe2
:Author: Pierre-Yves Chibon <pingou@pingoured.fr></pingou@pingoured.fr>
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon fe5017
Pagure is a light-weight git-centered forge based on pygit2.
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon fe5017
Currently, Pagure offers a web-interface for git repositories, a ticket
Pierre-Yves Chibon fe5017
system and possibilities to create new projects, fork existing ones and
Pierre-Yves Chibon fe5017
create/merge pull-requests across or within projects.
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon fe5017
Homepage: https://github.com/pypingou/pagure
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon 87ffe2
Dev instance: http://209.132.184.222/ (/!\\ May change unexpectedly, it's a dev instance ;-))
Pierre-Yves Chibon 87ffe2
"""
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon 87ffe2
    parents = []
Pierre-Yves Chibon a71c8d
    commit = None
Pierre-Yves Chibon a71c8d
    try:
Pierre-Yves Chibon a71c8d
        commit = repo.revparse_single('HEAD')
Pierre-Yves Chibon a71c8d
    except KeyError:
Pierre-Yves Chibon a71c8d
        pass
Pierre-Yves Chibon 87ffe2
    if commit:
Pierre-Yves Chibon 87ffe2
        parents = [commit.oid.hex]
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon 87ffe2
    # Create a file in that git repo
Pierre-Yves Chibon 87ffe2
    with open(os.path.join(folder, 'README.rst'), 'w') as stream:
Pierre-Yves Chibon 87ffe2
        stream.write(content)
Pierre-Yves Chibon 87ffe2
    repo.index.add('README.rst')
Pierre-Yves Chibon 87ffe2
    repo.index.write()
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon 87ffe2
    # Commits the files added
Pierre-Yves Chibon 87ffe2
    tree = repo.index.write_tree()
Pierre-Yves Chibon 87ffe2
    author = pygit2.Signature(
Pierre-Yves Chibon 87ffe2
        'Alice Author', 'alice@authors.tld')
Pierre-Yves Chibon 87ffe2
    committer = pygit2.Signature(
Pierre-Yves Chibon 87ffe2
        'Cecil Committer', 'cecil@committers.tld')
Pierre-Yves Chibon 87ffe2
    repo.create_commit(
Pierre-Yves Chibon 87ffe2
        'refs/heads/master',  # the name of the reference to update
Pierre-Yves Chibon 87ffe2
        author,
Pierre-Yves Chibon 87ffe2
        committer,
Pierre-Yves Chibon 87ffe2
        'Add a README file',
Pierre-Yves Chibon 87ffe2
        # binary string representing the tree object ID
Pierre-Yves Chibon 87ffe2
        tree,
Pierre-Yves Chibon 87ffe2
        # list of binary strings representing parents of the new commit
Pierre-Yves Chibon 87ffe2
        parents
Pierre-Yves Chibon 87ffe2
    )
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon 87ffe2
Pierre-Yves Chibon 595b4e
def add_commit_git_repo(folder, ncommits=10):
Pierre-Yves Chibon 595b4e
    """ Create some more commits for the specified git repo. """
Pierre-Yves Chibon 595b4e
    if not os.path.exists(folder):
Pierre-Yves Chibon 595b4e
        os.makedirs(folder)
Pierre-Yves Chibon 595b4e
    repo = pygit2.init_repository(folder)
Pierre-Yves Chibon 595b4e
Pierre-Yves Chibon 595b4e
    for index in range(ncommits):
Pierre-Yves Chibon 595b4e
        # Create a file in that git repo
Pierre-Yves Chibon 595b4e
        with open(os.path.join(folder, 'sources'), 'a') as stream:
Pierre-Yves Chibon 595b4e
            stream.write('Row %s\n' % index)
Pierre-Yves Chibon 595b4e
        repo.index.add('sources')
Pierre-Yves Chibon 595b4e
        repo.index.write()
Pierre-Yves Chibon 595b4e
Pierre-Yves Chibon 595b4e
        parents = []
Pierre-Yves Chibon 595b4e
        commit = None
Pierre-Yves Chibon 595b4e
        try:
Pierre-Yves Chibon 595b4e
            commit = repo.revparse_single('HEAD')
Pierre-Yves Chibon 595b4e
        except KeyError:
Pierre-Yves Chibon 595b4e
            pass
Pierre-Yves Chibon 595b4e
        if commit:
Pierre-Yves Chibon 595b4e
            parents = [commit.oid.hex]
Pierre-Yves Chibon 595b4e
Pierre-Yves Chibon 595b4e
        # Commits the files added
Pierre-Yves Chibon 595b4e
        tree = repo.index.write_tree()
Pierre-Yves Chibon 595b4e
        author = pygit2.Signature(
Pierre-Yves Chibon 595b4e
            'Alice Author', 'alice@authors.tld')
Pierre-Yves Chibon 595b4e
        committer = pygit2.Signature(
Pierre-Yves Chibon 595b4e
            'Cecil Committer', 'cecil@committers.tld')
Pierre-Yves Chibon 595b4e
        repo.create_commit(
Pierre-Yves Chibon 595b4e
            'refs/heads/master',  # the name of the reference to update
Pierre-Yves Chibon 595b4e
            author,
Pierre-Yves Chibon 595b4e
            committer,
Pierre-Yves Chibon 595b4e
            'Add row %s to sources file' % index,
Pierre-Yves Chibon 595b4e
            # binary string representing the tree object ID
Pierre-Yves Chibon 595b4e
            tree,
Pierre-Yves Chibon 595b4e
            # list of binary strings representing parents of the new commit
Pierre-Yves Chibon 595b4e
            parents,
Pierre-Yves Chibon 595b4e
        )
Pierre-Yves Chibon 595b4e
Pierre-Yves Chibon 595b4e
Pierre-Yves Chibon 6e857b
def add_binary_git_repo(folder, filename):
Pierre-Yves Chibon 6e857b
    """ Create a fake image file for the specified git repo. """
Pierre-Yves Chibon 6e857b
    if not os.path.exists(folder):
Pierre-Yves Chibon 6e857b
        os.makedirs(folder)
Pierre-Yves Chibon 6e857b
    repo = pygit2.init_repository(folder)
Pierre-Yves Chibon 6e857b
Pierre-Yves Chibon 6e857b
    content = """<89>PNG^M
Pierre-Yves Chibon 6e857b
^Z
Pierre-Yves Chibon 6e857b
^@^@^@^MIHDR^@^@^@K^@^@^@K^H^F^@^@^@8Nzê^@^@^@^FbKGD^@ÿ^@ÿ^@ÿ ½§<93>^@^@^@  pHYs^@^@^M×^@^@^M×^AB(<9b>x^@^@^@^GtIM
Pierre-Yves Chibon 6e857b
E^GÞ
Pierre-Yves Chibon 6e857b
^N^U^F^[<88>]·<9c>^@^@  <8a>IDATxÚí<9c>ÛO^Tg^_Ç?3³»ì^B
Pierre-Yves Chibon 6e857b
<8b>®ËË<8b>X^NÕõ^EQÚ^Z­^Qc<82>^Pk5Úô¦iMÄ^[{×^K<9b>&^^Xÿ^A<8d>WM^S^SmÒ<8b>j¯Zê<8d>   6^QO^Dª¶´/Ö^M^T5^^*¼¬<9c>^Oî<8
Pierre-Yves Chibon 6e857b
1><99>÷<82>Y<8b>03;3»<83>hù&d óìÃÌw~§çûüf`^Q<8b>XÄ"^V±<88>^?:<84>^Er^N^R ª¿^K3ÎK<99>ñ3^EÈêïÿ8²ò<81> <90>¥C^T^Z<84>
Pierre-Yves Chibon 6e857b
É@^Tè^E<86>_g²²<80>^\<95>$^?<86>æ^\TI^[SI|åÉ^R<81>Õ*QNb^\èVÝõ<95>#Ë^M^T^C^Eóì-<83>ÀC þ*<90>%^B+<80>^?¿äÄñ^XèϤ¥e<9
Pierre-Yves Chibon 6e857b
a>,^O°^Vp-<90>l<9f>^@Â<99><8a>gR^FOÌ^O<84>TËZ(HZù3õ'íÉ2<81>^R Ìé+oll¤½½<9d>þþ~^TEAQ^T"<91>^HW¯^åèÑ£¸\º^F]^F¬|Ùn(^@
Pierre-Yves Chibon 6e857b
å@<9e>S^DíÚµ<8b>cÇ<8e>±iÓ¦<94>cãñ8Ç<8f>^_§©©<89>^[7nh^M^Y^Fþ|YdU8ET0^X¤©©<89>Í<9b>7[þî^W_|ÁÄÄ^DçÏ<9f>çÑ£G^Y#,<9d><
Pierre-Yves Chibon 6e857b
98>µ^RXæ^DQõõõ´¶¶RVfϳÇÇÇyøð!<95><95><95>dggsïÞ½<99><87>½j^B^Z<99>¯<98>åW^CgƱsçN<9a><9b><9b>ÉÎζ=G<þw<89>µaÃ^F^Z^
Pierre-Yves Chibon 6e857b
Z^Zf^OYag^UaDz<jÖË86nÜÈåË<97>§ã<83>`?B<9c>9sæï<85>¥¢^P^L^Fµ,Ì^O^LX©Ã$^[<96>XéTyðË/¿<90><9b><9b>kûûCCC<9c>:u<8a>ÁÁÁ</jÖË86nÜÈåË<97>
Pierre-Yves Chibon 6e857b
^WÈN^RöøñcFF^ð¾^B bVÉ°Z<^F<9c>*8¿ùæ^[<82>Á á<98>X,FKK^K'O<9e>äâÅ<8b>ȲLAA^A[·n¥¸¸^XA^Pp»ÝºV¹wï^¾üòËÙ×^_PU<8c><8c>f
Pierre-Yves Chibon 6e857b
C7Pí^DQeee<84>ÃaÜn·î<98><9e><9e>^^¶oß®<95>ݦM^^T©®®¦®®<8e>©©)Ý1ׯ_§½½}ö¡ßͬ%­¸S±SµÔ<9e>={^L<89>úé§<9f>¨¨¨Ð%
Pierre-Yves Chibon 6e857b
"""
Pierre-Yves Chibon 6e857b
Pierre-Yves Chibon 6e857b
    parents = []
Pierre-Yves Chibon 6e857b
    commit = None
Pierre-Yves Chibon 6e857b
    try:
Pierre-Yves Chibon 6e857b
        commit = repo.revparse_single('HEAD')
Pierre-Yves Chibon 6e857b
    except KeyError:
Pierre-Yves Chibon 6e857b
        pass
Pierre-Yves Chibon 6e857b
    if commit:
Pierre-Yves Chibon 6e857b
        parents = [commit.oid.hex]
Pierre-Yves Chibon 6e857b
Pierre-Yves Chibon 6e857b
    # Create a file in that git repo
Pierre-Yves Chibon 6e857b
    with open(os.path.join(folder, filename), 'w') as stream:
Pierre-Yves Chibon 6e857b
        stream.write(content)
Pierre-Yves Chibon 6e857b
    repo.index.add(filename)
Pierre-Yves Chibon 6e857b
    repo.index.write()
Pierre-Yves Chibon 6e857b
Pierre-Yves Chibon 6e857b
    # Commits the files added
Pierre-Yves Chibon 6e857b
    tree = repo.index.write_tree()
Pierre-Yves Chibon 6e857b
    author = pygit2.Signature(
Pierre-Yves Chibon 6e857b
        'Alice Author', 'alice@authors.tld')
Pierre-Yves Chibon 6e857b
    committer = pygit2.Signature(
Pierre-Yves Chibon 6e857b
        'Cecil Committer', 'cecil@committers.tld')
Pierre-Yves Chibon 6e857b
    repo.create_commit(
Pierre-Yves Chibon 6e857b
        'refs/heads/master',  # the name of the reference to update
Pierre-Yves Chibon 6e857b
        author,
Pierre-Yves Chibon 6e857b
        committer,
Pierre-Yves Chibon 6e857b
        'Add a fake image file',
Pierre-Yves Chibon 6e857b
        # binary string representing the tree object ID
Pierre-Yves Chibon 6e857b
        tree,
Pierre-Yves Chibon 6e857b
        # list of binary strings representing parents of the new commit
Pierre-Yves Chibon 6e857b
        parents
Pierre-Yves Chibon 6e857b
    )
Pierre-Yves Chibon 6e857b
Pierre-Yves Chibon 652aff
Pierre-Yves Chibon 413073
if __name__ == '__main__':
Pierre-Yves Chibon 413073
    SUITE = unittest.TestLoader().loadTestsFromTestCase(Modeltests)
Pierre-Yves Chibon 413073
    unittest.TextTestRunner(verbosity=2).run(SUITE)