import util.util as u from unittest.mock import patch import pytest def test_normalize_service_url_http(): assert u.normalize_service_url("http://example.com") == "http://example.com" assert u.normalize_service_url("http://example.com/") == "http://example.com" def test_normalize_service_url_invalid_schemes(): with pytest.raises(ValueError, match="Invalid service url"): _ = u.normalize_service_url("ftp://example.com") with pytest.raises(ValueError, match="Invalid service url"): _ = u.normalize_service_url("example.com") with pytest.raises(ValueError, match="Invalid service url"): _ = u.normalize_service_url("//example.com") def test_read_env_missing_env_var(): data = {"token": "env:MISSING_VAR", "keep": "value"} with patch.dict("os.environ", {}, clear=True): u.read_env(data) assert data == {"keep": "value"} assert "token" not in data def test_read_env_no_env_prefix(): data = {"token": "literal_value", "number": 123} u.read_env(data) assert data == {"token": "literal_value", "number": 123} def test_read_env_deeply_nested(): data = {"level1": {"level2": {"token": "env:DEEP_TOKEN"}}} with patch.dict("os.environ", {"DEEP_TOKEN": "deep_secret"}): u.read_env(data) assert data["level1"]["level2"]["token"] == "deep_secret" def test_read_env_mixed_types(): data = { "string": "env:TOKEN", "number": 42, "list": [1, 2, 3], "none": None, "bool": True, } with patch.dict("os.environ", {"TOKEN": "secret"}): u.read_env(data) assert data["string"] == "secret" assert data["number"] == 42 assert data["list"] == [1, 2, 3] assert data["none"] is None assert data["bool"] is True def test_read_env_empty_dict(): data = {} u.read_env(data) assert data == {}