@@ -1145,3 +1145,149 @@ def test_get_feature_returns_correct_match_among_many(
11451145 assert result is not None
11461146 assert result .id == "FEATURE_B"
11471147 assert result .default .enabled is False
1148+
1149+ # Tests for get_board_standard_artifacts
1150+
1151+ def test_get_board_standard_artifacts_version_not_found_returns_none (
1152+ self , service , mock_versions_fetcher
1153+ ):
1154+ mock_versions_fetcher .get_version_info .return_value = None
1155+
1156+ result = service .get_board_standard_artifacts (
1157+ "copter" , "nonexistent-version-id" , "CubeRed"
1158+ )
1159+
1160+ assert result is None
1161+
1162+ def test_get_board_standard_artifacts_board_not_found_returns_none (
1163+ self , service , mock_versions_fetcher , mock_ap_src_metadata_fetcher
1164+ ):
1165+ version_info = VersionInfo (
1166+ remote_info = RemoteInfo (
1167+ name = "ardupilot" ,
1168+ url = "https://github.com/ArduPilot/ardupilot.git" ,
1169+ ),
1170+ commit_ref = "refs/tags/Copter-4.5.0" ,
1171+ release_type = "stable" ,
1172+ version_number = "4.5.0" ,
1173+ ap_build_artifacts_url = "https://firmware.ardupilot.org/Copter/stable-4.5.0" ,
1174+ )
1175+ mock_versions_fetcher .get_version_info .return_value = version_info
1176+ mock_ap_src_metadata_fetcher .get_boards .return_value = ["CubeOrange" ]
1177+
1178+ result = service .get_board_standard_artifacts (
1179+ "copter" , version_info .version_id , "UnknownBoard"
1180+ )
1181+
1182+ assert result is None
1183+
1184+ def test_get_board_standard_artifacts_no_artifacts_url_returns_none (
1185+ self , service , mock_versions_fetcher , mock_ap_src_metadata_fetcher
1186+ ):
1187+ version_info = VersionInfo (
1188+ remote_info = RemoteInfo (
1189+ name = "ardupilot" ,
1190+ url = "https://github.com/ArduPilot/ardupilot.git" ,
1191+ ),
1192+ commit_ref = "refs/tags/Copter-4.5.0" ,
1193+ release_type = "stable" ,
1194+ version_number = "4.5.0" ,
1195+ ap_build_artifacts_url = None ,
1196+ )
1197+ mock_versions_fetcher .get_version_info .return_value = version_info
1198+ mock_ap_src_metadata_fetcher .get_boards .return_value = ["CubeRed" ]
1199+
1200+ result = service .get_board_standard_artifacts (
1201+ "copter" , version_info .version_id , "CubeRed"
1202+ )
1203+
1204+ assert result is None
1205+ mock_ap_src_metadata_fetcher .get_board_standard_artifacts_from_fw_server .assert_not_called ()
1206+
1207+ def test_get_board_standard_artifacts_success (
1208+ self , service , mock_versions_fetcher , mock_ap_src_metadata_fetcher
1209+ ):
1210+ from datetime import datetime , timezone
1211+
1212+ version_info = VersionInfo (
1213+ remote_info = RemoteInfo (
1214+ name = "ardupilot" ,
1215+ url = "https://github.com/ArduPilot/ardupilot.git" ,
1216+ ),
1217+ commit_ref = "refs/tags/Copter-4.5.0" ,
1218+ release_type = "stable" ,
1219+ version_number = "4.5.0" ,
1220+ ap_build_artifacts_url = "https://firmware.ardupilot.org/Copter/stable-4.5.0" ,
1221+ )
1222+ mock_versions_fetcher .get_version_info .return_value = version_info
1223+ mock_ap_src_metadata_fetcher .get_boards .return_value = ["CubeRed" ]
1224+ mock_ap_src_metadata_fetcher .get_board_standard_artifacts_from_fw_server .return_value = [
1225+ {
1226+ "name" : "arducopter.apj" ,
1227+ "url" : "https://firmware.ardupilot.org/Copter/stable-4.5.0/CubeRed/arducopter.apj" ,
1228+ "size" : 1640045 ,
1229+ "modified" : datetime (2024 , 4 , 2 , 5 , 11 , 12 , tzinfo = timezone .utc ),
1230+ }
1231+ ]
1232+
1233+ result = service .get_board_standard_artifacts (
1234+ "copter" , version_info .version_id , "CubeRed"
1235+ )
1236+
1237+ assert len (result ) == 1
1238+ assert result [0 ].name == "arducopter.apj"
1239+ assert result [0 ].size == 1640045
1240+ mock_ap_src_metadata_fetcher .get_board_standard_artifacts_from_fw_server .assert_called_once_with (
1241+ version_artifacts_url = "https://firmware.ardupilot.org/Copter/stable-4.5.0" ,
1242+ board_id = "CubeRed" ,
1243+ vehicle_id = "copter" ,
1244+ )
1245+
1246+ def test_get_board_standard_artifacts_fw_server_404_returns_none (
1247+ self , service , mock_versions_fetcher , mock_ap_src_metadata_fetcher
1248+ ):
1249+ version_info = VersionInfo (
1250+ remote_info = RemoteInfo (
1251+ name = "ardupilot" ,
1252+ url = "https://github.com/ArduPilot/ardupilot.git" ,
1253+ ),
1254+ commit_ref = "refs/tags/Copter-4.5.0" ,
1255+ release_type = "stable" ,
1256+ version_number = "4.5.0" ,
1257+ ap_build_artifacts_url = "https://firmware.ardupilot.org/Copter/stable-4.5.0" ,
1258+ )
1259+ mock_versions_fetcher .get_version_info .return_value = version_info
1260+ mock_ap_src_metadata_fetcher .get_boards .return_value = ["CubeRed" ]
1261+ mock_ap_src_metadata_fetcher .get_board_standard_artifacts_from_fw_server .return_value = None
1262+
1263+ result = service .get_board_standard_artifacts (
1264+ "copter" , version_info .version_id , "CubeRed"
1265+ )
1266+
1267+ assert result is None
1268+
1269+ def test_get_board_standard_artifacts_fw_server_error_propagates (
1270+ self , service , mock_versions_fetcher , mock_ap_src_metadata_fetcher
1271+ ):
1272+ from metadata_manager .ap_src_meta_fetcher import FirmwareServerUnavailableError
1273+
1274+ version_info = VersionInfo (
1275+ remote_info = RemoteInfo (
1276+ name = "ardupilot" ,
1277+ url = "https://github.com/ArduPilot/ardupilot.git" ,
1278+ ),
1279+ commit_ref = "refs/tags/Copter-4.5.0" ,
1280+ release_type = "stable" ,
1281+ version_number = "4.5.0" ,
1282+ ap_build_artifacts_url = "https://firmware.ardupilot.org/Copter/stable-4.5.0" ,
1283+ )
1284+ mock_versions_fetcher .get_version_info .return_value = version_info
1285+ mock_ap_src_metadata_fetcher .get_boards .return_value = ["CubeRed" ]
1286+ mock_ap_src_metadata_fetcher .get_board_standard_artifacts_from_fw_server .side_effect = (
1287+ FirmwareServerUnavailableError ("connection failed" )
1288+ )
1289+
1290+ with pytest .raises (FirmwareServerUnavailableError ):
1291+ service .get_board_standard_artifacts (
1292+ "copter" , version_info .version_id , "CubeRed"
1293+ )
0 commit comments