BareGit
"""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()