123 lines
4.4 KiB
Python
123 lines
4.4 KiB
Python
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
from javis.config.local_config import (
|
|
LocalConfigError,
|
|
load_local_defaults,
|
|
write_gemini_activation,
|
|
)
|
|
from javis.config.settings import ConfigurationError, Settings, default_data_dir
|
|
|
|
|
|
class SettingsTests(unittest.TestCase):
|
|
def test_windows_default_uses_local_app_data(self) -> None:
|
|
result = default_data_dir(
|
|
{"LOCALAPPDATA": "C:\\Local"},
|
|
platform_name="nt",
|
|
home=Path("C:\\Users\\test"),
|
|
)
|
|
self.assertEqual(result, Path("C:\\Local") / "Javis")
|
|
|
|
def test_posix_default_uses_xdg_data_home(self) -> None:
|
|
result = default_data_dir(
|
|
{"XDG_DATA_HOME": "/tmp/data"},
|
|
platform_name="posix",
|
|
home=Path("/home/test"),
|
|
)
|
|
self.assertEqual(result, Path("/tmp/data/javis"))
|
|
|
|
def test_explicit_data_dir_must_be_absolute(self) -> None:
|
|
with self.assertRaises(ConfigurationError):
|
|
Settings.from_env({"JAVIS_DATA_DIR": "relative"})
|
|
|
|
def test_provider_url_must_remain_local(self) -> None:
|
|
with self.assertRaises(ConfigurationError):
|
|
Settings.from_env(
|
|
{
|
|
"JAVIS_DATA_DIR": str(Path.cwd()),
|
|
"JAVIS_OLLAMA_URL": "https://example.com",
|
|
}
|
|
)
|
|
|
|
def test_zero_cost_defaults_are_conservative(self) -> None:
|
|
settings = Settings.from_env({"JAVIS_DATA_DIR": str(Path.cwd())})
|
|
|
|
self.assertTrue(settings.free_only)
|
|
self.assertFalse(settings.gemini_enabled)
|
|
self.assertFalse(settings.billing_confirmed_disabled)
|
|
self.assertEqual(settings.gemini_model, "gemini-3.6-flash")
|
|
self.assertEqual(settings.provider_mode, "auto")
|
|
|
|
def test_paid_mode_is_rejected(self) -> None:
|
|
with self.assertRaises(ConfigurationError):
|
|
Settings.from_env(
|
|
{
|
|
"JAVIS_DATA_DIR": str(Path.cwd()),
|
|
"JAVIS_FREE_ONLY": "false",
|
|
}
|
|
)
|
|
|
|
def test_cloud_limits_are_bounded(self) -> None:
|
|
with self.assertRaises(ConfigurationError):
|
|
Settings.from_env(
|
|
{
|
|
"JAVIS_DATA_DIR": str(Path.cwd()),
|
|
"JAVIS_MAX_CLOUD_REQUESTS_PER_DAY": "1001",
|
|
}
|
|
)
|
|
|
|
def test_local_toml_enables_only_confirmed_free_gemini(self) -> None:
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
data_dir = Path(directory)
|
|
write_gemini_activation(data_dir / "javis.toml")
|
|
|
|
settings = Settings.from_env({"JAVIS_DATA_DIR": str(data_dir)})
|
|
|
|
self.assertTrue(settings.gemini_enabled)
|
|
self.assertTrue(settings.free_only)
|
|
self.assertTrue(settings.billing_confirmed_disabled)
|
|
self.assertEqual(settings.provider_mode, "auto")
|
|
self.assertEqual(settings.gemini_max_retries, 1)
|
|
|
|
def test_environment_can_safely_disable_local_cloud_config(self) -> None:
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
data_dir = Path(directory)
|
|
write_gemini_activation(data_dir / "javis.toml")
|
|
|
|
settings = Settings.from_env(
|
|
{
|
|
"JAVIS_DATA_DIR": str(data_dir),
|
|
"JAVIS_GEMINI_ENABLED": "false",
|
|
}
|
|
)
|
|
|
|
self.assertFalse(settings.gemini_enabled)
|
|
|
|
def test_activation_file_contains_no_secret_and_is_not_overwritten(self) -> None:
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
path = Path(directory) / "javis.toml"
|
|
write_gemini_activation(path)
|
|
content = path.read_text(encoding="utf-8")
|
|
|
|
self.assertNotIn("api_key", content.lower())
|
|
self.assertNotIn("password", content.lower())
|
|
self.assertEqual(
|
|
load_local_defaults(path)["JAVIS_GEMINI_BILLING_CONFIRMED_DISABLED"],
|
|
"true",
|
|
)
|
|
with self.assertRaises(LocalConfigError):
|
|
write_gemini_activation(path)
|
|
|
|
def test_malformed_local_config_is_rejected(self) -> None:
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
data_dir = Path(directory)
|
|
(data_dir / "javis.toml").write_text("[providers", encoding="utf-8")
|
|
|
|
with self.assertRaises(ConfigurationError):
|
|
Settings.from_env({"JAVIS_DATA_DIR": str(data_dir)})
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|