@@ -1121,6 +1121,7 @@ def test_missing_fields_use_defaults(self) -> None:
11211121 assert result [0 ].segments == []
11221122
11231123
1124+ # ===================================================================
11241125# ===================================================================
11251126# extract_routes_model
11261127# ===================================================================
@@ -1447,3 +1448,85 @@ def test_partial_data_fills_defaults(self) -> None:
14471448 assert result .level == 5
14481449 assert result .coins == 0
14491450 assert result .total_distance_m == 0.0
1451+
1452+
1453+ # ===================================================================
1454+ # extract_friends_model
1455+ # ===================================================================
1456+
1457+
1458+ def _build_friends_response (
1459+ friends : list [dict [str , Any ]] | None = None ,
1460+ key : str = "friends" ,
1461+ ) -> str :
1462+ """Build a synthetic turbo-stream response for friends.data."""
1463+ if friends is None :
1464+ friends = [
1465+ {"name" : "Alice" , "status" : "online" },
1466+ {"name" : "Bob" , "status" : "offline" },
1467+ {"name" : "Charlie" , "online" : True },
1468+ ]
1469+ return json .dumps ([key , friends ])
1470+
1471+
1472+ class TestExtractFriends :
1473+ """Verify extract_friends_model with synthetic data."""
1474+
1475+ def test_counts_total_friends (self ) -> None :
1476+ from custom_components .rouvy .api_client .parser import extract_friends_model
1477+
1478+ result = extract_friends_model (_build_friends_response ())
1479+ assert result .total_friends == 3
1480+
1481+ def test_counts_online_friends (self ) -> None :
1482+ from custom_components .rouvy .api_client .parser import extract_friends_model
1483+
1484+ result = extract_friends_model (_build_friends_response ())
1485+ assert result .online_friends == 2
1486+
1487+ def test_empty_list_returns_zero (self ) -> None :
1488+ from custom_components .rouvy .api_client .parser import extract_friends_model
1489+
1490+ result = extract_friends_model (_build_friends_response (friends = []))
1491+ assert result .total_friends == 0
1492+ assert result .online_friends == 0
1493+
1494+ def test_empty_response_returns_default (self ) -> None :
1495+ from custom_components .rouvy .api_client .parser import extract_friends_model
1496+
1497+ result = extract_friends_model ("" )
1498+ assert result .total_friends == 0
1499+ assert result .online_friends == 0
1500+
1501+ def test_no_friends_key_returns_default (self ) -> None :
1502+ from custom_components .rouvy .api_client .parser import extract_friends_model
1503+
1504+ result = extract_friends_model (json .dumps (["other_key" , []]))
1505+ assert result .total_friends == 0
1506+ assert result .online_friends == 0
1507+
1508+ def test_friend_list_key_variant (self ) -> None :
1509+ from custom_components .rouvy .api_client .parser import extract_friends_model
1510+
1511+ friends = [{"name" : "X" , "status" : "online" }]
1512+ result = extract_friends_model (_build_friends_response (friends = friends , key = "friendList" ))
1513+ assert result .total_friends == 1
1514+ assert result .online_friends == 1
1515+
1516+ def test_active_status_counted_as_online (self ) -> None :
1517+ from custom_components .rouvy .api_client .parser import extract_friends_model
1518+
1519+ friends = [{"name" : "D" , "status" : "active" }]
1520+ result = extract_friends_model (_build_friends_response (friends = friends ))
1521+ assert result .online_friends == 1
1522+
1523+ def test_all_offline (self ) -> None :
1524+ from custom_components .rouvy .api_client .parser import extract_friends_model
1525+
1526+ friends = [
1527+ {"name" : "A" , "status" : "offline" },
1528+ {"name" : "B" , "status" : "away" },
1529+ ]
1530+ result = extract_friends_model (_build_friends_response (friends = friends ))
1531+ assert result .total_friends == 2
1532+ assert result .online_friends == 0
0 commit comments