"""Test dumper.apply_source_patches() integration with source_patcher."""

from pathlib import Path
from types import ModuleType

import yaml

from sglang.srt.debug_utils.dumper import DumperConfig, _Dumper
from sglang.test.ci.ci_register import register_cpu_ci

register_cpu_ci(est_time=10, suite="stage-a-test-cpu", nightly=True)

SAMPLE_MODULE_NAME = "_source_patcher_test_fixtures.sample_module"


class TestDumperApplySourcePatches:
    def test_no_config_is_noop(self) -> None:
        config = DumperConfig(source_patcher_config=None)
        d = _Dumper(config=config)
        d.apply_source_patches()

    def test_patches_applied_from_yaml(
        self, sample_module: ModuleType, tmp_path: Path
    ) -> None:
        cls = sample_module.SampleClass
        obj = cls()
        assert obj.greet("world") == "hello world"

        original_code = cls.greet.__code__

        patch_config = {
            "patches": [
                {
                    "target": f"{SAMPLE_MODULE_NAME}.SampleClass.greet",
                    "edits": [
                        {
                            "match": 'greeting = f"hello {name}"',
                            "replacement": 'greeting = f"dumper_patched {name}"',
                        }
                    ],
                }
            ]
        }

        config_path = tmp_path / "patch_config.yaml"
        config_path.write_text(yaml.dump(patch_config))

        config = DumperConfig(source_patcher_config=str(config_path))
        d = _Dumper(config=config)

        try:
            d.apply_source_patches()
            assert obj.greet("world") == "dumper_patched world"
        finally:
            cls.greet.__code__ = original_code

        assert obj.greet("world") == "hello world"
