@@ -1208,3 +1208,147 @@ def test_convert_multiple_items(self):
12081208 assert len (result_dataset .eval_cases ) == 2
12091209 assert result_dataset .eval_cases [0 ].prompt .parts [0 ].text == "Item 1"
12101210 assert result_dataset .eval_cases [1 ].prompt .parts [0 ].text == "Item 2"
1211+
1212+
1213+ class TestFlattenEvalDataConverter :
1214+ """Unit tests for the _FlattenEvalDataConverter class."""
1215+
1216+ def setup_method (self ):
1217+ self .converter = _evals_data_converters ._FlattenEvalDataConverter ()
1218+
1219+ def test_convert_simple_prompt_response (self ):
1220+ raw_data_df = pd .DataFrame (
1221+ {
1222+ "prompt" : ["Hello" ],
1223+ "response" : ["Hi" ],
1224+ }
1225+ )
1226+ raw_data = raw_data_df .to_dict (orient = "records" )
1227+ result_dataset = self .converter .convert (raw_data )
1228+ assert isinstance (result_dataset , vertexai_genai_types .EvaluationDataset )
1229+ assert len (result_dataset .eval_cases ) == 1
1230+ eval_case = result_dataset .eval_cases [0 ]
1231+
1232+ assert eval_case .prompt == genai_types .Content (
1233+ parts = [genai_types .Part (text = "Hello" )]
1234+ )
1235+ assert len (eval_case .responses ) == 1
1236+ assert eval_case .responses [0 ].response == genai_types .Content (
1237+ parts = [genai_types .Part (text = "Hi" )]
1238+ )
1239+ assert eval_case .reference is None
1240+ assert eval_case .system_instruction is None
1241+ assert eval_case .conversation_history is None
1242+
1243+ def test_convert_with_system_instruction_and_reference (self ):
1244+ raw_data_df = pd .DataFrame (
1245+ {
1246+ "prompt" : ["Hello" ],
1247+ "response" : ["Hi there!" ],
1248+ "instruction" : ["Be nice." ],
1249+ "reference" : ["Hey" ],
1250+ }
1251+ )
1252+ raw_data = raw_data_df .to_dict (orient = "records" )
1253+ result_dataset = self .converter .convert (raw_data )
1254+ eval_case = result_dataset .eval_cases [0 ]
1255+ assert eval_case .system_instruction == genai_types .Content (
1256+ parts = [genai_types .Part (text = "Be nice." )]
1257+ )
1258+ assert eval_case .prompt == genai_types .Content (
1259+ parts = [genai_types .Part (text = "Hello" )]
1260+ )
1261+ assert eval_case .reference .response == genai_types .Content (
1262+ parts = [genai_types .Part (text = "Hey" )]
1263+ )
1264+
1265+ def test_convert_with_conversation_history (self ):
1266+ raw_data_df = pd .DataFrame (
1267+ {
1268+ "prompt" : ["Current prompt" ],
1269+ "response" : ["A response" ],
1270+ "history" : [
1271+ [
1272+ {"role" : "user" , "parts" : [{"text" : "Old user msg" }]},
1273+ {"role" : "model" , "parts" : [{"text" : "Old model msg" }]},
1274+ ]
1275+ ],
1276+ }
1277+ )
1278+ raw_data = raw_data_df .to_dict (orient = "records" )
1279+ result_dataset = self .converter .convert (raw_data )
1280+ eval_case = result_dataset .eval_cases [0 ]
1281+
1282+ assert eval_case .prompt == genai_types .Content (
1283+ parts = [genai_types .Part (text = "Current prompt" )]
1284+ )
1285+ assert eval_case .reference is None
1286+ assert len (eval_case .conversation_history ) == 2
1287+ assert eval_case .conversation_history [0 ].content .parts [0 ].text == "Old user msg"
1288+ assert (
1289+ eval_case .conversation_history [1 ].content .parts [0 ].text == "Old model msg"
1290+ )
1291+
1292+ def test_convert_missing_response_raises_value_error (self ):
1293+ raw_data_df = pd .DataFrame ({"prompt" : ["Hello" ]}) # Missing response
1294+ raw_data = raw_data_df .to_dict (orient = "records" )
1295+ with pytest .raises (
1296+ ValueError , match = "Response is required but missing for eval_case_0"
1297+ ):
1298+ self .converter .convert (raw_data )
1299+
1300+ def test_convert_missing_prompt_raises_value_error (self ):
1301+ raw_data_df = pd .DataFrame ({"response" : ["Hi" ]}) # Missing prompt
1302+ raw_data = raw_data_df .to_dict (orient = "records" )
1303+ with pytest .raises (
1304+ ValueError , match = "Prompt is required but missing for eval_case_0"
1305+ ):
1306+ self .converter .convert (raw_data )
1307+
1308+ def test_convert_invalid_prompt_type_raises_value_error (self ):
1309+ raw_data_df = pd .DataFrame (
1310+ {
1311+ "prompt" : [123 ], # Invalid prompt type
1312+ "response" : ["Hi" ],
1313+ }
1314+ )
1315+ raw_data = raw_data_df .to_dict (orient = "records" )
1316+ with pytest .raises (ValueError , match = "Invalid prompt type for case 0" ):
1317+ self .converter .convert (raw_data )
1318+
1319+ def test_convert_invalid_response_type_raises_value_error (self ):
1320+ raw_data_df = pd .DataFrame (
1321+ {
1322+ "prompt" : ["Hello" ],
1323+ "response" : [123 ], # Invalid response type
1324+ }
1325+ )
1326+ raw_data = raw_data_df .to_dict (orient = "records" )
1327+ with pytest .raises (ValueError , match = "Invalid response type for case 0" ):
1328+ self .converter .convert (raw_data )
1329+
1330+ def test_convert_multiple_items (self ):
1331+ raw_data_df = pd .DataFrame (
1332+ {
1333+ "prompt" : ["Item 1" , "Item 2" ],
1334+ "response" : ["Resp 1" , "Resp 2" ],
1335+ }
1336+ )
1337+ raw_data = raw_data_df .to_dict (orient = "records" )
1338+ result_dataset = self .converter .convert (raw_data )
1339+ assert len (result_dataset .eval_cases ) == 2
1340+ assert result_dataset .eval_cases [0 ].prompt .parts [0 ].text == "Item 1"
1341+ assert result_dataset .eval_cases [1 ].prompt .parts [0 ].text == "Item 2"
1342+
1343+ def test_convert_with_additional_columns (self ):
1344+ raw_data_df = pd .DataFrame (
1345+ {
1346+ "prompt" : ["Hello" ],
1347+ "response" : ["Hi" ],
1348+ "custom_column" : ["custom_value" ],
1349+ }
1350+ )
1351+ raw_data = raw_data_df .to_dict (orient = "records" )
1352+ result_dataset = self .converter .convert (raw_data )
1353+ eval_case = result_dataset .eval_cases [0 ]
1354+ assert eval_case .custom_column == "custom_value"
0 commit comments