Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions tests/test_git_commit_guard.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
_report_text,
_resolve_max_subject_length,
_resolve_min_description_length,
_resolve_no_trailing_chars,
_resolve_require_lowercase,
_resolve_required_trailers,
_resolve_types,
_strip_comments,
Expand Down Expand Up @@ -454,6 +456,19 @@ def test_empty_desc_passes(self):
check_imperative("", r)
assert r.ok

def test_pos_fallback_unknown_word_fails(self):
r = Result()
with (
patch("git_commit_guard.wordnet.morphy", return_value=None),
patch(
"git_commit_guard.nltk.pos_tag",
return_value=[("to", "TO"), ("xyzzy", "NN")],
),
):
check_imperative("xyzzy something", r)
assert not r.ok
assert "POS=NN" in r.errors[0][2]


class TestDownloadIfMissing:
def test_skips_download_when_present(self):
Expand Down Expand Up @@ -617,6 +632,38 @@ def test_cli_overrides_config(self):
assert result == 10


class TestResolveRequireLowercase:
def test_cli_flag_overrides_default(self):
assert (
_resolve_require_lowercase(Namespace(require_lowercase=False), {}) is False
)

def test_config_overrides_default(self):
result = _resolve_require_lowercase(
Namespace(require_lowercase=None), {"require-lowercase": False}
)
assert result is False

def test_default_is_true(self):
assert _resolve_require_lowercase(Namespace(require_lowercase=None), {}) is True


class TestResolveNoTrailingChars:
def test_cli_flag_overrides_default(self):
result = _resolve_no_trailing_chars(Namespace(no_trailing_chars=".,!"), {})
assert result == frozenset({".", "!"})

def test_config_overrides_default(self):
result = _resolve_no_trailing_chars(
Namespace(no_trailing_chars=None), {"no-trailing-chars": [".", "!"]}
)
assert result == frozenset({".", "!"})

def test_default_is_period(self):
result = _resolve_no_trailing_chars(Namespace(no_trailing_chars=None), {})
assert result == frozenset(".")


class TestGitTimeout:
def test_default(self, monkeypatch):
monkeypatch.delenv("COMMIT_GUARD_GIT_TIMEOUT", raising=False)
Expand Down Expand Up @@ -1458,6 +1505,27 @@ def test_range_emits_one_line_per_commit(self, capsys):
assert data["sha"] == rev
assert data["ok"] is True

def test_range_failing_commit_returns_nonzero(self, capsys):
with (
patch(
"sys.argv",
[
"cg",
"--range",
"HEAD~1..HEAD",
"--disable",
"signature,imperative",
"--output",
"jsonl",
],
),
patch("git_commit_guard._get_range_revs", return_value=["aaa"]),
patch("git_commit_guard._get_message", return_value="bad message"),
):
assert main() == 1
data = json.loads(capsys.readouterr().out)
assert data["ok"] is False


class TestOutputFile:
def test_single_commit_writes_jsonl_to_file(self, tmp_path, capsys):
Expand Down
Loading