Skip to content

Commit d9a8729

Browse files
authored
fix: ensure all checks pass without overwriting previous failures (#213)
* test: test multiple checks with different results * fix: ensure all checks pass without overwriting previous failures Passing checks could overwrite a previous failing check and result in returning with an exit code of 0 when a check failed * style: match formatting to other tests * style: revert automatic formatting * fix: add missing imports * chore: ignore missing return All code paths are covered here, checked by the assert * refactor: remove duplicate mock
1 parent 91ee12b commit d9a8729

File tree

2 files changed

+74
-11
lines changed

2 files changed

+74
-11
lines changed

commit_check/main.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from commit_check import author
1111
from commit_check.util import validate_config
1212
from commit_check.error import error_handler
13-
from . import CONFIG_FILE, DEFAULT_CONFIG, PASS, __version__
13+
from . import CONFIG_FILE, DEFAULT_CONFIG, PASS, FAIL, __version__
1414

1515

1616
def get_parser() -> argparse.ArgumentParser:
@@ -99,29 +99,30 @@ def main() -> int:
9999
"""The main entrypoint of commit-check program."""
100100
parser = get_parser()
101101
args = parser.parse_args()
102-
retval = PASS
102+
check_results: list[int] = []
103103

104104
with error_handler():
105105
config = validate_config(args.config) if validate_config(
106106
args.config,
107107
) else DEFAULT_CONFIG
108108
checks = config['checks']
109109
if args.message:
110-
retval = commit.check_commit_msg(checks, args.commit_msg_file)
110+
check_results.append(commit.check_commit_msg(checks, args.commit_msg_file))
111111
if args.author_name:
112-
retval = author.check_author(checks, "author_name")
112+
check_results.append(author.check_author(checks, "author_name"))
113113
if args.author_email:
114-
retval = author.check_author(checks, "author_email")
114+
check_results.append(author.check_author(checks, "author_email"))
115115
if args.branch:
116-
retval = branch.check_branch(checks)
116+
check_results.append(branch.check_branch(checks))
117117
if args.commit_signoff:
118-
retval = commit.check_commit_signoff(checks)
118+
check_results.append(commit.check_commit_signoff(checks))
119119
if args.merge_base:
120-
retval = branch.check_merge_base(checks)
120+
check_results.append(branch.check_merge_base(checks))
121121

122122
if args.dry_run:
123-
retval = PASS
124-
return retval
123+
return PASS
124+
125+
return PASS if all(val == PASS for val in check_results) else FAIL
125126

126127

127128
if __name__ == '__main__':

tests/main_test.py

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sys
22
import pytest
33
from commit_check.main import main
4-
from commit_check import DEFAULT_CONFIG
4+
from commit_check import DEFAULT_CONFIG, PASS, FAIL
55

66
CMD = "commit-check"
77

@@ -115,3 +115,65 @@ def test_main_validate_config_ret_none(self, mocker):
115115
main()
116116
assert m_check_commit.call_count == 1
117117
assert m_check_commit.call_args[0][0] == DEFAULT_CONFIG["checks"]
118+
119+
@pytest.mark.parametrize(
120+
"argv, message_result, branch_result, author_name_result, author_email_result, commit_signoff_result, merge_base_result, final_result",
121+
[
122+
([CMD, "--message"], PASS, PASS, PASS, PASS, PASS, PASS, PASS),
123+
([CMD, "--message"], FAIL, PASS, PASS, PASS, PASS, PASS, FAIL),
124+
([CMD, "--message", "--commit-signoff"], FAIL, PASS, PASS, PASS, PASS, PASS, FAIL,),
125+
([CMD, "--message", "--commit-signoff"], PASS, PASS, PASS, PASS, FAIL, PASS, FAIL,),
126+
([CMD, "--message", "--author-name", "--author-email"], PASS, PASS, PASS, PASS, PASS, PASS, PASS,),
127+
([CMD, "--message", "--author-name", "--author-email"], FAIL, PASS, PASS, PASS, PASS, PASS, FAIL,),
128+
([CMD, "--message", "--author-name", "--author-email"], PASS, PASS, FAIL, PASS, PASS, PASS, FAIL,),
129+
([CMD, "--message", "--author-name", "--author-email"], PASS, PASS, PASS, FAIL, PASS, PASS, FAIL,),
130+
([CMD, "--message", "--author-name", "--author-email"], PASS, PASS, FAIL, FAIL, PASS, PASS, FAIL,),
131+
([CMD, "--message", "--branch", "--author-name", "--author-email", "--commit-signoff", "--merge-base", ], PASS, PASS, PASS, PASS, PASS, PASS, PASS,),
132+
([CMD, "--message", "--branch", "--author-name", "--author-email", "--commit-signoff", "--merge-base", ], FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,),
133+
([CMD, "--message", "--branch", "--author-name", "--author-email", "--commit-signoff", "--merge-base", ], FAIL, PASS, PASS, PASS, PASS, PASS, FAIL,),
134+
([CMD, "--dry-run"], FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, PASS),
135+
],
136+
)
137+
def test_main_multiple_checks(
138+
self,
139+
mocker,
140+
argv,
141+
message_result,
142+
branch_result,
143+
author_name_result,
144+
author_email_result,
145+
commit_signoff_result,
146+
merge_base_result,
147+
final_result,
148+
):
149+
mocker.patch(
150+
"commit_check.main.validate_config",
151+
return_value={},
152+
)
153+
154+
mocker.patch(
155+
"commit_check.commit.check_commit_msg", return_value=message_result
156+
)
157+
mocker.patch(
158+
"commit_check.commit.check_commit_signoff",
159+
return_value=commit_signoff_result,
160+
)
161+
162+
mocker.patch("commit_check.branch.check_branch", return_value=branch_result)
163+
mocker.patch(
164+
"commit_check.branch.check_merge_base", return_value=merge_base_result
165+
)
166+
167+
# this is messy. why isn't this a private implementation detail with a
168+
# public check_author_name and check_author email?
169+
def author_side_effect(_, check_type: str) -> int: # type: ignore[return]
170+
assert check_type in ("author_name", "author_email")
171+
if check_type == "author_name":
172+
return author_name_result
173+
elif check_type == "author_email":
174+
return author_email_result
175+
176+
mocker.patch("commit_check.author.check_author", side_effect=author_side_effect)
177+
178+
sys.argv = argv
179+
assert main() == final_result

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy