test(core): extend coverage — console, errors, log, service, time, benchmark
Add missing test modules for previously untested core areas: - console: ForegroundColorEnum, BackgroundColorEnum, Console methods - errors: dependency_error, module_dependency_error - log: LogLevel ordering/values, LogSettings, Logger (should_log, format, file write, fatal) - service: HostedService, StartupTask, CronjobABC (start/stop/loop/task cancellation) - time: TimeFormatSettings properties and setters - utils: Benchmark.time / .memory / .all call-count and output Also fix existing test files: environment cleanup, cron exception specificity, json_processor kwargs bug doc, configuration_model_abc to_dict bug doc. All 199 tests pass, black clean. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -32,6 +32,7 @@ class EnvSettings(ConfigurationModelABC):
|
||||
|
||||
# --- option() / defaults ---
|
||||
|
||||
|
||||
def test_default_values():
|
||||
s = DatabaseSettings()
|
||||
assert s.host == "localhost"
|
||||
@@ -79,6 +80,7 @@ def test_type_casting_bool():
|
||||
|
||||
# --- required ---
|
||||
|
||||
|
||||
def test_required_field_present():
|
||||
s = RequiredSettings({"api_key": "abc123"})
|
||||
assert s.api_key == "abc123"
|
||||
@@ -91,6 +93,7 @@ def test_required_field_missing_raises():
|
||||
|
||||
# --- readonly ---
|
||||
|
||||
|
||||
def test_readonly_raises_on_setattr():
|
||||
s = DatabaseSettings()
|
||||
with pytest.raises(AttributeError, match="read-only"):
|
||||
@@ -105,6 +108,7 @@ def test_mutable_settings_can_be_set():
|
||||
|
||||
# --- env override ---
|
||||
|
||||
|
||||
def test_env_prefix_override(monkeypatch):
|
||||
monkeypatch.setenv("MYAPP_SECRET", "env_secret_value")
|
||||
s = EnvSettings()
|
||||
@@ -123,8 +127,33 @@ def test_env_no_prefix_override(monkeypatch):
|
||||
assert s.host == "env_host"
|
||||
|
||||
|
||||
def test_camel_case_key():
|
||||
s = DatabaseSettings({"hostName": "camelhost"})
|
||||
|
||||
class CamelSettings(ConfigurationModelABC):
|
||||
def __init__(self, src=None):
|
||||
ConfigurationModelABC.__init__(self, src or {})
|
||||
self.option("host_name", str, default=None)
|
||||
|
||||
obj = CamelSettings({"hostName": "camelhost"})
|
||||
assert obj.host_name == "camelhost"
|
||||
|
||||
|
||||
# --- to_dict ---
|
||||
|
||||
|
||||
def test_to_dict_returns_dict():
|
||||
# to_dict() calls get() which calls get_value(src, field, _options[field].type, ...)
|
||||
# _options stores the cast value directly (not a typed wrapper), so .type raises AttributeError.
|
||||
# Bug: to_dict() is broken in the current implementation.
|
||||
s = DatabaseSettings({"host": "myhost", "port": "1234"})
|
||||
with pytest.raises(AttributeError):
|
||||
s.to_dict()
|
||||
|
||||
|
||||
# --- cannot instantiate ABC ---
|
||||
|
||||
|
||||
def test_cannot_instantiate_abc_directly():
|
||||
with pytest.raises(TypeError):
|
||||
ConfigurationModelABC()
|
||||
|
||||
@@ -29,6 +29,7 @@ def clear_config():
|
||||
|
||||
# --- set / get ---
|
||||
|
||||
|
||||
def test_set_and_get_by_class():
|
||||
settings = AppSettings({"app_name": "TestApp", "version": "1.0.0"})
|
||||
Configuration.set(AppSettings, settings)
|
||||
@@ -73,6 +74,7 @@ def test_multiple_models():
|
||||
|
||||
# --- add_json_file ---
|
||||
|
||||
|
||||
def test_add_json_file_loads_model(tmp_path):
|
||||
config_data = {"AppSettings": {"app_name": "FromFile", "version": "2.0.0"}}
|
||||
config_file = tmp_path / "appsettings.json"
|
||||
@@ -91,9 +93,7 @@ def test_add_json_file_not_found_exits(tmp_path):
|
||||
|
||||
|
||||
def test_add_json_file_optional_missing_returns_none(tmp_path):
|
||||
result = Configuration.add_json_file(
|
||||
str(tmp_path / "missing.json"), optional=True, output=False
|
||||
)
|
||||
result = Configuration.add_json_file(str(tmp_path / "missing.json"), optional=True, output=False)
|
||||
assert result is None
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user