from pathlib import Path import json import sys from types import SimpleNamespace PROJECT_ROOT = Path(__file__).resolve().parents[2] if str(PROJECT_ROOT) not in sys.path: sys.path.insert(0, str(PROJECT_ROOT)) from knoe.core.cluster_storage_browser import ( ClusterStorageBrowserResult, ClusterStorageRequest, RegionCandidate, RegionFeasibility, ) from knoe.ops import cli as ops_cli def _fake_browser_result() -> ClusterStorageBrowserResult: req = ClusterStorageRequest(pgdata_gb=100.0, wal_gb=25.0) feasibility = RegionFeasibility( region="us-central1", timezone_group="americas", premium_headroom_gb=250.0, standard_headroom_gb=180.0, can_premium=True, can_standard=True, default_pgdata_class="premium-rwo", default_wal_class="premium-rwo", feasibility_rank=0, notes=(), ) return ClusterStorageBrowserResult( generated_at="2026-01-01T00:00:00+00:00", project_id="p-1", timezone_group="americas", request=req, candidates=(RegionCandidate(feasibility=feasibility, latency_ms=12.3),), quota_link="https://cloud.google.com/compute/quotas", quota_console_link="https://console.cloud.google.com/iam-admin/quotas?project=p-1", ) def test_storage_browser_json_output(monkeypatch, capsys): monkeypatch.setattr(ops_cli, "build_cluster_storage_browser_result", lambda **_kwargs: _fake_browser_result()) rc = ops_cli.main( [ "storage-browser", "--project", "p-1", "--regions", "us-central1", "--output", "json", ] ) out = capsys.readouterr().out assert rc == 0 doc = json.loads(out) assert doc["projectId"] == "p-1" assert doc["candidates"][0]["defaultPgdataClass"] == "premium-rwo" def test_storage_browser_table_output(monkeypatch, capsys): monkeypatch.setattr(ops_cli, "build_cluster_storage_browser_result", lambda **_kwargs: _fake_browser_result()) rc = ops_cli.main( [ "storage-browser", "--project", "p-1", "--regions", "us-central1", "--output", "table", ] ) out = capsys.readouterr().out assert rc == 0 assert "region\tfeasible\tdefault(pg/wal)" in out assert "us-central1" in out assert "premium-rwo/premium-rwo" in out def test_legacy_component_action_dispatch_remains_supported(monkeypatch): called = {} def _status(_ctx): called["ok"] = True return 7 monkeypatch.setattr(ops_cli.importlib, "import_module", lambda _name: SimpleNamespace(status=_status)) rc = ops_cli.main(["common_core", "status", "--mode", "prod"]) assert called["ok"] is True assert rc == 7