summaryrefslogtreecommitdiffstats
path: root/tests/check_docstring_first_test.py
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--tests/check_docstring_first_test.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/tests/check_docstring_first_test.py b/tests/check_docstring_first_test.py
new file mode 100644
index 0000000..8bafae8
--- /dev/null
+++ b/tests/check_docstring_first_test.py
@@ -0,0 +1,69 @@
+from __future__ import annotations
+
+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
+ (b'', 0, ''),
+ # Acceptable
+ (b'"foo"', 0, ''),
+ # Docstring after code
+ (
+ b'from __future__ import unicode_literals\n'
+ b'"foo"\n',
+ 1,
+ '{filename}:2: Module docstring appears after code '
+ '(code seen on line 1).\n',
+ ),
+ # Test double docstring
+ (
+ b'"The real docstring"\n'
+ b'from __future__ import absolute_import\n'
+ b'"fake docstring"\n',
+ 1,
+ '{filename}:3: Multiple module docstrings '
+ '(first docstring on line 1).\n',
+ ),
+ # Test multiple lines of code above
+ (
+ b'import os\n'
+ b'import sys\n'
+ b'"docstring"\n',
+ 1,
+ '{filename}:3: Module docstring appears after code '
+ '(code seen on line 1).\n',
+ ),
+ # String literals in expressions are ok.
+ (b'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='<unknown>')
+
+
+@all_tests
+def test_integration(tmpdir, capsys, contents, expected, expected_out):
+ f = tmpdir.join('test.py')
+ f.write_binary(contents)
+ assert main([str(f)]) == expected
+ assert capsys.readouterr()[0] == expected_out.format(filename=str(f))
+
+
+def test_arbitrary_encoding(tmpdir):
+ f = tmpdir.join('f.py')
+ contents = '# -*- coding: cp1252\nx = "£"'.encode('cp1252')
+ f.write_binary(contents)
+ assert main([str(f)]) == 0