websauna.tests.fixtures module

Various Websauna specific py.test fixtures.

  • Reading test.ini settings

  • Setting up and tearing down database

  • Creating a WSGI application to test

websauna.tests.fixtures.app(request, ini_settings, **settings_overrides)[source]

Initialize WSGI application from INI file given on the command line.

Parameters

settings_overrides – Override specific settings for the test case.

Return type

Router

Returns

WSGI application instance as created by Initializer.make_wsgi_app(). You can access the Initializer instance itself as app.initializer.

websauna.tests.fixtures.create_test_dbsession(request, registry, transaction_manager=<transaction._manager.ThreadTransactionManager object>)[source]

Create a test database session and setup database.

Create and drop all tables when called. Add teardown function py.test to drop all tables during teardown. Also add implicit UUID extension on the database, so we don’t need to add by hand every time.

Parameters
  • request – py.test test request

  • settings – test.ini app settings

  • transaction_manager

Return type

Session

Returns

New database session

websauna.tests.fixtures.dbsession(request, app)[source]

Create a test database and database session.

Connect to the test database specified in test.ini. Create and destroy all tables by your Initializer configuration.

Performs SQLAlchemy table initialization for all models connected to websauna.system.model.meta.Base. You must do manual opening and closing transaction inside the test, preferably using transaction.manager context manager. If transaction is left open, subsequent tests may fail.

Example:

import transaction

from trees.models import NewsletterSubscriber

def test_subscribe_newsletter(dbsession):
    '''Visitor can subscribe to a newsletter.'''

    # ... test code goes here ...

    # Check we get an entry
    with transaction.manager:
        assert dbsession.query(NewsletterSubscriber).count() == 1
        subscription = dbsession.query(NewsletterSubscriber).first()
        assert subscription.email == "[email protected]"
        assert subscription.ip == "127.0.0.1"
Return type

Session

Returns

A SQLAlchemy session instance you can use to query database.

websauna.tests.fixtures.get_app(ini_settings, extra_init=None)[source]

Construct a WSGI application from INI settings.

You can pass extra callable which is called back when Initializer is about to finish. This allows you to poke app configuration easily.

Return type

Router

websauna.tests.fixtures.http_request(request)[source]

Dummy HTTP request for testing.

For spoofing link generation, routing, etc.

websauna.tests.fixtures.ini_settings(request, test_config_path)[source]

Load INI settings for test run from py.test command line.

Example:

py.test yourpackage -s –ini=test.ini

Return type

dict

Returns

A dictionary representing the key/value pairs in an app section within the file represented by config_uri

websauna.tests.fixtures.init(request, app)[source]

Access to the default websauna.system.Initializer instance created from test.ini.

websauna.tests.fixtures.paster_config(request, test_config_path, ini_settings)[source]

A fixture to get global config and app settings for Paster-like passing.

This is mostly useful cases where your test needs to ramp up its own websauna.system.Initializer.

Example:

def test_customize_login(paster_config):
    '''Customizing login form works.'''

    class CustomLoginForm(DefaultLoginForm):

        def __init__(self, *args, **kwargs):
            login_button = Button(name="login_email", title="Login by fingerprint", css_class="btn-lg btn-block")
            kwargs['buttons'] = (login_button,)
            super().__init__(*args, **kwargs)

    class Initializer(websauna.system.Initializer):

        def configure_user_forms(self):

            from websauna.system.user import interfaces

            # This will set up all default forms as shown in websauna.system.Initializer.configure_user_forms
            super(Initializer, self).configure_user_forms()

            # Override the default login form with custom one
            unregister_success= self.config.registry.unregisterUtility(provided=interfaces.ILoginForm)
            assert unregister_success, "No default form register"
            self.config.registry.registerUtility(CustomLoginForm, interfaces.ILoginForm)


    global_config, app_settings = paster_config
    init = Initializer(global_config, app_settings)
    init.run()
    app = TestApp(init.make_wsgi_app())
    resp = app.get("/login")
Return type

tuple

websauna.tests.fixtures.pytest_addoption(parser)[source]
websauna.tests.fixtures.registry(request, app)[source]

Get access to registry.

Effectively returns app.initializer.config.registry. Registry is a Pyramid registry that is populated with values from test.ini.

Example:

import transaction
from websauna.tests.test_utils import create_user


def test_some_stuff(dbsession, registry):

    with transaction.manager:
        u = create_user(registry)
        # Do stuff with new user
Return type

Registry

websauna.tests.fixtures.scaffold_webdriver()[source]

A fixture to get Webdriver settings from external environment to be used inside scaffold tests.

TODO: This fixture does not serve purpose outside Websauna and should be moved somewhere.

websauna.tests.fixtures.test_config_path(request)[source]

A py.test fixture to get test INI configuration file path from py.test command line.

Return type

str

Returns

Absolute path to test.ini file

websauna.tests.fixtures.test_request(request, dbsession, registry)[source]

Create a dummy HTTP request object which can be used to obtain services and adapters.

This fixture gives you an instance of pyramid.testing.DummyRequest object which looks like a request as it would have arrived through HTTP interface. It has request-like properties, namely

  • registry

  • dbsession

… and thus can be used to access services, utilies and such which normally would take a request as an argument.

Example:

from websauna.system.user.utils import get_login_service


def test_order(dbsession, test_request):
    service = get_login_service(test_request)

The request.tm is bound to thread-local transaction.mananger.

Return type

InterfaceClass