"""Coverage for the persona-aware path resolver + placement validator."""
from __future__ import annotations

import pytest

from decnet.canary.paths import (
    DEFAULT_LINUX_USER,
    DEFAULT_WINDOWS_USER,
    default_path_for,
    default_user,
    normalize_placement,
)


def test_default_user_dispatch() -> None:
    assert default_user("linux") == DEFAULT_LINUX_USER
    assert default_user("windows") == DEFAULT_WINDOWS_USER
    # Unknown personas fall through to Linux — better to plant than fail.
    assert default_user("aix") == DEFAULT_LINUX_USER


@pytest.mark.parametrize(
    "generator, persona, expected_substr",
    [
        ("aws_creds", "linux", "/home/admin/.aws/credentials"),
        ("aws_creds", "windows", "/home/Administrator/.aws/credentials"),
        ("env_file", "linux", "/home/admin/.env"),
        ("env_file", "windows", "/home/Administrator/Desktop/prod.env"),
        ("git_config", "linux", "/home/admin/.git/config"),
        ("ssh_key", "linux", "/home/admin/.ssh/id_rsa"),
        ("honeydoc", "linux", "/home/admin/Documents/quarterly_report.html"),
        ("honeydoc_docx", "linux", "/home/admin/Documents/quarterly_report.docx"),
        ("honeydoc_pdf", "linux", "/home/admin/Documents/quarterly_report.pdf"),
    ],
)
def test_default_path_for_known_generators(
    generator: str, persona: str, expected_substr: str,
) -> None:
    assert default_path_for(generator, persona) == expected_substr


def test_default_path_for_unknown_generator_falls_through() -> None:
    # Unknown generator — defensive /tmp drop. The API rejects unknowns
    # upstream, but the resolver shouldn't crash if one slips through.
    assert default_path_for("bogus") == "/tmp/bogus.canary"


def test_normalize_placement_accepts_clean_paths() -> None:
    assert normalize_placement("/home/admin/.env") == "/home/admin/.env"
    assert normalize_placement("/var/lib/x") == "/var/lib/x"


@pytest.mark.parametrize(
    "bad",
    [
        "",
        "relative/path",
        "./still-relative",
        "/path/with\x00nul",
        "/path/with\nnewline",
        "/path/with\rcr",
        "/path/../escape",
        "/trailing/..",
    ],
)
def test_normalize_placement_rejects_bad(bad: str) -> None:
    with pytest.raises(ValueError):
        normalize_placement(bad)
