# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# For details: https://github.com/pylint-dev/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/pylint-dev/pylint/blob/main/CONTRIBUTORS.txt

import unittest.mock
from pathlib import Path, PosixPath

import pytest

from pylint.constants import full_version
from pylint.lint.utils import get_fatal_error_message, prepare_crash_report
from pylint.testutils._run import _Run as Run


def test_prepare_crash_report(tmp_path: PosixPath) -> None:
    exception_content = "Exmessage"
    python_file = tmp_path / "myfile.py"
    python_content = "from shadok import MagicFaucet"
    with open(python_file, "w", encoding="utf8") as f:
        f.write(python_content)
    template_path = None
    try:
        raise ValueError(exception_content)
    except ValueError as ex:
        template_path = prepare_crash_report(
            ex, str(python_file), str(tmp_path / "pylint-crash-%Y.txt")
        )
    assert str(tmp_path) in str(template_path)
    with open(template_path, encoding="utf8") as f:
        template_content = f.read()
    assert python_content in template_content
    assert exception_content in template_content
    assert "in test_prepare_crash_report" in template_content
    assert "raise ValueError(exception_content)" in template_content
    assert "<details open>" in template_content
    assert full_version in template_content


def test_get_fatal_error_message() -> None:
    python_path = "mypath.py"
    crash_path = "crash.txt"
    msg = get_fatal_error_message(python_path, Path(crash_path))
    assert python_path in msg
    assert crash_path in msg
    assert "open an issue" in msg


def test_issue_template_on_fatal_errors(capsys: pytest.CaptureFixture) -> None:
    """Test that we also create an issue template if the offending exception isn't from astroid."""
    with pytest.raises(SystemExit):
        with unittest.mock.patch(
            "astroid.MANAGER.ast_from_file", side_effect=RecursionError()
        ):
            Run([__file__])
    captured = capsys.readouterr()
    assert "Fatal error while checking" in captured.out
    assert "Please open an issue" in captured.out
    assert "Traceback" in captured.err
