def test_search_runs_client_error(mocker): mock_client = mocker.Mock() mock_client.query_runs.side_effect = HttpError(mocker.Mock(), "Dummy client error.") mocker.patch("faculty.client", return_value=mock_client) mocker.patch("mlflow_faculty.tracking.build_search_runs_filter") store = FacultyRestStore(STORE_URI) with pytest.raises(MlflowException, match="Dummy client error."): store._search_runs( [1, 2, 3], filter_string=None, run_view_type=None, max_results=None, order_by=None, page_token=None, )
def test_search_runs_invalid_filter_conditions(mocker): mocker.patch("faculty.client") mocker.patch( "mlflow_faculty.tracking.build_search_runs_filter", side_effect=ValueError("Mock error message"), ) store = FacultyRestStore(STORE_URI) with pytest.raises(MlflowException, match="Mock error message"): store._search_runs( experiment_ids=None, filter_string=None, run_view_type=None, max_results=None, order_by=None, page_token=None, )
def test_search_runs(mocker, max_results): mock_faculty_runs = [mocker.Mock() for _ in range(4)] run_page_1 = ListExperimentRunsResponse( runs=mock_faculty_runs[:2], pagination=mocker.Mock(next=Page(start=2, limit=2)), ) run_page_2 = ListExperimentRunsResponse( runs=mock_faculty_runs[2:], pagination=mocker.Mock(next=None) ) mock_client = mocker.Mock() mock_client.query_runs.side_effect = [run_page_1, run_page_2] mocker.patch("faculty.client", return_value=mock_client) experiment_ids = mocker.Mock() filter_string = mocker.Mock() run_view_type = mocker.Mock() mock_filter = mocker.Mock() build_filter_mock = mocker.patch( "mlflow_faculty.tracking.build_search_runs_filter", return_value=mock_filter, ) mock_mlflow_runs = [mocker.Mock() for _ in range(4)] run_converter_mock = mocker.patch( "mlflow_faculty.tracking.faculty_run_to_mlflow_run", side_effect=mock_mlflow_runs, ) store = FacultyRestStore(STORE_URI) runs, page_token = store._search_runs( experiment_ids, filter_string, run_view_type, max_results, order_by=None, page_token=None, ) assert runs == mock_mlflow_runs[:max_results] assert page_token is None build_filter_mock.assert_called_once_with( experiment_ids, filter_string, run_view_type ) mock_client.query_runs.assert_has_calls( [ mocker.call(PROJECT_ID, mock_filter), mocker.call(PROJECT_ID, mock_filter, start=2, limit=2), ] ) run_converter_mock.assert_has_calls( [mocker.call(run) for run in mock_faculty_runs[:max_results]] )
def test_search_runs_matches_nothing_shortcircuit(mocker): mock_client = mocker.Mock() mocker.patch("faculty.client", return_value=mock_client) mocker.patch( "mlflow_faculty.tracking.build_search_runs_filter", side_effect=MatchesNothing, ) store = FacultyRestStore(STORE_URI) runs, page_token = store._search_runs( experiment_ids=None, filter_string=None, run_view_type=None, max_results=None, order_by=None, page_token=None, ) assert runs == [] assert page_token is None mock_client.query_runs.assert_not_called()