33import shutil
44from unittest import TestCase
55
6+ import click .testing
67from click .testing import CliRunner
78import xarray as xr
89
1718 dataset-title-attr: error
1819"""
1920
20- no_match_config_yaml = "[]"
21-
2221
2322# noinspection PyTypeChecker
2423class CliMainTest (TestCase ):
@@ -55,23 +54,32 @@ def tearDownClass(cls):
5554 os .chdir (cls .last_cwd )
5655 shutil .rmtree (cls .temp_dir )
5756
58- def test_no_files (self ) :
57+ def xrlint (self , * args : tuple [ str , ...]) -> click . testing . Result :
5958 runner = CliRunner ()
60- result = runner .invoke (main )
61- self .assertIn ("No dataset files provided." , result .output )
62- self .assertEqual (1 , result .exit_code )
59+ result = runner .invoke (main , args )
60+ if not isinstance (result .exception , SystemExit ):
61+ self .assertIsNone (None , result .exception )
62+ return result
6363
64- def test_files_no_rules (self ):
65- runner = CliRunner ()
66- result = runner .invoke (main , self .files )
67- self .assertIn ("Warning: no configuration file found." , result .output )
68- self .assertIn ("No rules configured or applicable." , result .output )
64+ def test_no_files_no_config (self ):
65+ result = self .xrlint ()
66+ self .assertEqual ("" , result .output )
67+ self .assertEqual (0 , result .exit_code )
68+
69+ def test_config_no_files (self ):
70+ with text_file (DEFAULT_CONFIG_FILE_YAML , self .ok_config_yaml ):
71+ result = self .xrlint ()
72+ self .assertEqual ("" , result .output )
73+ self .assertEqual (0 , result .exit_code )
74+
75+ def test_files_no_config (self ):
76+ result = self .xrlint (* self .files )
77+ self .assertIn ("Warning: no configuration file found.\n " , result .output )
6978 self .assertEqual (1 , result .exit_code )
7079
7180 def test_files_one_rule (self ):
7281 with text_file (DEFAULT_CONFIG_FILE_YAML , self .ok_config_yaml ):
73- runner = CliRunner ()
74- result = runner .invoke (main , ["--no-color" ] + self .files )
82+ result = self .xrlint ("--no-color" , * self .files )
7583 self .assertEqual (
7684 "\n "
7785 "dataset1.zarr - ok\n \n "
@@ -84,16 +92,14 @@ def test_files_one_rule(self):
8492 self .assertEqual (0 , result .exit_code )
8593
8694 with text_file (DEFAULT_CONFIG_FILE_YAML , self .fail_config_yaml ):
87- runner = CliRunner ()
88- result = runner .invoke (main , self .files )
95+ result = self .xrlint (* self .files )
8996 self .assertIn ("Missing metadata, attributes are empty." , result .output )
9097 self .assertIn ("no-empty-attrs" , result .output )
9198 self .assertEqual (1 , result .exit_code )
9299
93100 def test_dir_one_rule (self ):
94101 with text_file (DEFAULT_CONFIG_FILE_YAML , self .ok_config_yaml ):
95- runner = CliRunner ()
96- result = runner .invoke (main , ["--no-color" , "." ])
102+ result = self .xrlint ("--no-color" , "." )
97103 prefix = self .temp_dir .replace ("\\ " , "/" )
98104 self .assertIn (f"{ prefix } /dataset1.zarr - ok\n \n " , result .output )
99105 self .assertIn (f"{ prefix } /dataset1.nc - ok\n \n " , result .output )
@@ -103,16 +109,15 @@ def test_dir_one_rule(self):
103109 self .assertEqual (0 , result .exit_code )
104110
105111 with text_file (DEFAULT_CONFIG_FILE_YAML , self .fail_config_yaml ):
106- runner = CliRunner ()
107- result = runner .invoke (main , self .files )
112+ result = self .xrlint (* self .files )
108113 self .assertIn ("Missing metadata, attributes are empty." , result .output )
109114 self .assertIn ("no-empty-attrs" , result .output )
110115 self .assertEqual (1 , result .exit_code )
111116
112117 def test_color_no_color (self ):
113118 with text_file (DEFAULT_CONFIG_FILE_YAML , self .ok_config_yaml ):
114- runner = CliRunner ( )
115- result = runner . invoke ( main , [ "--no-color" ] + self . files )
119+ result = self . xrlint ( "--no-color" , * self . files )
120+ self . assertIsNone ( result . exception )
116121 self .assertEqual (
117122 "\n "
118123 "dataset1.zarr - ok\n \n "
@@ -138,66 +143,68 @@ def test_color_no_color(self):
138143 self .assertEqual (0 , result .exit_code )
139144
140145 def test_files_with_rule_option (self ):
141- runner = CliRunner ()
142- result = runner .invoke (
143- main ,
144- [
145- "--rule" ,
146- "no-empty-attrs: error" ,
147- ]
148- + self .files ,
149- )
146+ result = self .xrlint ("--rule" , "no-empty-attrs: error" , * self .files )
150147 self .assertIn ("Missing metadata, attributes are empty." , result .output )
151148 self .assertIn ("no-empty-attrs" , result .output )
152149 self .assertEqual (1 , result .exit_code )
153150
154151 def test_files_with_plugin_and_rule_options (self ):
155- runner = CliRunner ()
156- result = runner .invoke (
157- main ,
158- [
159- "--plugin" ,
160- "xrlint.plugins.xcube" ,
161- "--rule" ,
162- "xcube/any-spatial-data-var: error" ,
163- ]
164- + self .files ,
152+ result = self .xrlint (
153+ "--plugin" ,
154+ "xrlint.plugins.xcube" ,
155+ "--rule" ,
156+ "xcube/any-spatial-data-var: error" ,
157+ * self .files ,
165158 )
166159 self .assertIn ("No spatial data variables found." , result .output )
167160 self .assertIn ("xcube/any-spatial-data-var" , result .output )
168161 self .assertEqual (1 , result .exit_code )
169162
170163 def test_files_with_output_file (self ):
171164 with text_file (DEFAULT_CONFIG_FILE_YAML , self .ok_config_yaml ):
172- runner = CliRunner ()
173- result = runner .invoke (main , ["-o" , "memory://report.txt" ] + self .files )
165+ result = self .xrlint ("-o" , "memory://report.txt" , * self .files )
174166 self .assertEqual ("" , result .output )
175167 self .assertEqual (0 , result .exit_code )
176168
177169 def test_files_but_config_file_missing (self ):
178- runner = CliRunner ()
179- result = runner .invoke (main , ["-c" , "pippo.py" ] + self .files )
170+ result = self .xrlint ("-c" , "pippo.py" , * self .files )
180171 self .assertIn ("Error: file not found: pippo.py" , result .output )
181172 self .assertEqual (1 , result .exit_code )
182173
183174 def test_files_with_format_option (self ):
184175 with text_file (DEFAULT_CONFIG_FILE_YAML , self .ok_config_yaml ):
185- runner = CliRunner ()
186- result = runner .invoke (main , ["-f" , "json" ] + self .files )
176+ result = self .xrlint ("-f" , "json" , * self .files )
187177 self .assertIn ('"results": [\n ' , result .output )
188178 self .assertEqual (0 , result .exit_code )
189179
190180 def test_file_does_not_match (self ):
191181 with text_file (DEFAULT_CONFIG_FILE_YAML , no_match_config_yaml ):
192- runner = CliRunner ()
193- result = runner .invoke (main , ["test.zarr" ])
182+ result = self .xrlint ("test.zarr" )
194183 # TODO: make this assertion work
195184 # self.assertIn("No configuration matches this file.", result.output)
196185 self .assertEqual (1 , result .exit_code )
197186
187+ def test_print_config_option (self ):
188+ with text_file (DEFAULT_CONFIG_FILE_YAML , self .ok_config_yaml ):
189+ result = self .xrlint ("--print-config" , "dataset2.zarr" )
190+ self .assertEqual (
191+ (
192+ "{\n "
193+ ' "name": "<computed>",\n '
194+ ' "plugins": {\n '
195+ ' "__core__": "xrlint.plugins.core"\n '
196+ " },\n "
197+ ' "rules": {\n '
198+ ' "dataset-title-attr": 2\n '
199+ " }\n "
200+ "}\n "
201+ ),
202+ result .output ,
203+ )
204+ self .assertEqual (0 , result .exit_code )
205+
198206 def test_files_with_invalid_format_option (self ):
199- runner = CliRunner ()
200- result = runner .invoke (main , ["-f" , "foo" ] + self .files )
207+ result = self .xrlint ("-f" , "foo" , * self .files )
201208 self .assertIn (
202209 "Error: unknown format 'foo'. The available formats are '" , result .output
203210 )
@@ -208,8 +215,7 @@ def test_init(self):
208215 exists = os .path .exists (config_file )
209216 self .assertFalse (exists )
210217 try :
211- runner = CliRunner ()
212- result = runner .invoke (main , ["--init" ])
218+ result = self .xrlint ("--init" )
213219 self .assertEqual (
214220 f"Configuration template written to { config_file } \n " , result .output
215221 )
@@ -225,8 +231,7 @@ def test_init_exists(self):
225231 exists = os .path .exists (config_file )
226232 self .assertFalse (exists )
227233 with text_file (config_file , "" ):
228- runner = CliRunner ()
229- result = runner .invoke (main , ["--init" ])
234+ result = self .xrlint ("--init" )
230235 self .assertEqual (
231236 f"Error: file { config_file } already exists.\n " , result .output
232237 )
0 commit comments