File: test_bump_create_commit_message.py

package info (click to toggle)
commitizen 4.9.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,672 kB
  • sloc: python: 14,530; makefile: 15
file content (160 lines) | stat: -rw-r--r-- 4,354 bytes parent folder | download
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
        """
    )