118 lines
5.1 KiB
Python
118 lines
5.1 KiB
Python
import errno
|
|
import importlib.util
|
|
import json
|
|
import os
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
|
|
SCRIPT_PATH = Path(__file__).resolve().parents[1] / "scripts" / "init_proxy_config.py"
|
|
|
|
|
|
def load_script_module():
|
|
spec = importlib.util.spec_from_file_location("init_proxy_config_under_test", SCRIPT_PATH)
|
|
module = importlib.util.module_from_spec(spec)
|
|
assert spec is not None and spec.loader is not None
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
class InitProxyConfigTests(unittest.TestCase):
|
|
def test_creates_warp_defaults_when_proxy_runtime_missing(self) -> None:
|
|
module = load_script_module()
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
path = Path(tmp) / "config.json"
|
|
path.write_text(json.dumps({"auth-key": "secret", "proxy": ""}), encoding="utf-8")
|
|
with patch.dict(os.environ, {"CHATGPT2API_CONFIG_FILE": str(path)}, clear=False):
|
|
self.assertEqual(module.main(), 0)
|
|
|
|
data = json.loads(path.read_text(encoding="utf-8"))
|
|
self.assertEqual(data["auth-key"], "secret")
|
|
runtime = data["proxy_runtime"]
|
|
self.assertTrue(runtime["enabled"])
|
|
self.assertEqual(runtime["egress_mode"], "single_proxy")
|
|
self.assertEqual(runtime["proxy_url"], "http://privoxy:8118")
|
|
self.assertTrue(runtime["clearance"]["enabled"])
|
|
self.assertEqual(runtime["clearance"]["mode"], "flaresolverr")
|
|
self.assertEqual(runtime["clearance"]["flaresolverr_url"], "http://flaresolverr:8191")
|
|
|
|
def test_existing_custom_runtime_is_not_overwritten(self) -> None:
|
|
module = load_script_module()
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
path = Path(tmp) / "config.json"
|
|
path.write_text(
|
|
json.dumps(
|
|
{
|
|
"auth-key": "secret",
|
|
"proxy_runtime": {
|
|
"enabled": False,
|
|
"egress_mode": "single_proxy",
|
|
"proxy_url": "http://custom.proxy:8080",
|
|
"clearance": {
|
|
"enabled": True,
|
|
"mode": "manual",
|
|
"cf_clearance": "manual-token",
|
|
},
|
|
},
|
|
}
|
|
),
|
|
encoding="utf-8",
|
|
)
|
|
with patch.dict(os.environ, {"CHATGPT2API_CONFIG_FILE": str(path)}, clear=False):
|
|
self.assertEqual(module.main(), 0)
|
|
|
|
runtime = json.loads(path.read_text(encoding="utf-8"))["proxy_runtime"]
|
|
self.assertFalse(runtime["enabled"])
|
|
self.assertEqual(runtime["proxy_url"], "http://custom.proxy:8080")
|
|
self.assertEqual(runtime["clearance"]["mode"], "manual")
|
|
self.assertEqual(runtime["clearance"]["cf_clearance"], "manual-token")
|
|
self.assertIn("timeout_sec", runtime["clearance"])
|
|
self.assertIn("reset_session_status_codes", runtime)
|
|
|
|
def test_env_can_disable_runtime_defaults_for_warp_compose(self) -> None:
|
|
module = load_script_module()
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
path = Path(tmp) / "config.json"
|
|
path.write_text(json.dumps({"auth-key": "secret"}), encoding="utf-8")
|
|
with patch.dict(
|
|
os.environ,
|
|
{
|
|
"CHATGPT2API_CONFIG_FILE": str(path),
|
|
"CHATGPT2API_PROXY_RUNTIME_ENABLED": "false",
|
|
"CHATGPT2API_PROXY_RUNTIME_CLEARANCE_ENABLED": "false",
|
|
},
|
|
clear=False,
|
|
):
|
|
self.assertEqual(module.main(), 0)
|
|
|
|
runtime = json.loads(path.read_text(encoding="utf-8"))["proxy_runtime"]
|
|
self.assertFalse(runtime["enabled"])
|
|
self.assertFalse(runtime["clearance"]["enabled"])
|
|
self.assertEqual(runtime["clearance"]["mode"], "none")
|
|
|
|
def test_bind_mounted_config_file_falls_back_when_atomic_replace_is_busy(self) -> None:
|
|
module = load_script_module()
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
path = Path(tmp) / "config.json"
|
|
path.write_text(json.dumps({"auth-key": "secret", "proxy": ""}), encoding="utf-8")
|
|
original_replace = Path.replace
|
|
|
|
def replace_with_ebusy(self: Path, target: Path) -> Path:
|
|
if self.name == "config.json.tmp":
|
|
raise OSError(errno.EBUSY, "Device or resource busy")
|
|
return original_replace(self, target)
|
|
|
|
with patch.dict(os.environ, {"CHATGPT2API_CONFIG_FILE": str(path)}, clear=False):
|
|
with patch.object(Path, "replace", replace_with_ebusy):
|
|
self.assertEqual(module.main(), 0)
|
|
|
|
data = json.loads(path.read_text(encoding="utf-8"))
|
|
self.assertTrue(data["proxy_runtime"]["enabled"])
|
|
self.assertFalse(path.with_suffix(".json.tmp").exists())
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|