############################################################################
# Copyright (C) SchedMD LLC.
############################################################################
import re

import pytest

import atf


# Setup
@pytest.fixture(scope="module", autouse=True)
def setup():
    atf.require_config_parameter("AccountingStorageType", None)
    atf.require_config_parameter_excludes("AccountingStorageEnforce", "associations")
    atf.require_slurm_running()


def test_account():
    """Test of job account (--account option)."""

    my_acct = "MY_ACCT"
    qa_acct = "QA_ACCT"
    job_id = atf.submit_job_sbatch(
        f'--account={my_acct} --wrap="sleep 5"', env_vars=f"SLURM_ACCOUNT={qa_acct}"
    )
    assert job_id != 0, "Batch submit failure"
    output = atf.run_command_output(f"scontrol show job {job_id}")
    assert re.search(
        rf"Account={my_acct.lower()}", output
    ), "Account information not processed from sbatch"

    file_in = atf.module_tmp_path / "file_in"
    atf.make_bash_script(file_in, """env | grep SLURM_ACCOUNT""")
    result = atf.run_job(f"-v {file_in}", env_vars=f"SLURM_ACCOUNT={qa_acct}")
    job_id = re.search(r"jobid (\d+)", result["stderr"]).group(1)
    assert (
        re.search(rf"SLURM_ACCOUNT={qa_acct}", result["stdout"]) is not None
    ), "Account information not processed in srun from env var"
    output = atf.run_command_output(f"scontrol show job {job_id}")
    assert (
        re.search(rf"Account={qa_acct.lower()}", output) is not None
    ), "Account information not processed from env var in scontrol"
