1
0
Fork 0
commitizen/tests/test_cli.py
Daniel Baumann 167a3f8553
Adding upstream version 4.6.0+dfsg.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-04-21 11:40:48 +02:00

184 lines
5.2 KiB
Python

import os
import subprocess
import sys
from functools import partial
import pytest
from pytest_mock import MockFixture
from commitizen import cli
from commitizen.exceptions import (
ConfigFileNotFound,
ExpectedExit,
InvalidCommandArgumentError,
NoCommandFoundError,
NotAGitProjectError,
)
def test_sysexit_no_argv(mocker: MockFixture, capsys):
testargs = ["cz"]
mocker.patch.object(sys, "argv", testargs)
with pytest.raises(ExpectedExit):
cli.main()
out, _ = capsys.readouterr()
assert out.startswith("usage")
def test_cz_config_file_without_correct_file_path(mocker: MockFixture, capsys):
testargs = ["cz", "--config", "./config/pyproject.toml", "example"]
mocker.patch.object(sys, "argv", testargs)
with pytest.raises(ConfigFileNotFound) as excinfo:
cli.main()
assert "Cannot found the config file" in str(excinfo.value)
def test_cz_with_arg_but_without_command(mocker: MockFixture):
testargs = ["cz", "--name", "cz_jira"]
mocker.patch.object(sys, "argv", testargs)
with pytest.raises(NoCommandFoundError) as excinfo:
cli.main()
assert "Command is required" in str(excinfo.value)
def test_name(mocker: MockFixture, capsys):
testargs = ["cz", "-n", "cz_jira", "example"]
mocker.patch.object(sys, "argv", testargs)
cli.main()
out, _ = capsys.readouterr()
assert out.startswith("JRA")
@pytest.mark.usefixtures("tmp_git_project")
def test_name_default_value(mocker: MockFixture, capsys):
testargs = ["cz", "example"]
mocker.patch.object(sys, "argv", testargs)
cli.main()
out, _ = capsys.readouterr()
assert out.startswith("fix: correct minor typos in code")
def test_ls(mocker: MockFixture, capsys):
testargs = ["cz", "-n", "cz_jira", "ls"]
mocker.patch.object(sys, "argv", testargs)
cli.main()
out, err = capsys.readouterr()
assert "cz_conventional_commits" in out
assert isinstance(out, str)
def test_arg_debug(mocker: MockFixture):
testargs = ["cz", "--debug", "info"]
mocker.patch.object(sys, "argv", testargs)
cli.main()
excepthook = sys.excepthook
# `sys.excepthook` is replaced by a `partial` in `cli.main`
# it's not a normal function
assert isinstance(excepthook, partial)
assert excepthook.keywords.get("debug") is True
def test_commitizen_excepthook(capsys):
with pytest.raises(SystemExit) as excinfo:
cli.commitizen_excepthook(NotAGitProjectError, NotAGitProjectError(), "")
assert excinfo.type is SystemExit
assert excinfo.value.code == NotAGitProjectError.exit_code
def test_commitizen_debug_excepthook(capsys):
with pytest.raises(SystemExit) as excinfo:
cli.commitizen_excepthook(
NotAGitProjectError,
NotAGitProjectError(),
"",
debug=True,
)
assert excinfo.type is SystemExit
assert excinfo.value.code == NotAGitProjectError.exit_code
assert "NotAGitProjectError" in str(excinfo.traceback[0])
@pytest.mark.skipif(
os.name == "nt",
reason="`argcomplete` does not support Git Bash on Windows.",
)
def test_argcomplete_activation():
"""
This function is testing the one-time activation of argcomplete for
commitizen only.
Equivalent to run:
$ eval "$(register-python-argcomplete pytest)"
"""
output = subprocess.run(["register-python-argcomplete", "cz"])
assert output.returncode == 0
def test_commitizen_excepthook_no_raises(capsys):
with pytest.raises(SystemExit) as excinfo:
cli.commitizen_excepthook(
NotAGitProjectError,
NotAGitProjectError(),
"",
no_raise=[NotAGitProjectError.exit_code],
)
assert excinfo.type is SystemExit
assert excinfo.value.code == 0
def test_parse_no_raise_single_integer():
input_str = "1"
result = cli.parse_no_raise(input_str)
assert result == [1]
def test_parse_no_raise_integers():
input_str = "1,2,3"
result = cli.parse_no_raise(input_str)
assert result == [1, 2, 3]
def test_parse_no_raise_error_code():
input_str = "NO_COMMITIZEN_FOUND,NO_COMMITS_FOUND,NO_PATTERN_MAP"
result = cli.parse_no_raise(input_str)
assert result == [1, 3, 5]
def test_parse_no_raise_mix_integer_error_code():
input_str = "NO_COMMITIZEN_FOUND,2,NO_COMMITS_FOUND,4"
result = cli.parse_no_raise(input_str)
assert result == [1, 2, 3, 4]
def test_parse_no_raise_mix_invalid_arg_is_skipped():
input_str = "NO_COMMITIZEN_FOUND,2,nothing,4"
result = cli.parse_no_raise(input_str)
assert result == [1, 2, 4]
def test_unknown_args_raises(mocker: MockFixture):
testargs = ["cz", "c", "-this_arg_is_not_supported"]
mocker.patch.object(sys, "argv", testargs)
with pytest.raises(InvalidCommandArgumentError) as excinfo:
cli.main()
assert "Invalid commitizen arguments were found" in str(excinfo.value)
def test_unknown_args_before_double_dash_raises(mocker: MockFixture):
testargs = ["cz", "c", "-this_arg_is_not_supported", "--"]
mocker.patch.object(sys, "argv", testargs)
with pytest.raises(InvalidCommandArgumentError) as excinfo:
cli.main()
assert "Invalid commitizen arguments were found before -- separator" in str(
excinfo.value
)