How to use LocalBearTestHelper to test your bears — coala 0.11.0.rc1 documentation

# How to use LocalBearTestHelper to test your bears

coala has an awesome testing framework to write tests for bears with ease.

You can use the following to test your bears:

- `LocalBearTestHelper.check_validity`
- `LocalBearTestHelper.check_results`
- `verify_local_bears`

## Understanding through examples

Let us understand how to write tests for `TooManyLinesBear` in `some_dir`. `TooManyLinesBear` checks if a file has less than or equal to `max_number_of_lines` lines. `max_number_of_lines` by default is 10.

    from coalib.results.Result import Result
    from coalib.bears.LocalBear import LocalBear

    class TooManyLinesBear(LocalBear):

        def run(file,
                filename,
                max_number_of_lines: int=10):
            """
            Detects if a file has more than "max_number_of_lines" lines

            :param max_number_of_lines    Maximum number of lines to be
                                          allowed for a file. Default is 10.
            """

            if(len(file)>max_number_of_lines):
                yield Result(self, "Too many lines")

EXAMPLE 1 using `verify_local_bear`

    from bears.some_dir.TooManyLinesBear import TooManyLinesBear
    from coalib.testing.LocalBearTestHelper import verify_local_bear

    good_file = '1\n2\n3\n4\n'.splitlines()
    bad_file = '1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n'.splitlines()

    TooManyLinesBearTest = verify_local_bear(TooManyLinesBear,
                                             valid_files=(good_file,),
                                             invalid_files=(bad_file,))

`good_file` is a file which your bear considers as non-style-violating and a `bad_file` is one which has at least one error/warning/info. We need to write a `good_file` which has less than or equal to `max_number_of_lines` lines and a `bad_file` which has more than `max_number_of_lines` lines and feed them to `verify_local_bear` as input along with your bear (TooManyLinesBear in this case) and a few additional arguments.

Note

`good_file` and `bad_file` are sequences just like `file`. A `file` is a sequence of an input file.

EXAMPLE 2 using `LocalBearTestHelper.check_validity`

    from queue import Queue
    from bears.some_dir.TooManyLinesBear import TooManyLinesBear

    from coalib.testing.LocalBearTestHelper import LocalBearTestHelper
    from coalib.settings.Section import Section
    from coalib.settings.Setting import Setting

    class TooManyLinesBearTest(LocalBearTestHelper):

        def setUp(self):
            self.section = Section('name')
            self.section.append(Setting('max_number_of_lines', '10'))
            self.uut = TooManyLinesBear(self.section, Queue())

        def test_valid(self):
            self.check_validity(self.uut, ["import os"])

        def test_invalid(self):
            self.check_validity(self.uut, bad_file, valid=False)

Note

`bad_file` here is same as `bad_file` in the above example.

`check_validity` asserts if your bear yields any results for a particular check with a list of strings. First a Section and your Bear (in this case `TooManyLinesBear`) is `setUp`. Now your Section consists by default Settings. You can append any Setting depending on your test. Validate a check by passing your bear, lines to check as parameters (pass a few other parameters if necessary) to `check_validity`. The method `self.check_validity(self.uut, ["import os"])` asserts if your bear `self.uut` yields a result when a list of strings `["import os"]` is passed.

EXAMPLE 3 using `LocalBearTestHelper.check_results`

    from queue import Queue

    from bears.some_dir.TooManyLinesBear import TooManyLinesBear
    from coalib.testing.LocalBearTestHelper import LocalBearTestHelper
    from coalib.results.Result import Result
    from coalib.settings.Section import Section

    class TooManyLinesBearTest(LocalBearTestHelper):

        def setUp(self):
            self.uut = TooManyLinesBear(Section('name'), Queue())

        def test_run(self):
            self.check_results(
                self.uut,
                file,
                [Result.from_values('TooManyLinesBear',
                                    'Too many lines')],
                settings={'max_number_of_lines': int=20})

`check_results` asserts if your bear results match the actual results on execution on CLI. Just like the above example, we need to `setUp` a Section and your Bear with some Settings. `check_results` validates your results by giving your local bear, lines to check and expected results as input. `check_results` asserts if your bear’s results on checking the `file` match with `Results.from_values(...)`.

## A Final Note

`LocalBearTestHelper` is written to ease off testing for bears. Make sure that your tests have 100% coverage and zero redundancy. Use `check_results` as much as possible to test your bears.