2121
2222class TestGetDeviceInfo :
2323 @patch ("app.fritzbox.requests.post" )
24- def test_uses_overview_json_when_available (self , mock_post ):
24+ def test_uses_home_json_when_available (self , mock_post ):
2525 response = MagicMock ()
2626 response .raise_for_status = MagicMock ()
2727 response .json .return_value = {
@@ -42,15 +42,46 @@ def test_uses_overview_json_when_available(self, mock_post):
4242 "sw_version" : "8.02" ,
4343 "uptime_seconds" : 1234 ,
4444 }
45+ assert mock_post .call_args .kwargs ["data" ]["page" ] == "home"
46+
47+ @patch ("app.fritzbox.requests.post" )
48+ def test_falls_back_to_boxinfo_when_home_is_not_json (self , mock_post ):
49+ home_response = MagicMock ()
50+ home_response .raise_for_status = MagicMock ()
51+ home_response .json .side_effect = ValueError ("not json" )
52+
53+ boxinfo_response = MagicMock ()
54+ boxinfo_response .raise_for_status = MagicMock ()
55+ boxinfo_response .json .return_value = {
56+ "data" : {
57+ "fritzos" : {
58+ "Productname" : "FRITZ!Box 6690 Cable" ,
59+ "nspver" : "8.21" ,
60+ }
61+ }
62+ }
63+
64+ mock_post .side_effect = [home_response , boxinfo_response ]
65+
66+ info = fb .get_device_info ("http://fritz.box" , "sid123" )
67+
68+ assert info == {
69+ "model" : "FRITZ!Box 6690 Cable" ,
70+ "sw_version" : "8.21" ,
71+ }
72+ assert [call .kwargs ["data" ]["page" ] for call in mock_post .call_args_list ] == [
73+ "home" ,
74+ "boxinfo" ,
75+ ]
4576
4677 @patch ("app.fritzbox.requests.get" )
4778 @patch ("app.fritzbox.requests.post" )
48- def test_falls_back_to_tr064_when_overview_returns_html (self , mock_post , mock_get ):
79+ def test_falls_back_to_tr064_when_data_pages_return_html (self , mock_post , mock_get ):
4980 html_response = MagicMock ()
5081 html_response .raise_for_status = MagicMock ()
5182 html_response .json .side_effect = ValueError ("not json" )
5283 html_response .text = "<html>login</html>"
53- mock_post .return_value = html_response
84+ mock_post .side_effect = [ html_response , html_response , html_response ]
5485
5586 tr064_response = MagicMock ()
5687 tr064_response .raise_for_status = MagicMock ()
@@ -63,14 +94,19 @@ def test_falls_back_to_tr064_when_overview_returns_html(self, mock_post, mock_ge
6394 "model" : "FRITZ!Box 6690 Cable" ,
6495 "sw_version" : "267.08.21" ,
6596 }
97+ assert [call .kwargs ["data" ]["page" ] for call in mock_post .call_args_list ] == [
98+ "home" ,
99+ "boxinfo" ,
100+ "overview" ,
101+ ]
66102
67103 @patch ("app.fritzbox.requests.get" )
68104 @patch ("app.fritzbox.requests.post" )
69- def test_returns_generic_fallback_when_overview_and_tr064_fail (self , mock_post , mock_get ):
105+ def test_returns_generic_fallback_when_all_sources_fail (self , mock_post , mock_get ):
70106 post_response = MagicMock ()
71107 post_response .raise_for_status = MagicMock ()
72108 post_response .json .side_effect = ValueError ("not json" )
73- mock_post .return_value = post_response
109+ mock_post .side_effect = [ post_response , post_response , post_response ]
74110
75111 mock_get .side_effect = RuntimeError ("network down" )
76112
0 commit comments