Support patching source code (#19561)
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
"""Shared fixtures for source_patcher tests.
|
||||
|
||||
The sample module is defined as an inline string and written to a temp file
|
||||
at test time, avoiding CI complaints about fixture files without test registration.
|
||||
"""
|
||||
|
||||
import importlib.util
|
||||
import sys
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
from types import ModuleType
|
||||
|
||||
import pytest
|
||||
|
||||
SAMPLE_MODULE_NAME = "_source_patcher_test_fixtures.sample_module"
|
||||
|
||||
SAMPLE_MODULE_SOURCE = '''\
|
||||
GLOBAL_VAR = "global_value"
|
||||
|
||||
|
||||
class HelperClass:
|
||||
"""Utility class referenced by SampleClass to test cross-class calls."""
|
||||
|
||||
@staticmethod
|
||||
def format_value(value: str) -> str:
|
||||
return f"[{value}]"
|
||||
|
||||
|
||||
class SampleClass:
|
||||
def greet(self, name: str) -> str:
|
||||
greeting = f"hello {name}"
|
||||
return greeting
|
||||
|
||||
def compute(self, x: int) -> int:
|
||||
result = x * 2 + 1
|
||||
return result
|
||||
|
||||
def uses_global(self) -> str:
|
||||
return f"value={GLOBAL_VAR}"
|
||||
|
||||
def uses_helper(self, value: str) -> str:
|
||||
return HelperClass.format_value(value)
|
||||
|
||||
|
||||
def standalone_function(a: int, b: int) -> int:
|
||||
return a + b
|
||||
'''
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def sample_module() -> ModuleType:
|
||||
"""Load the sample module from a temp file and register it in sys.modules."""
|
||||
if SAMPLE_MODULE_NAME in sys.modules:
|
||||
return sys.modules[SAMPLE_MODULE_NAME]
|
||||
|
||||
tmpdir = tempfile.mkdtemp(prefix="source_patcher_fixtures_")
|
||||
module_path = Path(tmpdir) / "sample_module.py"
|
||||
module_path.write_text(SAMPLE_MODULE_SOURCE)
|
||||
|
||||
spec = importlib.util.spec_from_file_location(SAMPLE_MODULE_NAME, module_path)
|
||||
assert spec is not None
|
||||
assert spec.loader is not None
|
||||
module = importlib.util.module_from_spec(spec)
|
||||
sys.modules[SAMPLE_MODULE_NAME] = module
|
||||
spec.loader.exec_module(module)
|
||||
return module
|
||||
Reference in New Issue
Block a user