@@ -200,3 +200,107 @@ def test_invalid_json(tmp_path):
200200
201201 assert any ("invalid json" in e .lower () for e in validator .errors )
202202
203+
204+ def test_missing_registry_file (tmp_path ):
205+ registry = tmp_path / "missing_registry.json"
206+
207+ validator = RegistryValidator (registry )
208+
209+ validator .validate ()
210+
211+ assert any (
212+ "registry file not found" in error .lower ()
213+ for error in validator .errors
214+ )
215+
216+
217+ def test_keywords_must_be_list (tmp_path ):
218+ (tmp_path / "demo.py" ).write_text ("print('hello')" )
219+
220+ registry = write_registry (
221+ tmp_path ,
222+ [
223+ {
224+ "name" : "Demo" ,
225+ "emoji" : "🔥" ,
226+ "category" : "utilities" ,
227+ "difficulty" : "beginner" ,
228+ "description" : "Demo project" ,
229+ "keywords" : "demo" ,
230+ "path" : "demo.py" ,
231+ }
232+ ],
233+ )
234+
235+ validator = RegistryValidator (registry )
236+
237+ validator .validate ()
238+
239+ assert any (
240+ "keywords must be a list" in error .lower ()
241+ for error in validator .errors
242+ )
243+
244+
245+ def test_empty_keywords_generates_warning (tmp_path ):
246+ (tmp_path / "demo.py" ).write_text ("print('hello')" )
247+
248+ registry = write_registry (
249+ tmp_path ,
250+ [
251+ {
252+ "name" : "Demo" ,
253+ "emoji" : "🔥" ,
254+ "category" : "utilities" ,
255+ "difficulty" : "beginner" ,
256+ "description" : "Demo project" ,
257+ "keywords" : [],
258+ "path" : "demo.py" ,
259+ }
260+ ],
261+ )
262+
263+ validator = RegistryValidator (registry )
264+
265+ validator .validate ()
266+
267+ assert validator .errors == []
268+
269+ assert any (
270+ "has no keywords" in warning .lower ()
271+ for warning in validator .warnings
272+ )
273+
274+
275+ def test_json_report (tmp_path , capsys ):
276+ (tmp_path / "demo.py" ).write_text ("print('hello')" )
277+
278+ registry = write_registry (
279+ tmp_path ,
280+ [
281+ {
282+ "name" : "Demo" ,
283+ "emoji" : "🔥" ,
284+ "category" : "utilities" ,
285+ "difficulty" : "beginner" ,
286+ "description" : "Demo project" ,
287+ "keywords" : ["demo" ],
288+ "path" : "demo.py" ,
289+ }
290+ ],
291+ )
292+
293+ validator = RegistryValidator (registry )
294+
295+ validator .validate ()
296+
297+ validator .report (json_output = True )
298+
299+ captured = capsys .readouterr ()
300+
301+ output = json .loads (captured .out )
302+
303+ assert output ["projects" ] == 1
304+ assert output ["errors" ] == 0
305+ assert output ["warnings" ] == 0
306+ assert output ["status" ] == "passed"
0 commit comments