Source code for tests.conftest
import py
from tests.helpers import VcsMan
import os
from anyvc import metadata
pytest_plugins = "doctest"
test_in_interpreters = 'python2', 'python3', 'jython', 'pypy'
test_on = {
'%s': None,
'remote/%s': 'popen',
}
def pytest_addoption(parser):
g = parser.getgroup('anyvc')
g.addoption("--local-remoting", action="store_true", default=False,
help='test via execnet remoting')
g.addoption("--no-direct-api", action="store_true", default=False,
help='don\'t test the direct api')
g.addoption("--vcs", action='store', default=None)
def pytest_configure(config):
if not config.getvalue('local_remoting'):
for key in list(test_on):
if '/' in key:
del test_on[key]
if config.getvalue('no_direct_api'):
for key in list(test_on):
if '/' not in key:
del test_on[key]
assert test_on, 'you shouldnt disable all test variations'
vcs = config.getvalue('vcs')
if vcs is None:
return
vcs = vcs.split('-')[0]
if vcs not in metadata.backends:
if vcs in metadata.aliases:
vcs = metadata.aliases[vcs]
config.option.vcs = vcs
else:
raise KeyError(vcs, '%r not found' % vcs)
os.environ['BZR_EMAIL'] = 'Test <test@example.com>'
funcarg_names = set('mgr repo wd backend'.split())
def pytest_generate_tests(metafunc):
if not funcarg_names.intersection(metafunc.funcargnames):
return
for name in metadata.backends:
wanted = metafunc.config.getvalue('vcs')
if wanted is not None and name!=wanted:
continue
for id, spec in test_on.items():
metafunc.addcall(id=id%name, param=(name, spec))
[docs]def pytest_funcarg__backend(request):
"""
create a cached backend instance that is used the whole session
makes instanciating backend cheap
"""
vc, spec = request.param
return request.cached_setup(
lambda: metadata.get_backend(vc, spec),
extrakey=request.param,
scope='session')
[docs]def pytest_funcarg__mgr(request):
"""
create a preconfigured :class:`tests.helplers.VcsMan` instance
pass the currently tested backend
and create a tmpdir for the vcs/test combination
auto-check for the vcs features and skip if necessary
"""
vc, spec = request.param
r = spec or 'local'
testdir = request.getfuncargvalue('tmpdir')
backend = request.getfuncargvalue('backend')
required_features = getattr(request.function, 'feature', None)
if required_features:
required_features = set(required_features.args)
difference = required_features.difference(backend.features)
print required_features
if difference:
py.test.skip('%s lacks features %r' % (vc, sorted(difference)))
return VcsMan(vc, testdir, spec, backend)
[docs]def pytest_funcarg__repo(request):
"""
create a repo below mgf called 'repo'
"""
return request.getfuncargvalue('mgr').make_repo('repo')
[docs]def pytest_funcarg__wd(request):
"""
create a workdir below mgr called 'wd'
if the feature "wd:heavy" is not supported use repo as help
"""
mgr = request.getfuncargvalue('mgr')
if 'wd:heavy' not in mgr.backend.features:
repo = request.getfuncargvalue('repo')
wd = mgr.create_wd('wd', repo)
else:
wd = mgr.create_wd('wd')
fp = request.function
if hasattr(fp, 'files'):
files = fp.files.args[0]
wd.put_files(files)
assert wd.has_files(*files)
if hasattr(fp, 'commit'):
wd.add(paths=list(files))
wd.commit(message='initial commit')
return wd
def pytest_collect_directory(path, parent):
for compiled_module in path.listdir("*.pyc"):
if not compiled_module.new(ext=".py").check():
compiled_module.remove()