from dataclasses import dataclass import pytest from pytest import param import resolve_name mapping = {"key1": "value1", "dict-key": {"dict-key-key1": "value2-1"}} @dataclass class SimpleObj: """An object for testing.""" dict_attr: dict list_attr: list @property def exc(self): return self._notavailable test_obj = SimpleObj(dict_attr=mapping, list_attr=["a", "b", "c", "d"]) @pytest.mark.parametrize( ["name", "data", "expected"], [ param("key1", mapping, "value1", id="simple mapping"), param("dict-key.dict-key-key1", mapping, "value2-1", id="nested mapping"), param("dict_attr", test_obj, mapping, id="attribute lookup"), param("list_attr.2", test_obj, "c", id="list lookup"), ], ) def test_resolve_name(name, data, expected): """Test the resolve_name method gets the correct values.""" assert resolve_name.resolve_name(data, name) == expected def test_resolve_name_default(): """Test a default value.""" assert resolve_name.resolve_name(mapping, "key3", default="default") == "default" def test_resolve_name_property_error(): """An error in a property returns default.""" assert resolve_name.resolve_name(test_obj, "exc", default="default") == "default"