f7f1a7d5da
Phase 2 of PRD 0014. New module claude_bottle/backend/docker/cred_proxy_apply.py: - fetch_current_routes(slug): docker exec cat of the live routes.json from the running cred-proxy sidecar. - validate_routes_json(content): syntactic check before SIGHUP so failures keep the old routes live and surface a clearer error than 'reload failed' in the sidecar logs. - apply_routes_change(slug, new): fetch current → validate new → write to temp → docker cp into sidecar → docker kill --signal HUP. Returns (before, after) so the caller can render a real audit diff. - CredProxyApplyError: caller surfaces to operator without crashing the dashboard. docker exec / cp / kill paths are covered by the integration test in Phase 5; unit tests here cover the validator. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
"""Unit: validate_routes_json (PRD 0014 Phase 2). docker exec / cp /
|
|
kill paths are covered by the integration test."""
|
|
|
|
import unittest
|
|
|
|
from claude_bottle.backend.docker.cred_proxy_apply import (
|
|
CredProxyApplyError,
|
|
validate_routes_json,
|
|
)
|
|
|
|
|
|
class TestValidateRoutesJson(unittest.TestCase):
|
|
def test_accepts_routes_array(self):
|
|
validate_routes_json('{"routes": []}')
|
|
validate_routes_json(
|
|
'{"routes": [{"path": "/a/", "upstream": "https://example.com",'
|
|
' "auth_scheme": "Bearer", "token_env": "T0"}]}'
|
|
)
|
|
|
|
def test_rejects_bad_json(self):
|
|
with self.assertRaises(CredProxyApplyError) as cm:
|
|
validate_routes_json("{not json")
|
|
self.assertIn("not valid JSON", str(cm.exception))
|
|
|
|
def test_rejects_non_object_top_level(self):
|
|
with self.assertRaises(CredProxyApplyError):
|
|
validate_routes_json("[]")
|
|
|
|
def test_rejects_missing_routes_key(self):
|
|
with self.assertRaises(CredProxyApplyError):
|
|
validate_routes_json('{"other": []}')
|
|
|
|
def test_rejects_non_list_routes(self):
|
|
with self.assertRaises(CredProxyApplyError):
|
|
validate_routes_json('{"routes": "not a list"}')
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|