@@ -632,6 +632,16 @@ def test_init_with_all_fields(self, reset_configuration: None) -> None:
632632 assert metric .description == "Test code metric description"
633633 assert metric .tags == ["test" , "code" ]
634634
635+ def test_init_with_required_metrics (self , reset_configuration : None ) -> None :
636+ """Test initializing a CodeMetric with required_metrics."""
637+ metric = CodeMetric (
638+ name = "Test Code Metric" , node_level = StepType .llm , required_metrics = ["context_adherence" , "completeness" ]
639+ )
640+
641+ assert metric .name == "Test Code Metric"
642+ assert metric .required_metrics == ["context_adherence" , "completeness" ]
643+ assert metric .node_level == StepType .llm
644+
635645
636646class TestCodeMetricCreate :
637647 """Test suite for CodeMetric.create() method."""
@@ -862,6 +872,73 @@ def test_create_with_different_node_levels(
862872 # Verify the node_level is set on the metric itself
863873 assert metric .node_level == node_level
864874
875+ @patch ("galileo.__future__.metric.GalileoPythonConfig.get" )
876+ @patch ("galileo.__future__.metric.get_validate_code_scorer_task_result_scorers_code_validate_task_id_get" )
877+ @patch ("galileo.__future__.metric.validate_code_scorer_scorers_code_validate_post" )
878+ @patch ("galileo.__future__.metric.create_code_scorer_version_scorers_scorer_id_version_code_post" )
879+ @patch ("galileo.__future__.metric.create_scorers_post" )
880+ @patch ("galileo.__future__.metric.Scorers" )
881+ def test_create_with_required_metrics (
882+ self ,
883+ mock_scorers_class : MagicMock ,
884+ mock_create_scorers : MagicMock ,
885+ mock_create_version : MagicMock ,
886+ mock_validate_post : MagicMock ,
887+ mock_validate_get : MagicMock ,
888+ mock_config : MagicMock ,
889+ reset_configuration : None ,
890+ create_temp_code_file ,
891+ mock_api_client ,
892+ mock_scorer_response ,
893+ mock_version_response ,
894+ mock_scorer_full ,
895+ mock_validation_response ,
896+ mock_validation_task_result ,
897+ ) -> None :
898+ """Test create() passes required_metrics to validation and scorer creation APIs."""
899+ # Mock the config
900+ mock_config .return_value .api_client = mock_api_client
901+
902+ # Create a temporary Python file
903+ code_file = create_temp_code_file ()
904+
905+ # Mock the validation flow
906+ task_id = str (uuid4 ())
907+ mock_validate_post .sync .return_value = mock_validation_response (task_id )
908+ mock_validate_get .sync .return_value = mock_validation_task_result (TaskResultStatus .COMPLETED )
909+
910+ # Mock the scorer creation response
911+ scorer_id = str (uuid4 ())
912+ mock_create_scorers .sync .return_value = mock_scorer_response (scorer_id , "Test Code Metric" )
913+
914+ # Mock the version creation response
915+ mock_create_version .sync .return_value = mock_version_response (scorer_id )
916+
917+ # Mock the scorer list response for refresh
918+ mock_scorers_service = MagicMock ()
919+ mock_scorers_service .list .return_value = [mock_scorer_full (scorer_id , "Test Code Metric" )]
920+ mock_scorers_class .return_value = mock_scorers_service
921+
922+ required_metrics = ["context_adherence" , "completeness" ]
923+
924+ # Create the metric with required_metrics
925+ metric = (
926+ CodeMetric (name = "Test Code Metric" , node_level = StepType .llm , required_metrics = required_metrics )
927+ .load_code (str (code_file ))
928+ .create ()
929+ )
930+
931+ # Verify the metric was created successfully
932+ assert metric .is_synced ()
933+
934+ # Verify required_scorers was passed to validation API
935+ validate_call = mock_validate_post .sync .call_args
936+ assert validate_call .kwargs ["body" ].required_scorers == required_metrics
937+
938+ # Verify required_scorers was passed to scorer creation API
939+ create_scorer_call = mock_create_scorers .sync .call_args
940+ assert create_scorer_call .kwargs ["body" ].required_scorers == required_metrics
941+
865942 @patch ("galileo.__future__.metric.GalileoPythonConfig.get" )
866943 def test_create_reads_code_file_correctly (
867944 self ,
0 commit comments