# Testing

Hazwaz provides the module `hazwaz.unittest` with helpers based on `unittest` to write unit tests for command line behaviour.

The class `hazwaz.unittest.HazwazTestCase` can be used instead of `unittest.TestCase` and works just as its parent: methods whose name start with `test` are run as individual tests, and you can use all the usual unittest assert methods.

To write a test that runs the command as if from the command line, with certain parameters, you can use the method `hazwaz.unittest.HazwazTestCase.run_with_argv()` as in the following example:

    import hazwaz.unittest

    import greeter

    class testGreeter(hazwaz.unittest.HazwazTestCase):
        def test_greet_world(self):
            cmd = greeter.Greet()
            stream = self.run_with_argv(cmd, [
                "./greeter.py",
                "world",
            ])

            self.assertEqual(
                stream["stdout"].getvalue(),
                "Hello world!\n"
            )

The first parameter should be the name of the command itself, as if this was the full command line.

If the tests are in their own module, there is a convienence function `hazwaz.unittest.main()` that runs `unittest.main()`, to be used e.g.:

    if __name__ == "__main__":
        hazwaz.unittest.main()

However, if you’re writing a self-contained script you can use the command `hazwaz.unittest.TestCommand` to add a subcommand called `test` which runs all tests from a list of `unittest.TestCase`:

    class Greet(hazwaz.MainCommand):
        """
        Greet people in different ways.
        """
        commands = (
            World(),
            Individual(),
            hazwaz.unittest.TestCommand([TestGreeter]),
        )