@@ -354,6 +354,96 @@ def test_admin_delete_dry_run_shows_endpoint():
354354 assert '"method": "DELETE"' in out
355355
356356
357+ def test_admin_help_shows_orphan_commands ():
358+ result = _run_help ("admin" )
359+ out = _strip_ansi (result .stdout )
360+ assert result .returncode == 0
361+ assert "orphan-report" in out
362+ assert "orphan-confirm" in out
363+
364+
365+ def test_admin_orphan_report_dry_run_not_applicable_help ():
366+ """orphan-report is read-only: no --yes / --dry-run flags."""
367+ result = _run_help ("admin" , "orphan-report" )
368+ out = _strip_ansi (result .stdout )
369+ assert result .returncode == 0
370+ assert "--dry-run" not in out
371+ assert "--yes" not in out
372+
373+
374+ def test_admin_orphan_confirm_dry_run_shows_endpoint ():
375+ """--dry-run must short-circuit before any confirmation or API call."""
376+ result = subprocess .run (
377+ [
378+ sys .executable ,
379+ "-m" ,
380+ "zad_cli" ,
381+ "admin" ,
382+ "orphan-confirm" ,
383+ "--item" ,
384+ "postgresql_database:regel_k4c_pr104" ,
385+ "--dry-run" ,
386+ "--output" ,
387+ "json" ,
388+ ],
389+ capture_output = True ,
390+ text = True ,
391+ env = {** _MINIMAL_ENV , "ZAD_API_KEY" : "k" , "ZAD_PROJECT_ID" : "p" },
392+ )
393+ out = _strip_ansi (result .stdout )
394+ assert result .returncode == 0
395+ assert "/v2/admin/orphans/confirm" in out
396+ assert '"method": "POST"' in out
397+ assert "regel_k4c_pr104" in out
398+
399+
400+ def test_admin_orphan_confirm_requires_item ():
401+ """No --item is a user error: exit 1, no API call."""
402+ result = subprocess .run (
403+ [sys .executable , "-m" , "zad_cli" , "admin" , "orphan-confirm" ],
404+ capture_output = True ,
405+ text = True ,
406+ env = {** _MINIMAL_ENV , "ZAD_API_KEY" : "k" , "ZAD_PROJECT_ID" : "p" },
407+ )
408+ assert result .returncode == 1
409+ assert "item is required" in _strip_ansi (result .stderr ).lower ()
410+
411+
412+ def test_admin_orphan_confirm_rejects_bad_format ():
413+ """An item missing the TYPE:NAME separator is rejected client-side."""
414+ result = subprocess .run (
415+ [sys .executable , "-m" , "zad_cli" , "admin" , "orphan-confirm" , "--item" , "justaname" ],
416+ capture_output = True ,
417+ text = True ,
418+ env = {** _MINIMAL_ENV , "ZAD_API_KEY" : "k" , "ZAD_PROJECT_ID" : "p" },
419+ )
420+ assert result .returncode == 1
421+ assert "invalid item format" in _strip_ansi (result .stderr ).lower ()
422+
423+
424+ def test_admin_orphan_confirm_rejects_unknown_type ():
425+ result = subprocess .run (
426+ [sys .executable , "-m" , "zad_cli" , "admin" , "orphan-confirm" , "--item" , "bogus_type:name" ],
427+ capture_output = True ,
428+ text = True ,
429+ env = {** _MINIMAL_ENV , "ZAD_API_KEY" : "k" , "ZAD_PROJECT_ID" : "p" },
430+ )
431+ assert result .returncode == 1
432+ assert "invalid item type" in _strip_ansi (result .stderr ).lower ()
433+
434+
435+ def test_admin_orphan_confirm_keycloak_requires_realm ():
436+ """keycloak_client without a realm is rejected before any API call."""
437+ result = subprocess .run (
438+ [sys .executable , "-m" , "zad_cli" , "admin" , "orphan-confirm" , "--item" , "keycloak_client:my-client" ],
439+ capture_output = True ,
440+ text = True ,
441+ env = {** _MINIMAL_ENV , "ZAD_API_KEY" : "k" , "ZAD_PROJECT_ID" : "p" },
442+ )
443+ assert result .returncode == 1
444+ assert "requires a realm" in _strip_ansi (result .stderr ).lower ()
445+
446+
357447def test_restore_help_shows_deployment_and_pvc_snapshots ():
358448 result = _run_help ("restore" )
359449 out = _strip_ansi (result .stdout )
0 commit comments