snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
68
tools/tests/test_zulint_custom_rules.py
Normal file
68
tools/tests/test_zulint_custom_rules.py
Normal file
@@ -0,0 +1,68 @@
|
||||
import os
|
||||
from io import StringIO
|
||||
from unittest import TestCase
|
||||
from unittest.mock import patch
|
||||
|
||||
from typing_extensions import override
|
||||
from zulint.custom_rules import RuleList
|
||||
|
||||
from tools.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):
|
||||
@override
|
||||
def setUp(self) -> None:
|
||||
all_rules = list(python_rules.rules)
|
||||
for rule in non_py_rules:
|
||||
all_rules.extend(rule.rules)
|
||||
self.all_rules = all_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", []):
|
||||
with patch("builtins.open", return_value=StringIO(line + "\n\n"), 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", []):
|
||||
for filename in rule.get("include_only", {"foo.bar"}):
|
||||
with (
|
||||
patch("builtins.open", return_value=StringIO(line + "\n\n"), autospec=True),
|
||||
patch("builtins.print"),
|
||||
):
|
||||
self.assertTrue(
|
||||
RuleList([], [rule]).custom_check_file(filename, "baz", ""),
|
||||
f"The pattern '{pattern}' didn't match the line '{line}' while it should.",
|
||||
)
|
||||
Reference in New Issue
Block a user