from mappers import ( discover_items_from_list, metrics_from_dict, profile_from_dict, quote_from_dict, ) class TestQuoteFromDict: def test_basic(self): q = quote_from_dict("AAPL", {"name": "Apple", "last_price": 180.0}) assert q.symbol == "AAPL" assert q.price == 180.0 def test_fallback_to_close(self): q = quote_from_dict("AAPL", {"close": 175.0}) assert q.price == 175.0 def test_empty_dict(self): q = quote_from_dict("AAPL", {}) assert q.price is None class TestProfileFromDict: def test_basic(self): p = profile_from_dict("AAPL", {"name": "Apple", "sector": "Tech"}) assert p.sector == "Tech" def test_description_fallback(self): p = profile_from_dict("AAPL", {"long_description": "A company"}) assert p.description == "A company" def test_employees_fallback(self): p = profile_from_dict("AAPL", {"full_time_employees": 150000}) assert p.employees == 150000 class TestMetricsFromDict: def test_basic(self): m = metrics_from_dict("AAPL", {"pe_ratio": 28.0, "roe": 0.15}) assert m.pe_ratio == 28.0 assert m.roe == 0.15 def test_roe_fallback(self): m = metrics_from_dict("AAPL", {"return_on_equity": 0.20}) assert m.roe == 0.20 def test_eps_fallback(self): m = metrics_from_dict("AAPL", {"eps_ttm": 6.5}) assert m.eps == 6.5 def test_empty_dict(self): m = metrics_from_dict("AAPL", {}) assert m.pe_ratio is None class TestDiscoverItemsFromList: def test_basic(self): items = discover_items_from_list([ {"symbol": "TSLA", "price": 250.0}, {"symbol": "AAPL", "last_price": 180.0}, ]) assert len(items) == 2 assert items[0]["symbol"] == "TSLA" assert items[1]["price"] == 180.0 def test_empty_list(self): assert discover_items_from_list([]) == []