67 lines
1.7 KiB
Python
67 lines
1.7 KiB
Python
"""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
|