Files
slic/tests/test_utils_config.py
T
tligui_y f4cd41164a
Run CI Tests / test (push) Successful in 55s
Update tests/test_utils_config.py
2025-08-03 22:02:12 +02:00

117 lines
3.2 KiB
Python

import pytest
import json
import tempfile
import os
from slic.utils.config import Config
def make_temp_json(data: dict) -> str:
# Write a dictionary to a temporary JSON file.
tmp = tempfile.NamedTemporaryFile(mode="w+", delete=False, suffix=".json")
json.dump(data, tmp)
tmp.close()
return tmp.name
def test_config_with_nested_and_list_data():
json_data = {
"user": "charlie",
"active": True,
"volume": 0.85,
"preferences": {
"theme": "dark",
"notifications": {
"email": True,
"sms": False
}
},
"projects": [
{"name": "Project A", "status": "active"},
{"name": "Project B", "status": "archived"}
],
"last_login": None,
"tags": ["dev", "test", "prod"]
}
path = make_temp_json(json_data)
try:
cfg = Config(path)
# Top-level checks
assert hasattr(cfg, "user")
assert cfg.user == "charlie"
assert hasattr(cfg, "active")
assert cfg.active is True
assert hasattr(cfg, "volume")
assert isinstance(cfg.volume, float)
assert cfg.volume == 0.85
assert hasattr(cfg, "last_login")
assert cfg.last_login is None
assert hasattr(cfg, "tags")
assert isinstance(cfg.tags, list)
assert cfg.tags[1] == "test"
# Nested dict
assert isinstance(cfg.preferences, dict)
assert cfg.preferences["theme"] == "dark"
assert cfg.preferences["notifications"]["sms"] is False
# List of dicts
assert isinstance(cfg.projects, list)
assert cfg.projects[0]["name"] == "Project A"
assert cfg.projects[1]["status"] == "archived"
finally:
os.remove(path)
def test_config_with_strange_and_edge_keys():
json_data = {
"": "empty key",
"123": "numeric string",
"true": False,
"None": None,
"spaces in key": "with spaces",
"[]": "brackets key",
"1": "digit string",
"class": "reserved word",
"user.name": "dot notation",
"UPPERCASE": "yes",
"camelCase": "also yes",
"hyphen-key": "dangerous"
}
path = make_temp_json(json_data)
try:
cfg = Config(path)
# All keys should be accessible via getattr
assert getattr(cfg, "") == "empty key"
assert getattr(cfg, "123") == "numeric string"
assert getattr(cfg, "true") is False
assert getattr(cfg, "None") is None
assert getattr(cfg, "spaces in key") == "with spaces"
assert getattr(cfg, "[]") == "brackets key"
assert getattr(cfg, "1") == "digit string"
assert getattr(cfg, "class") == "reserved word"
assert getattr(cfg, "user.name") == "dot notation"
assert getattr(cfg, "UPPERCASE") == "yes"
assert getattr(cfg, "camelCase") == "also yes"
assert getattr(cfg, "hyphen-key") == "dangerous"
# Check that dot-access fails for bad names
for key in ["string", "spaces", "value"]:
with pytest.raises(AttributeError):
_ = getattr(cfg, key)
finally:
os.remove(path)