view MoinMoin/ @ 4029:3d5c4ebe8f34

tests: do not use TestConfig class name because py.test thinks that is a test
author Thomas Waldmann <tw AT waldmann-edv DOT de>
date Sun, 24 Aug 2008 16:35:51 +0200
parents 5c78ac77c98f
children 8a1c8fb7c689
line wrap: on
line source

# -*- coding: iso-8859-1 -*-
MoinMoin Testing Framework

All test modules must be named test_modulename to be included in the
test suite. If you are testing a package, name the test module

Tests that need the current request, for example to create a page
instance, can refer to self.request. It is injected into all test case
classes by the framework.

Tests that require a certain configuration, like section_numbers = 1, must
use a Config class to define the required configuration within the test class.

@copyright: 2005 MoinMoin:NirSoffer,
            2007 MoinMoin:AlexanderSchremmer,
            2008 MoinMoin:ThomasWaldmann
@license: GNU GPL, see COPYING for details.

import atexit
import sys

import py

rootdir = py.magic.autopath().dirpath()
moindir = rootdir.join("..")
sys.path.insert(0, str(moindir))

from import set
from MoinMoin._tests import maketestwiki, compat, wikiconfig
sys.modules["unittest"] = compat # evil hack

coverage_modules = set()

    This code adds support for (see
    It prints a coverage report for the modules specified in all
    module globals (of the test modules) named "coverage_modules".

    import coverage

    def report_coverage():
        module_list = [sys.modules[mod] for mod in coverage_modules]

    def callback(option, opt_str, value, parser):

    py.test.config.addoptions('MoinMoin options', py.test.config.Option('-C',
        '--coverage', action='callback', callback=callback,
        help='Output information about code coverage (slow!)'))

except ImportError:
    coverage = None

def init_test_request(given_config=None, static_state=[False]):
    from MoinMoin.request import request_cli
    from MoinMoin.user import User
    from MoinMoin.formatter.text_html import Formatter as HtmlFormatter
    if not static_state[0]:
        static_state[0] = True
    request = request_cli.Request(given_config=given_config)
    request.form = request.args = request.setup_args()
    request.user = User(request)
    request.html_formatter = HtmlFormatter(request)
    request.formatter = request.html_formatter
    return request

# py.test customization starts here

class MoinTestFunction(py.test.collect.Function):
    def execute(self, target, *args):
        request = self.parent.request
        co = target.func_code
        if 'request' in co.co_varnames[:co.co_argcount]:
            target(request, *args)

class MoinClassCollector(py.test.collect.Class):
    Function = MoinTestFunction

    def setup(self):
        cls = self.obj
        if hasattr(cls, 'Config'):
            cls.request = init_test_request(given_config=cls.Config)
            cls.request = self.parent.request
        super(MoinClassCollector, self).setup()

class Module(py.test.collect.Module):
    Class = MoinClassCollector
    Function = MoinTestFunction

    def __init__(self, *args, **kwargs):
        self.request = init_test_request(given_config=wikiconfig.Config)
        super(Module, self).__init__(*args, **kwargs)

    def run(self, *args, **kwargs):
        if coverage is not None:
            coverage_modules.update(getattr(self.obj, 'coverage_modules', []))
        return super(Module, self).run(*args, **kwargs)