############################################################################
# Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
############################################################################

import pytest

import atf

# (archive-dump keyword, slurmdbd.conf parameter)
purge_types = [
    ("Events", "PurgeEventAfter"),
    ("Jobs", "PurgeJobAfter"),
    ("Reservations", "PurgeResvAfter"),
    ("Steps", "PurgeStepAfter"),
    ("Suspend", "PurgeSuspendAfter"),
    ("TXN", "PurgeTXNAfter"),
    ("Usage", "PurgeUsageAfter"),
]


@pytest.fixture(scope="module", autouse=True)
def setup():
    atf.require_accounting(modify=True)
    for _, cfg_param in purge_types:
        atf.require_config_parameter(cfg_param, "1month", source="slurmdbd")
    atf.require_slurm_running()


# Ticket 24753: Verify that `sacctmgr archive dump` succeeds when a data type
# is given with no duration on the command line. Expected behavior is that
# slurmdbd falls back to the Purge<Type>After value from slurmdbd.conf.
@pytest.mark.xfail(
    atf.get_version("sbin/slurmdbd") < (26, 5),
    reason="Ticket 24753: 'sacctmgr archive dump' failed without duration before 26.05",
)
@pytest.mark.parametrize("keyword,cfg_param", purge_types)
def test_archive_dump_uses_configured_purge(keyword, cfg_param):
    result = atf.run_command(
        f"sacctmgr -i archive dump Directory={atf.module_tmp_path} {keyword}",
        user=atf.properties["slurm-user"],
        fatal=True,
    )
    assert result["exit_code"] == 0, (
        f"`archive dump {keyword}` failed without a duration; "
        f"expected fallback to {cfg_param}. stderr={result['stderr']!r}"
    )
    assert "Problem dumping archive" not in result["stderr"], (
        f"slurmdbd reported an archive dump problem for {keyword}: "
        f"{result['stderr']!r}"
    )
