1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
import sys
from pathlib import Path
from textwrap import dedent
import pytest
from pytest_mock import MockFixture
from commitizen import bump, cli, cmd, exceptions
conversion = [
(
("1.2.3", "1.3.0", "bump: $current_version -> $new_version [skip ci]"),
"bump: 1.2.3 -> 1.3.0 [skip ci]",
),
(("1.2.3", "1.3.0", None), "bump: version 1.2.3 → 1.3.0"),
(("1.2.3", "1.3.0", "release $new_version"), "release 1.3.0"),
]
@pytest.mark.parametrize("test_input,expected", conversion)
def test_create_tag(test_input, expected):
current_version, new_version, message_template = test_input
new_tag = bump.create_commit_message(current_version, new_version, message_template)
assert new_tag == expected
@pytest.mark.parametrize(
"retry",
(
pytest.param(
True,
marks=pytest.mark.skipif(
sys.version_info >= (3, 13),
reason="mirrors-prettier is not supported with Python 3.13 or higher",
),
),
False,
),
)
@pytest.mark.usefixtures("tmp_commitizen_project")
def test_bump_pre_commit_changelog(mocker: MockFixture, freezer, retry):
freezer.move_to("2022-04-01")
testargs = ["cz", "bump", "--changelog", "--yes"]
if retry:
testargs.append("--retry")
else:
pytest.xfail("it will fail because pre-commit will reformat CHANGELOG.md")
mocker.patch.object(sys, "argv", testargs)
# Configure prettier as a pre-commit hook
Path(".pre-commit-config.yaml").write_text(
dedent(
"""\
repos:
- repo: https://github.com/pre-commit/mirrors-prettier
rev: v3.0.3
hooks:
- id: prettier
stages: [commit]
"""
)
)
# Prettier inherits editorconfig
Path(".editorconfig").write_text(
dedent(
"""\
[*]
indent_size = 4
"""
)
)
cmd.run("git add -A")
cmd.run('git commit -m "fix: _test"')
cmd.run("pre-commit install")
cli.main()
# Pre-commit fixed last line adding extra indent and "\" char
assert Path("CHANGELOG.md").read_text() == dedent(
"""\
## 0.1.1 (2022-04-01)
### Fix
- \\_test
"""
)
@pytest.mark.parametrize("retry", (True, False))
@pytest.mark.usefixtures("tmp_commitizen_project")
def test_bump_pre_commit_changelog_fails_always(mocker: MockFixture, freezer, retry):
freezer.move_to("2022-04-01")
testargs = ["cz", "bump", "--changelog", "--yes"]
if retry:
testargs.append("--retry")
mocker.patch.object(sys, "argv", testargs)
Path(".pre-commit-config.yaml").write_text(
dedent(
"""\
repos:
- repo: local
hooks:
- id: forbid-changelog
name: changelogs are forbidden
entry: changelogs are forbidden
language: fail
files: CHANGELOG.md
"""
)
)
cmd.run("git add -A")
cmd.run('git commit -m "feat: forbid changelogs"')
cmd.run("pre-commit install")
with pytest.raises(exceptions.BumpCommitFailedError):
cli.main()
@pytest.mark.usefixtures("tmp_commitizen_project")
def test_bump_with_build_metadata(mocker: MockFixture, freezer):
def _add_entry(test_str: str, args: list):
Path(test_str).write_text("")
cmd.run("git add -A")
cmd.run(f'git commit -m "fix: test-{test_str}"')
cz_args = ["cz", "bump", "--changelog", "--yes"] + args
mocker.patch.object(sys, "argv", cz_args)
cli.main()
freezer.move_to("2024-01-01")
_add_entry("a", ["--build-metadata", "a.b.c"])
_add_entry("b", [])
_add_entry("c", ["--build-metadata", "alongmetadatastring"])
_add_entry("d", [])
# Pre-commit fixed last line adding extra indent and "\" char
assert Path("CHANGELOG.md").read_text() == dedent(
"""\
## 0.1.4 (2024-01-01)
### Fix
- test-d
## 0.1.3+alongmetadatastring (2024-01-01)
### Fix
- test-c
## 0.1.2 (2024-01-01)
### Fix
- test-b
## 0.1.1+a.b.c (2024-01-01)
### Fix
- test-a
"""
)
|