mirror of https://github.com/mitsuhiko/flask.git
Markus Unterwaditzer
10 years ago
2 changed files with 105 additions and 86 deletions
@ -0,0 +1,105 @@ |
|||||||
|
# -*- coding: utf-8 -*- |
||||||
|
""" |
||||||
|
tests.conftest |
||||||
|
~~~~~~~~~~~~~~ |
||||||
|
|
||||||
|
:copyright: (c) 2014 by the Flask Team, see AUTHORS for more details. |
||||||
|
:license: BSD, see LICENSE for more details. |
||||||
|
""" |
||||||
|
import pkgutil |
||||||
|
import pytest |
||||||
|
import sys |
||||||
|
import textwrap |
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(params=(True, False)) |
||||||
|
def limit_loader(request, monkeypatch): |
||||||
|
"""Patch pkgutil.get_loader to give loader without get_filename or archive. |
||||||
|
|
||||||
|
This provides for tests where a system has custom loaders, e.g. Google App |
||||||
|
Engine's HardenedModulesHook, which have neither the `get_filename` method |
||||||
|
nor the `archive` attribute. |
||||||
|
|
||||||
|
This fixture will run the testcase twice, once with and once without the |
||||||
|
limitation/mock. |
||||||
|
""" |
||||||
|
if not request.param: |
||||||
|
return |
||||||
|
|
||||||
|
class LimitedLoader(object): |
||||||
|
def __init__(self, loader): |
||||||
|
self.loader = loader |
||||||
|
|
||||||
|
def __getattr__(self, name): |
||||||
|
if name in ('archive', 'get_filename'): |
||||||
|
msg = 'Mocking a loader which does not have `%s.`' % name |
||||||
|
raise AttributeError(msg) |
||||||
|
return getattr(self.loader, name) |
||||||
|
|
||||||
|
old_get_loader = pkgutil.get_loader |
||||||
|
|
||||||
|
def get_loader(*args, **kwargs): |
||||||
|
return LimitedLoader(old_get_loader(*args, **kwargs)) |
||||||
|
monkeypatch.setattr(pkgutil, 'get_loader', get_loader) |
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture |
||||||
|
def apps_tmpdir(tmpdir, monkeypatch): |
||||||
|
'''Test folder for all instance tests.''' |
||||||
|
rv = tmpdir.mkdir('test_apps') |
||||||
|
monkeypatch.syspath_prepend(str(rv)) |
||||||
|
return rv |
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture |
||||||
|
def apps_tmpdir_prefix(apps_tmpdir, monkeypatch): |
||||||
|
monkeypatch.setattr(sys, 'prefix', str(apps_tmpdir)) |
||||||
|
return apps_tmpdir |
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture |
||||||
|
def site_packages(apps_tmpdir, monkeypatch): |
||||||
|
'''Create a fake site-packages''' |
||||||
|
rv = apps_tmpdir \ |
||||||
|
.mkdir('lib')\ |
||||||
|
.mkdir('python{x[0]}.{x[1]}'.format(x=sys.version_info))\ |
||||||
|
.mkdir('site-packages') |
||||||
|
monkeypatch.syspath_prepend(str(rv)) |
||||||
|
return rv |
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture |
||||||
|
def install_egg(apps_tmpdir, monkeypatch): |
||||||
|
'''Generate egg from package name inside base and put the egg into |
||||||
|
sys.path''' |
||||||
|
def inner(name, base=apps_tmpdir): |
||||||
|
if not isinstance(name, str): |
||||||
|
raise ValueError(name) |
||||||
|
base.join(name).ensure_dir() |
||||||
|
base.join(name).join('__init__.py').ensure() |
||||||
|
|
||||||
|
egg_setup = base.join('setup.py') |
||||||
|
egg_setup.write(textwrap.dedent(""" |
||||||
|
from setuptools import setup |
||||||
|
setup(name='{0}', |
||||||
|
version='1.0', |
||||||
|
packages=['site_egg'], |
||||||
|
zip_safe=True) |
||||||
|
""".format(name))) |
||||||
|
|
||||||
|
import subprocess |
||||||
|
subprocess.check_call( |
||||||
|
[sys.executable, 'setup.py', 'bdist_egg'], |
||||||
|
cwd=str(apps_tmpdir) |
||||||
|
) |
||||||
|
egg_path, = apps_tmpdir.join('dist/').listdir() |
||||||
|
monkeypatch.syspath_prepend(str(egg_path)) |
||||||
|
return egg_path |
||||||
|
return inner |
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture |
||||||
|
def purge_module(request): |
||||||
|
def inner(name): |
||||||
|
request.addfinalizer(lambda: sys.modules.pop(name, None)) |
||||||
|
return inner |
Loading…
Reference in new issue