Example #1
0
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,
        )
Example #2
0
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,
        )
Example #3
0
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]]
    )
Example #4
0
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()