from galaxy.jobs import runners


def test_default_specs():
    # recheck_missing_job_retries is integer >= 0
    params = runners.RunnerParams(
        specs=runners.BaseJobRunner.DEFAULT_SPECS, params=dict(recheck_missing_job_retries="1")
    )
    assert params.recheck_missing_job_retries == 1
    assert params["recheck_missing_job_retries"] == 1

    exception_raised = False
    try:
        runners.RunnerParams(specs=runners.BaseJobRunner.DEFAULT_SPECS, params=dict(recheck_missing_job_retries=-1))
    except Exception:
        exception_raised = True
    assert exception_raised


def test_missing_parameter():
    exception = None
    try:
        runners.RunnerParams(specs={}, params=dict(foo="bar"))
    except Exception as e:
        exception = e
    assert str(exception) == runners.JOB_RUNNER_PARAMETER_UNKNOWN_MESSAGE % "foo"


def test_invalid_parameter():
    exception = None
    try:
        runners.RunnerParams(specs=dict(foo=dict(valid=lambda x: x != "bar", defualt="baz")), params=dict(foo="bar"))
    except Exception as e:
        exception = e
    assert str(exception) == runners.JOB_RUNNER_PARAMETER_VALIDATION_FAILED_MESSAGE % "foo"


def test_map_problem():
    exception = None
    try:
        runners.RunnerParams(specs=dict(foo=dict(map=lambda x: 1 / 0, default="baz")), params=dict(foo="bar"))
    except Exception as e:
        exception = e
    assert str(exception) == runners.JOB_RUNNER_PARAMETER_MAP_PROBLEM_MESSAGE % ("foo", "bar")


def test_param_default():
    runner_params = runners.RunnerParams(specs=dict(foo=dict(default="baz")), params={})
    assert runner_params["foo"] == "baz"
    assert runner_params.foo == "baz"
