
.. _`accept example`:

example: specifying and selecting acceptance tests
--------------------------------------------------------------

.. sourcecode:: python

    # ./conftest.py
    def pytest_option(parser):
        group = parser.getgroup("myproject")
        group.addoption("-A", dest="acceptance", action="store_true",
            help="run (slow) acceptance tests")

    def pytest_funcarg__accept(request):
        return AcceptFixture(request)

    class AcceptFixture:
        def __init__(self, request):
            if not request.config.option.acceptance:
                pytest.skip("specify -A to run acceptance tests")
            self.tmpdir = request.config.mktemp(request.function.__name__, numbered=True)

        def run(self, cmd):
            """ called by test code to execute an acceptance test. """
            self.tmpdir.chdir()
            return py.process.cmdexec(cmd)


and the actual test function example:

.. sourcecode:: python

    def test_some_acceptance_aspect(accept):
        accept.tmpdir.mkdir("somesub")
        result = accept.run("ls -la")
        assert "somesub" in result

If you run this test without specifying a command line option
the test will get skipped with an appropriate message. Otherwise
you can start to add convenience and test support methods
to your AcceptFixture and drive running of tools or
applications and provide ways to do assertions about
the output.

.. _`decorate a funcarg`:

example: decorating a funcarg in a test module
--------------------------------------------------------------

For larger scale setups it's sometimes useful to decorate
a funcarg just for a particular test module.  We can
extend the `accept example`_ by putting this in our test module:

.. sourcecode:: python

    def pytest_funcarg__accept(request):
        # call the next factory (living in our conftest.py)
        arg = request.getfuncargvalue("accept")
        # create a special layout in our tempdir
        arg.tmpdir.mkdir("special")
        return arg

    class TestSpecialAcceptance:
        def test_sometest(self, accept):
            assert accept.tmpdir.join("special").check()

Our module level factory will be invoked first and it can
ask its request object to call the next factory and then
decorate its result.  This mechanism allows us to stay
ignorant of how/where the function argument is provided -
in our example from a `conftest plugin`_.

sidenote: the temporary directory used here are instances of
the `py.path.local`_ class which provides many of the os.path
methods in a convenient way.

.. _`py.path.local`: ../path.html#local
.. _`conftest plugin`: customize.html#conftestplugin
