1
+ from types import LambdaType
2
+
1
3
import pytest
4
+ from pytest_mock import MockFixture
2
5
6
+ from commitizen import cmd , commands
3
7
from commitizen .config import BaseConfig , JsonConfig , TomlConfig , YAMLConfig
4
8
from commitizen .cz .customize import CustomizeCommitsCz
9
+ from commitizen .cz .utils import multiple_line_breaker
5
10
from commitizen .exceptions import MissingCzCustomizeConfigError
6
11
7
12
TOML_STR = r"""
36
41
]
37
42
message = "Select the type of change you are committing"
38
43
44
+ [[tool.commitizen.customize.questions]]
45
+ type = "input"
46
+ name = "subject"
47
+ message = "Subject."
48
+ filter = "lambda text: commitizen.cz.utils.required_validator(text.strip(\".\").strip(), msg=\"! Error: Subject is required\")"
49
+
39
50
[[tool.commitizen.customize.questions]]
40
51
type = "input"
41
52
name = "message"
42
53
message = "Body."
54
+ filter = "commitizen.cz.utils.multiple_line_breaker"
43
55
44
56
[[tool.commitizen.customize.questions]]
45
57
type = "confirm"
89
101
],
90
102
"message": "Select the type of change you are committing"
91
103
},
104
+ {
105
+ "type": "input",
106
+ "name": "subject",
107
+ "message": "Subject.",
108
+ "filter": "lambda text: commitizen.cz.utils.required_validator(text.strip(\".\").strip(), msg=\"! Error: Subject is required\")"
109
+ },
92
110
{
93
111
"type": "input",
94
112
"name": "message",
95
- "message": "Body."
113
+ "message": "Body.",
114
+ "filter": "commitizen.cz.utils.multiple_line_breaker"
96
115
},
97
116
{
98
117
"type": "confirm",
139
158
- value: bug fix
140
159
name: 'bug fix: A bug fix.'
141
160
message: Select the type of change you are committing
161
+ - type: input
162
+ name: subject
163
+ message: Subject.
164
+ filter: 'lambda text: commitizen.cz.utils.required_validator(text.strip(".").strip(), msg="! Error: Subject is required")'
142
165
- type: input
143
166
name: message
144
167
message: Body.
168
+ filter: 'commitizen.cz.utils.multiple_line_breaker'
145
169
- type: confirm
146
170
name: show_message
147
171
message: Do you want to add body message in commit?
330
354
"""
331
355
332
356
357
+ @pytest .fixture
358
+ def staging_is_clean (mocker : MockFixture , tmp_git_project ):
359
+ is_staging_clean_mock = mocker .patch ("commitizen.git.is_staging_clean" )
360
+ is_staging_clean_mock .return_value = False
361
+ return tmp_git_project
362
+
363
+
333
364
@pytest .fixture (
334
365
params = [
335
366
TomlConfig (data = TOML_STR , path = "not_exist.toml" ),
@@ -437,7 +468,7 @@ def test_change_type_order_unicode(config_with_unicode):
437
468
]
438
469
439
470
440
- def test_questions (config ):
471
+ def test_questions_default (config ):
441
472
cz = CustomizeCommitsCz (config )
442
473
questions = cz .questions ()
443
474
expected_questions = [
@@ -450,7 +481,18 @@ def test_questions(config):
450
481
],
451
482
"message" : "Select the type of change you are committing" ,
452
483
},
453
- {"type" : "input" , "name" : "message" , "message" : "Body." },
484
+ {
485
+ "type" : "input" ,
486
+ "name" : "subject" ,
487
+ "message" : "Subject." ,
488
+ "filter" : 'lambda text: commitizen.cz.utils.required_validator(text.strip(".").strip(), msg="! Error: Subject is required")' ,
489
+ },
490
+ {
491
+ "type" : "input" ,
492
+ "name" : "message" ,
493
+ "message" : "Body." ,
494
+ "filter" : "commitizen.cz.utils.multiple_line_breaker" ,
495
+ },
454
496
{
455
497
"type" : "confirm" ,
456
498
"name" : "show_message" ,
@@ -460,6 +502,38 @@ def test_questions(config):
460
502
assert list (questions ) == expected_questions
461
503
462
504
505
+ @pytest .mark .usefixtures ("staging_is_clean" )
506
+ def test_questions_filter (config , mocker : MockFixture ):
507
+ is_staging_clean_mock = mocker .patch ("commitizen.git.is_staging_clean" )
508
+ is_staging_clean_mock .return_value = False
509
+
510
+ prompt_mock = mocker .patch ("questionary.prompt" )
511
+ prompt_mock .return_value = {
512
+ "change_type" : "feature" ,
513
+ "subject" : "user created" ,
514
+ "message" : "body of the commit" ,
515
+ "show_message" : True ,
516
+ }
517
+
518
+ commit_mock = mocker .patch ("commitizen.git.commit" )
519
+ commit_mock .return_value = cmd .Command ("success" , "" , b"" , b"" , 0 )
520
+
521
+ commands .Commit (config , {})()
522
+
523
+ prompts_questions = prompt_mock .call_args [0 ][0 ]
524
+ assert prompts_questions [0 ]["type" ] == "list"
525
+ assert prompts_questions [0 ]["name" ] == "change_type"
526
+ assert prompts_questions [0 ]["use_shortcuts" ] is False
527
+ assert prompts_questions [1 ]["type" ] == "input"
528
+ assert prompts_questions [1 ]["name" ] == "subject"
529
+ assert type (prompts_questions [1 ]["filter" ]) is LambdaType
530
+ assert prompts_questions [2 ]["type" ] == "input"
531
+ assert prompts_questions [2 ]["name" ] == "message"
532
+ assert prompts_questions [2 ]["filter" ] == multiple_line_breaker
533
+ assert prompts_questions [3 ]["type" ] == "confirm"
534
+ assert prompts_questions [3 ]["name" ] == "show_message"
535
+
536
+
463
537
def test_questions_unicode (config_with_unicode ):
464
538
cz = CustomizeCommitsCz (config_with_unicode )
465
539
questions = cz .questions ()
0 commit comments