|
53 | 53 | pytestmark = pytest.mark.usefixtures("google_auth_mock") |
54 | 54 |
|
55 | 55 |
|
| 56 | +class TestDropEmptyColumns: |
| 57 | + """Unit tests for the _drop_empty_columns function.""" |
| 58 | + |
| 59 | + def test_drop_empty_columns(self): |
| 60 | + df = pd.DataFrame( |
| 61 | + { |
| 62 | + "col1": [1, 2, 3], |
| 63 | + "col2": [None, None, None], |
| 64 | + "col3": [[], [], []], |
| 65 | + "col4": [{}, {}, {}], |
| 66 | + "col5": [1, None, []], |
| 67 | + } |
| 68 | + ) |
| 69 | + result_df = _evals_common._drop_empty_columns(df) |
| 70 | + assert "col1" in result_df.columns |
| 71 | + assert "col2" not in result_df.columns |
| 72 | + assert "col3" not in result_df.columns |
| 73 | + assert "col4" not in result_df.columns |
| 74 | + assert "col5" in result_df.columns |
| 75 | + |
| 76 | + def test_drop_empty_columns_all_empty(self): |
| 77 | + df = pd.DataFrame( |
| 78 | + { |
| 79 | + "col1": [None, None, None], |
| 80 | + "col2": [[], [], []], |
| 81 | + } |
| 82 | + ) |
| 83 | + result_df = _evals_common._drop_empty_columns(df) |
| 84 | + assert result_df.empty |
| 85 | + |
| 86 | + def test_drop_empty_columns_none_empty(self): |
| 87 | + df = pd.DataFrame( |
| 88 | + { |
| 89 | + "col1": [1, 2, 3], |
| 90 | + "col2": ["a", "b", "c"], |
| 91 | + } |
| 92 | + ) |
| 93 | + result_df = _evals_common._drop_empty_columns(df) |
| 94 | + assert list(result_df.columns) == ["col1", "col2"] |
| 95 | + |
| 96 | + |
56 | 97 | def _create_content_dump(text: str) -> dict[str, list[genai_types.Content]]: |
57 | 98 | return { |
58 | 99 | "contents": [ |
@@ -389,6 +430,45 @@ def setup_method(self): |
389 | 430 | ) |
390 | 431 | self.client = vertexai.Client(project=_TEST_PROJECT, location=_TEST_LOCATION) |
391 | 432 |
|
| 433 | + @mock.patch.object(_evals_common, "Models") |
| 434 | + @mock.patch.object(_evals_utils, "EvalDatasetLoader") |
| 435 | + def test_inference_drops_empty_columns(self, mock_eval_dataset_loader, mock_models): |
| 436 | + mock_df = pd.DataFrame( |
| 437 | + { |
| 438 | + "prompt": ["test prompt 1", "test prompt 2"], |
| 439 | + "empty_col": [None, None], |
| 440 | + "empty_list_col": [[], []], |
| 441 | + } |
| 442 | + ) |
| 443 | + mock_eval_dataset_loader.return_value.load.return_value = mock_df.to_dict( |
| 444 | + orient="records" |
| 445 | + ) |
| 446 | + |
| 447 | + mock_generate_content_response = genai_types.GenerateContentResponse( |
| 448 | + candidates=[ |
| 449 | + genai_types.Candidate( |
| 450 | + content=genai_types.Content( |
| 451 | + parts=[genai_types.Part(text="test response")] |
| 452 | + ), |
| 453 | + finish_reason=genai_types.FinishReason.STOP, |
| 454 | + ) |
| 455 | + ], |
| 456 | + prompt_feedback=None, |
| 457 | + ) |
| 458 | + mock_models.return_value.generate_content.return_value = ( |
| 459 | + mock_generate_content_response |
| 460 | + ) |
| 461 | + |
| 462 | + inference_result = self.client.evals.run_inference( |
| 463 | + model="gemini-pro", |
| 464 | + src=mock_df, |
| 465 | + ) |
| 466 | + |
| 467 | + assert "empty_col" not in inference_result.eval_dataset_df.columns |
| 468 | + assert "empty_list_col" not in inference_result.eval_dataset_df.columns |
| 469 | + assert "prompt" in inference_result.eval_dataset_df.columns |
| 470 | + assert "response" in inference_result.eval_dataset_df.columns |
| 471 | + |
392 | 472 | @mock.patch.object(_evals_common, "Models") |
393 | 473 | @mock.patch.object(_evals_utils, "EvalDatasetLoader") |
394 | 474 | def test_inference_with_string_model_success( |
@@ -5995,6 +6075,42 @@ async def test_async_generate_user_scenarios(self): |
5995 | 6075 | self.mock_api_client.async_request.assert_called_once() |
5996 | 6076 |
|
5997 | 6077 |
|
| 6078 | +class TestTransformDataframe: |
| 6079 | + """Unit tests for the _transform_dataframe function.""" |
| 6080 | + |
| 6081 | + def test_transform_dataframe_drops_empty_columns(self): |
| 6082 | + rows = [ |
| 6083 | + { |
| 6084 | + "prompt": "test prompt", |
| 6085 | + "reference": None, |
| 6086 | + "intermediate_events": [], |
| 6087 | + "agent_data": None, |
| 6088 | + "candidate1": "test response", |
| 6089 | + } |
| 6090 | + ] |
| 6091 | + eval_dfs = _evals_common._transform_dataframe(rows) |
| 6092 | + assert len(eval_dfs) == 1 |
| 6093 | + df = eval_dfs[0].eval_dataset_df |
| 6094 | + assert "prompt" in df.columns |
| 6095 | + assert "response" in df.columns |
| 6096 | + assert "reference" not in df.columns |
| 6097 | + assert "intermediate_events" not in df.columns |
| 6098 | + assert "agent_data" not in df.columns |
| 6099 | + |
| 6100 | + def test_transform_dataframe_drops_empty_prompt_and_response(self): |
| 6101 | + rows = [ |
| 6102 | + { |
| 6103 | + "prompt": None, |
| 6104 | + "candidate1": None, |
| 6105 | + } |
| 6106 | + ] |
| 6107 | + eval_dfs = _evals_common._transform_dataframe(rows) |
| 6108 | + assert len(eval_dfs) == 1 |
| 6109 | + df = eval_dfs[0].eval_dataset_df |
| 6110 | + assert "prompt" not in df.columns |
| 6111 | + assert "response" not in df.columns |
| 6112 | + |
| 6113 | + |
5998 | 6114 | class TestConvertRequestToDatasetRow: |
5999 | 6115 | """Unit tests for the _convert_request_to_dataset_row function.""" |
6000 | 6116 |
|
|
0 commit comments