def METHOD_NAME(
    rundb_mock,
    framework_algorithm_functionality_pair: typing.Tuple[str, str],
):
    framework, algorithm_functionality = framework_algorithm_functionality_pair
    # Unpack the framework classes:
    (functions, artifacts_library, metrics_library) = FRAMEWORKS[
        framework
    ]  # type: MLFunctions, ArtifactsLibrary, MetricsLibrary
    # Run training:
    train_run = mlrun.new_function().run(
        artifact_path="./temp2",
        handler=functions.train,
        params={"algorithm_functionality": algorithm_functionality},
    )
    # Run evaluation (on the model that was just trained):
    evaluate_run = mlrun.new_function().run(
        artifact_path="./temp2",
        handler=functions.evaluate,
        params={
            "algorithm_functionality": algorithm_functionality,
            "model_path": train_run.outputs["model"],
        },
    )
    # Print the outputs for manual validation:
    print(json.dumps(evaluate_run.outputs, indent=4))
    # Get assertion parameters:
    algorithm_functionality = AlgorithmFunctionality(algorithm_functionality)
    dummy_model = functions.get_model(algorithm_functionality=algorithm_functionality)
    _, dummy_y = functions.get_dataset(
        algorithm_functionality=algorithm_functionality, for_training=False
    )
    expected_artifacts = [
        plan
        for plan in artifacts_library.get_plans(model=dummy_model, y=dummy_y)
        if not (
            # Count only pre and post prediction artifacts (evaluation artifacts).
            plan.is_ready(stage=MLPlanStages.POST_FIT, is_probabilities=False)
            or plan.is_ready(stage=MLPlanStages.PRE_FIT, is_probabilities=False)
        )
    ]
    expected_results = metrics_library.get_metrics(model=dummy_model, y=dummy_y)
    # Validate artifacts:
    assert len(evaluate_run.status.artifacts) == len(expected_artifacts)
    # Validate results:
    assert len(evaluate_run.status.results) == len(expected_results)