"""Validation tests for environment-only startup configuration."""
from __future__ import annotations
import os
import socket
import unittest
from unittest import mock
from src.config import Config
from src.errors import ConfigurationError
class ConfigTest(unittest.TestCase):
"""Verify default values, integer limits, and loopback policy."""
def test_defaults(self) -> None:
with mock.patch.dict(os.environ, {}, clear=True):
config = Config.fromEnvironment()
self.assertEqual(config.host, "127.0.0.1")
self.assertEqual(config.port, 6000)
def test_rejects_non_loopback_resolution(self) -> None:
public_result = [
(
socket.AF_INET,
socket.SOCK_STREAM,
6,
"",
("192.0.2.10", 0),
)
]
with mock.patch.dict(
os.environ,
{"FIREFOX_RDP_HOST": "example.test"},
clear=True,
), mock.patch("socket.getaddrinfo", return_value=public_result):
with self.assertRaises(ConfigurationError):
Config.fromEnvironment()
def test_rejects_invalid_numeric_and_log_values(self) -> None:
cases = (
{"FIREFOX_RDP_PORT": "not-a-number"},
{"FIREFOX_MCP_MAX_ELEMENTS": "0"},
{"FIREFOX_MCP_LOG_LEVEL": "verbose"},
)
for environment in cases:
with self.subTest(environment=environment):
with mock.patch.dict(
os.environ,
environment,
clear=True,
):
with self.assertRaises(ConfigurationError):
Config.fromEnvironment()
if __name__ == "__main__":
unittest.main()