Project

General

Profile

Download (2.45 KB) Statistics
| Branch: | Tag: | Revision:

hydrilla-builder / conftest.py @ 2fc043b3

1
# SPDX-License-Identifier: CC0-1.0
2

    
3
# Copyright (C) 2022 Wojtek Kosior <koszko@koszko.org>
4
#
5
# Available under the terms of Creative Commons Zero v1.0 Universal.
6

    
7
import sys
8
from pathlib import Path
9

    
10
import pytest
11
import pkgutil
12
import importlib
13
from tempfile import TemporaryDirectory
14
from typing import Iterable
15

    
16
here = Path(__file__).resolve().parent
17
sys.path.insert(0, str(here / 'src'))
18

    
19
@pytest.fixture(autouse=True)
20
def no_requests(monkeypatch):
21
    """Remove requests.sessions.Session.request for all tests."""
22
    if importlib.util.find_spec("requests") is not None:
23
        monkeypatch.delattr('requests.sessions.Session.request')
24

    
25
@pytest.fixture
26
def mock_subprocess_run(monkeypatch, request):
27
    """
28
    Temporarily replace subprocess.run() with a function supplied through pytest
29
    marker 'subprocess_run'.
30

    
31
    The marker excepts 2 arguments:
32
    * the module inside which the subprocess attribute should be mocked and
33
    * a run() function to use.
34
    """
35
    where, mocked_run = request.node.get_closest_marker('subprocess_run').args
36

    
37
    class MockedSubprocess:
38
        """Minimal mocked version of the subprocess module."""
39
        run = mocked_run
40

    
41
    monkeypatch.setattr(where, 'subprocess', MockedSubprocess)
42

    
43
@pytest.fixture(autouse=True)
44
def no_gettext(monkeypatch, request):
45
    """
46
    Make gettext return all strings untranslated unless we request otherwise.
47
    """
48
    if request.node.get_closest_marker('enable_gettext'):
49
        return
50

    
51
    import hydrilla
52
    modules_to_process = [hydrilla]
53

    
54
    def add_child_modules(parent):
55
        """
56
        Recursuvely collect all modules descending from 'parent' into an array.
57
        """
58
        try:
59
            load_paths = parent.__path__
60
        except AttributeError:
61
            return
62

    
63
        for module_info in pkgutil.iter_modules(load_paths):
64
            if module_info.name != '__main__':
65
                __import__(f'{parent.__name__}.{module_info.name}')
66
                modules_to_process.append(getattr(parent, module_info.name))
67
                add_child_modules(getattr(parent, module_info.name))
68

    
69
    add_child_modules(hydrilla)
70

    
71
    for module in modules_to_process:
72
        if hasattr(module, '_'):
73
            monkeypatch.setattr(module, '_', lambda message: message)
74

    
75
@pytest.fixture
76
def tmpdir() -> Iterable[Path]:
77
    """
78
    Provide test case with a temporary directory that will be automatically
79
    deleted after the test.
80
    """
81
    with TemporaryDirectory() as tmpdir:
82
        yield Path(tmpdir)
(6-6/9)