import pytest from typing import List from cpl.core.utils.get_value import get_value def test_get_existing_str(): assert get_value({"key": "hello"}, "key", str) == "hello" def test_get_existing_int_already_typed(): # Value already has the correct type -> returned directly assert get_value({"count": 42}, "count", int) == 42 def test_get_existing_float_already_typed(): # Value already has the correct type -> returned directly assert get_value({"pi": 3.14}, "pi", float) == 3.14 # NOTE: get_value calls cast() internally but does NOT return the cast result # (the return value is lost). String "42" -> int returns None instead of 42. # This is a known bug in get_value. def test_get_str_to_int_returns_none_bug(): result = get_value({"count": "42"}, "count", int) assert result is None # Bug: should be 42 def test_get_missing_key_returns_none(): assert get_value({}, "missing", str) is None def test_get_missing_key_returns_default(): assert get_value({}, "missing", str, "fallback") == "fallback" def test_get_value_already_correct_type(): assert get_value({"x": 5}, "x", int) == 5 def test_get_list_already_correct_type(): result = get_value({"items": [1, 2, 3]}, "items", List[int]) assert result == [1, 2, 3] def test_get_list_of_str_already_correct_type(): result = get_value({"tags": ["a", "b"]}, "tags", List[str]) assert result == ["a", "b"] def test_get_bool_already_typed(): # Value is already bool -> returned directly assert get_value({"flag": True}, "flag", bool) is True assert get_value({"flag": False}, "flag", bool) is False # NOTE: Same bug – string "true" -> bool returns None def test_get_bool_from_str_returns_none_bug(): result = get_value({"flag": "true"}, "flag", bool) assert result is None # Bug: should be True def test_cast_failure_returns_default(): result = get_value({"val": "not_a_number"}, "val", int, -1) assert result == -1