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

import atf

# import re
# import time

pytestmark = pytest.mark.slow


@pytest.fixture(scope="module", autouse=True)
def setup():
    atf.require_auto_config("wants to change the partition state")
    atf.require_slurm_running()


@pytest.fixture(scope="module")
def default_partition():
    """Determine the default partition"""
    return atf.default_partition()


def test_partition_up(default_partition):
    """Verify that a job will run in an UP partition"""

    partitions_dict = atf.get_partitions()
    assert partitions_dict[default_partition]["State"] == "UP"
    assert atf.run_job_exit(f"-p {default_partition} -N1 true") == 0


def test_partition_down(default_partition):
    """Verify that a job will not run in a DOWN partition"""

    atf.run_command(
        f"scontrol update PartitionName={default_partition} State=DOWN",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    partitions_dict = atf.get_partitions()
    assert partitions_dict[default_partition]["State"] == "DOWN"
    assert atf.run_job_exit(f"-p {default_partition} -N1 true") != 0
