from __future__ import absolute_import from __future__ import unicode_literals import pytest from pre_commit_hooks.check_docstring_first import check_docstring_first from pre_commit_hooks.check_docstring_first import main # Contents, expected, expected_output TESTS = ( # trivial ('', 0, ''), # Acceptable ('"foo"', 0, ''), # Docstring after code ( 'from __future__ import unicode_literals\n' '"foo"\n', 1, '{filename}:2 Module docstring appears after code ' '(code seen on line 1).\n' ), # Test double docstring ( '"The real docstring"\n' 'from __future__ import absolute_import\n' '"fake docstring"\n', 1, '{filename}:3 Multiple module docstrings ' '(first docstring on line 1).\n' ), # Test multiple lines of code above ( 'import os\n' 'import sys\n' '"docstring"\n', 1, '{filename}:3 Module docstring appears after code ' '(code seen on line 1).\n', ), # String literals in expressions are ok. ('x = "foo"\n', 0, ''), ) all_tests = pytest.mark.parametrize( ('contents', 'expected', 'expected_out'), TESTS, ) @all_tests def test_unit(capsys, contents, expected, expected_out): assert check_docstring_first(contents) == expected assert capsys.readouterr()[0] == expected_out.format(filename='') @all_tests def test_integration(tmpdir, capsys, contents, expected, expected_out): f = tmpdir.join('test.py') f.write(contents) assert main([f.strpath]) == expected assert capsys.readouterr()[0] == expected_out.format(filename=f.strpath)