import os from pyramid.paster import get_appsettings from pyramid.scripting import prepare from pyramid.testing import DummyRequest, testConfig import pytest import webtest from html_cleanup import main def pytest_addoption(parser): parser.addoption('--ini', action='store', metavar='INI_FILE') @pytest.fixture(scope='session') def ini_file(request): # potentially grab this path from a pytest option return os.path.abspath(request.config.option.ini or 'testing.ini') @pytest.fixture(scope='session') def app_settings(ini_file): return get_appsettings(ini_file) @pytest.fixture(scope='session') def app(app_settings): return main({}, **app_settings) @pytest.fixture def testapp(app): testapp = webtest.TestApp(app, extra_environ={ 'HTTP_HOST': 'example.com', }) return testapp @pytest.fixture def app_request(app): """ A real request. This request is almost identical to a real request but it has some drawbacks in tests as it's harder to mock data and is heavier. """ with prepare(registry=app.registry) as env: request = env['request'] request.host = 'example.com' yield request @pytest.fixture def dummy_request(): """ A lightweight dummy request. This request is ultra-lightweight and should be used only when the request itself is not a large focus in the call-stack. It is much easier to mock and control side-effects using this object, however: - It does not have request extensions applied. - Threadlocals are not properly pushed. """ request = DummyRequest() request.host = 'example.com' return request @pytest.fixture def dummy_config(dummy_request): """ A dummy :class:`pyramid.config.Configurator` object. This allows for mock configuration, including configuration for ``dummy_request``, as well as pushing the appropriate threadlocals. """ with testConfig(request=dummy_request) as config: yield config