1
+ from __future__ import annotations
2
+
3
+ import typing as t
1
4
from unittest import mock
2
5
6
+ import click
3
7
import pytest
4
8
from click .testing import CliRunner
9
+ from click .testing import Result as ClickResult
5
10
6
11
from check_jsonschema import main as cli_main
7
- from check_jsonschema .cli import (
8
- ParseResult ,
9
- SchemaLoadingMode ,
10
- evaluate_environment_settings ,
11
- )
12
+ from check_jsonschema .cli import ParseResult , SchemaLoadingMode
12
13
13
14
14
15
@pytest .fixture
@@ -26,10 +27,32 @@ def mock_cli_exec():
26
27
27
28
28
29
@pytest .fixture
29
- def runner ():
30
+ def runner () -> CliRunner :
30
31
return CliRunner (mix_stderr = False )
31
32
32
33
34
+ def invoke_and_get_ctx (
35
+ runner : CliRunner ,
36
+ cmd : click .Command ,
37
+ args : t .Sequence [str ],
38
+ ) -> tuple [ClickResult , click .Context ]:
39
+ # There doesn't appear to be a good way to get the Click context used by a
40
+ # test invocation, so we replace the invoke method with a wrapper that
41
+ # calls `click.get_current_context` to extract the context object.
42
+
43
+ ctx = None
44
+
45
+ def extract_ctx (* args , ** kwargs ):
46
+ nonlocal ctx
47
+ ctx = click .get_current_context ()
48
+ return click .Command .invoke (* args , ** kwargs )
49
+
50
+ with mock .patch ("click.Command.invoke" , extract_ctx ):
51
+ results = runner .invoke (cmd , args )
52
+
53
+ return results , ctx
54
+
55
+
33
56
@pytest .mark .parametrize (
34
57
"schemafile,builtin_schema,check_metaschema,expect_mode" ,
35
58
[
@@ -55,34 +78,34 @@ def test_parse_result_set_schema(
55
78
assert args .schema_path is None
56
79
57
80
58
- def test_requires_some_args (runner ):
81
+ def test_requires_some_args (runner : CliRunner ):
59
82
result = runner .invoke (cli_main , [])
60
83
assert result .exit_code == 2
61
84
62
85
63
- def test_schemafile_and_instancefile (runner , mock_parse_result ):
86
+ def test_schemafile_and_instancefile (runner : CliRunner , mock_parse_result : ParseResult ):
64
87
runner .invoke (cli_main , ["--schemafile" , "schema.json" , "foo.json" ])
65
88
assert mock_parse_result .schema_mode == SchemaLoadingMode .filepath
66
89
assert mock_parse_result .schema_path == "schema.json"
67
90
assert mock_parse_result .instancefiles == ("foo.json" ,)
68
91
69
92
70
- def test_requires_at_least_one_instancefile (runner ):
93
+ def test_requires_at_least_one_instancefile (runner : CliRunner ):
71
94
result = runner .invoke (cli_main , ["--schemafile" , "schema.json" ])
72
95
assert result .exit_code == 2
73
96
74
97
75
- def test_requires_schemafile (runner ):
98
+ def test_requires_schemafile (runner : CliRunner ):
76
99
result = runner .invoke (cli_main , ["foo.json" ])
77
100
assert result .exit_code == 2
78
101
79
102
80
- def test_no_cache_defaults_false (runner , mock_parse_result ):
103
+ def test_no_cache_defaults_false (runner : CliRunner , mock_parse_result : ParseResult ):
81
104
runner .invoke (cli_main , ["--schemafile" , "schema.json" , "foo.json" ])
82
105
assert mock_parse_result .disable_cache is False
83
106
84
107
85
- def test_no_cache_flag_is_true (runner , mock_parse_result ):
108
+ def test_no_cache_flag_is_true (runner : CliRunner , mock_parse_result : ParseResult ):
86
109
runner .invoke (cli_main , ["--schemafile" , "schema.json" , "foo.json" , "--no-cache" ])
87
110
assert mock_parse_result .disable_cache is True
88
111
@@ -119,7 +142,7 @@ def test_no_cache_flag_is_true(runner, mock_parse_result):
119
142
],
120
143
],
121
144
)
122
- def test_mutex_schema_opts (runner , cmd_args ):
145
+ def test_mutex_schema_opts (runner : CliRunner , cmd_args : list [ str ] ):
123
146
result = runner .invoke (cli_main , cmd_args )
124
147
assert result .exit_code == 2
125
148
assert "are mutually exclusive" in result .stderr
@@ -133,22 +156,68 @@ def test_mutex_schema_opts(runner, cmd_args):
133
156
["-h" ],
134
157
],
135
158
)
136
- def test_supports_common_option (runner , cmd_args ):
159
+ def test_supports_common_option (runner : CliRunner , cmd_args : list [ str ] ):
137
160
result = runner .invoke (cli_main , cmd_args )
138
161
assert result .exit_code == 0
139
162
140
163
141
164
@pytest .mark .parametrize (
142
165
"setting,expect_value" , [(None , None ), ("1" , False ), ("0" , False )]
143
166
)
144
- def test_no_color_env_var (monkeypatch , setting , expect_value ):
145
- mock_ctx = mock .Mock ()
146
- mock_ctx .color = None
147
-
167
+ def test_no_color_env_var (
168
+ runner : CliRunner ,
169
+ monkeypatch : pytest .MonkeyPatch ,
170
+ setting : str | None ,
171
+ expect_value : bool | None ,
172
+ ):
148
173
if setting is None :
149
174
monkeypatch .delenv ("NO_COLOR" , raising = False )
150
175
else :
151
176
monkeypatch .setenv ("NO_COLOR" , setting )
152
177
153
- evaluate_environment_settings (mock_ctx )
154
- assert mock_ctx .color == expect_value
178
+ _ , ctx = invoke_and_get_ctx (
179
+ runner , cli_main , ["--schemafile" , "schema.json" , "foo.json" ]
180
+ )
181
+ assert ctx .color == expect_value
182
+
183
+
184
+ @pytest .mark .parametrize (
185
+ "setting,expected_value" ,
186
+ [(None , None ), ("auto" , None ), ("always" , True ), ("never" , False )],
187
+ )
188
+ def test_color_cli_option (
189
+ runner : CliRunner ,
190
+ setting : str | None ,
191
+ expected_value : bool | None ,
192
+ ):
193
+ args = ["--schemafile" , "schema.json" , "foo.json" ]
194
+ if setting :
195
+ args .extend (("--color" , setting ))
196
+ _ , ctx = invoke_and_get_ctx (runner , cli_main , args )
197
+ assert ctx .color == expected_value
198
+
199
+
200
+ def test_no_color_env_var_overrides_cli_option (
201
+ runner : CliRunner , monkeypatch : pytest .MonkeyPatch
202
+ ):
203
+ monkeypatch .setenv ("NO_COLOR" , "1" )
204
+
205
+ _ , ctx = invoke_and_get_ctx (
206
+ runner , cli_main , ["--color=always" , "--schemafile" , "schema.json" , "foo.json" ]
207
+ )
208
+ assert ctx .color is False
209
+
210
+
211
+ @pytest .mark .parametrize (
212
+ "setting,expected_value" ,
213
+ [("auto" , 0 ), ("always" , 0 ), ("never" , 0 ), ("anything_else" , 2 )],
214
+ )
215
+ def test_color_cli_option_is_choice (
216
+ runner : CliRunner , setting : str , expected_value : int
217
+ ):
218
+ assert (
219
+ runner .invoke (
220
+ cli_main , ["--color" , setting , "--schemafile" , "schema.json" , "foo.json" ]
221
+ ).exit_code
222
+ == expected_value
223
+ )
0 commit comments