| """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 |
|
|