Files
zulip/tools/tests/test_zulint_custom_rules.py
Anders Kaseorg 365fe0b3d5 python: Sort imports with isort.
Fixes #2665.

Regenerated by tabbott with `lint --fix` after a rebase and change in
parameters.

Note from tabbott: In a few cases, this converts technical debt in the
form of unsorted imports into different technical debt in the form of
our largest files having very long, ugly import sequences at the
start.  I expect this change will increase pressure for us to split
those files, which isn't a bad thing.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
2020-06-11 16:45:32 -07:00

57 lines
2.8 KiB
Python

import os
from io import StringIO
from unittest import TestCase
from unittest.mock import patch
from zulint.custom_rules import RuleList
from linter_lib.custom_check import non_py_rules, python_rules
ROOT_DIR = os.path.abspath(os.path.join(__file__, '..', '..', '..'))
CHECK_MESSAGE = "Fix the corresponding rule in `tools/linter_lib/custom_check.py`."
class TestRuleList(TestCase):
def setUp(self) -> None:
self.all_rules = python_rules.rules
for rule in non_py_rules:
self.all_rules.extend(rule.rules)
def test_paths_in_rules(self) -> None:
"""Verifies that the paths mentioned in linter rules actually exist"""
for rule in self.all_rules:
for path in rule.get('exclude', {}):
abs_path = os.path.abspath(os.path.join(ROOT_DIR, path))
self.assertTrue(os.path.exists(abs_path),
f"'{path}' is neither an existing file, nor a directory. {CHECK_MESSAGE}")
for line_tuple in rule.get('exclude_line', {}):
path = line_tuple[0]
abs_path = os.path.abspath(os.path.join(ROOT_DIR, path))
self.assertTrue(os.path.isfile(abs_path),
f"The file '{path}' doesn't exist. {CHECK_MESSAGE}")
for path in rule.get('include_only', {}):
if not os.path.splitext(path)[1]:
self.assertTrue(path.endswith('/'),
f"The path '{path}' should end with '/'. {CHECK_MESSAGE}")
def test_rule_patterns(self) -> None:
"""Verifies that the search regex specified in a custom rule actually matches
the expectation and doesn't throw false positives."""
for rule in self.all_rules:
pattern = rule['pattern']
for line in rule.get('good_lines', []):
# create=True is superfluous when mocking built-ins in Python >= 3.5
with patch('builtins.open', return_value=StringIO(line + '\n\n'), create=True, autospec=True):
self.assertFalse(RuleList([], [rule]).custom_check_file('foo.bar', 'baz', ''),
f"The pattern '{pattern}' matched the line '{line}' while it shouldn't.")
for line in rule.get('bad_lines', []):
# create=True is superfluous when mocking built-ins in Python >= 3.5
with patch('builtins.open',
return_value=StringIO(line + '\n\n'), create=True, autospec=True), patch('builtins.print'):
filename = list(rule.get('include_only', {'foo.bar'}))[0]
self.assertTrue(RuleList([], [rule]).custom_check_file(filename, 'baz', ''),
f"The pattern '{pattern}' didn't match the line '{line}' while it should.")