Testing in Allura

Writing Tests for Allura Tools

Testing the controllers and models of an Allura tool is fairly straightforward. Generally, you should follow the example of tests in the allura/tests/functional directory for controller tests and allura.tests.model for model tests. For functional tests, the Allura platform provides a convenient “test harness” allura.controllers.test.TestController controller class which is used as the application root for the allura.tests.TestController class.

In order to test your new tool controllers, you simply need to use the self.app.get() and self.app.post() methods of your test controller. The test harness makes all the tools available in the system available under the URL /entry point name/. So to test the allura.ext.project_home tool, for instance, we need only write the following:

from allura.tests import TestController

class TestProjectHome(TestController):

    def test_home(self):
        r = self.app.get('/home/')

Whenever you use the allura.tests.TestController app property, the test harness sets up the context so that c.project is always the projects/test project and whichever tool name you request is mounted at its entry point (so the Wiki tool will be mounted at /Wiki/). c.user is always set to the test-admin user to avoid authentication issues.

The framework used to generate the WSGI environment for testing your tools is provided by the WebTest module, where you can find further documentation for the .get() and .post() methods.

Testing Allura models is also straightforward, though you will often need to setup global objects before your test. If the code under test uses globals (like g and c), but your test doesn’t require the fully-loaded wsgi app, you can do something like this:

from tg import tmpl_context as c

from alluratest.controller import setup_unit_test
from allura.lib import helpers a h
from allura import model as M

def setup_method(self, method):
    # set up globals
    setup_unit_test()

    # set c.project and c.app
    h.set_context('test', 'wiki', neighborhood='Projects'):
    c.user = M.User.query.get(username='test-admin')

Testing the tasks and events is similar to testing models. Generally, you will simply want to call your @task and @event_handler methods directly rather than setting up a full mocking infrastructure, though it is possible to use the MonQTask model in the allura model if you wish to do more functional/integration testing.