Skip to content
Snippets Groups Projects
Commit 1a818dbe authored by David Douard's avatar David Douard
Browse files

Move mock_import_module and mock_get_entry_points in pytest_plugin

It makes them more eaily usable.
parent 6ae5c066
No related branches found
No related tags found
1 merge request!397cli: add a new 'backend' cli group to list and document backends
......@@ -3,9 +3,7 @@
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information
from importlib import import_module
import os
from pathlib import Path
from click.testing import CliRunner
from hypothesis import HealthCheck
......@@ -38,67 +36,3 @@ postgresql_proc = factories.postgresql_proc(
@pytest.fixture
def cli_runner():
return CliRunner()
@pytest.fixture()
def mock_import_module(request, mocker, datadir):
mock = mocker.MagicMock
def import_module_mocker(name, package=None):
if not name.startswith("swh.test"):
return import_module(name, package)
m = request.node.get_closest_marker("init_version")
if m:
version = m.kwargs.get("version", 1)
else:
version = 3
if name.startswith("swh."):
name = name[4:]
modpath = name.split(".")
def get_datastore(*args, **kw):
return mock(current_version=version)
return mock(
__name__=name.split(".")[-1],
__file__=os.path.join(datadir, *modpath, "__init__.py"),
get_datastore=get_datastore,
)
return mocker.patch("swh.core.db.db_utils.import_module", import_module_mocker)
@pytest.fixture()
def mock_get_entry_points(request, mocker, datadir, mock_import_module):
mock = mocker.MagicMock
def get_entry_points_mocker(group):
m = request.node.get_closest_marker("init_version")
if m:
version = m.kwargs.get("version", 1)
else:
version = 3
class EntryPoints(dict):
def __iter__(self):
return iter(self.values())
entrypoints = EntryPoints()
for entry in (Path(datadir) / "test").iterdir():
if entry.is_dir():
ep = mock(
module=f"swh.test.{entry.name}",
load=lambda: mock(current_version=version),
)
# needed to overwrite the Mock's name argument, see
# https://docs.python.org/3/library/unittest.mock.html#mock-names-and-the-name-attribute
ep.name = entry.name
entrypoints[entry.name] = ep
return entrypoints
return mocker.patch("swh.core.config.get_entry_points", get_entry_points_mocker)
# for bw compat
mock_get_swh_backend_module = mock_get_entry_points
......@@ -5,8 +5,10 @@
from collections import deque
from functools import partial
from importlib import import_module
import logging
from os import path
from pathlib import Path
import re
from typing import Dict, List, Optional
from urllib.parse import unquote, urlparse
......@@ -418,3 +420,73 @@ def clean_scopes():
scope._global_scope = None
scope._isolation_scope.set(None)
scope._current_scope.set(None)
@pytest.fixture()
def mock_import_module(request, mocker, datadir):
mock = mocker.MagicMock
def import_module_mocker(name, package=None):
if not name.startswith("swh.test"):
return import_module(name, package)
m = request.node.get_closest_marker("init_version")
if m:
version = m.kwargs.get("version", 1)
else:
version = 3
if name.startswith("swh."):
name = name[4:]
modpath = name.split(".")
def get_datastore(*args, **kw):
return mock(current_version=version)
return mock(
__name__=name.split(".")[-1],
__file__=str(Path(datadir, *modpath, "__init__.py")),
get_datastore=get_datastore,
)
return mocker.patch("swh.core.db.db_utils.import_module", import_module_mocker)
@pytest.fixture()
def mock_get_entry_points(request, mocker, datadir, mock_import_module):
mock = mocker.MagicMock
def get_entry_points_mocker(group):
m = request.node.get_closest_marker("init_version")
if m:
version = m.kwargs.get("version", 1)
else:
version = 3
class EntryPoints(dict):
def __iter__(self):
return iter(self.values())
package = group[4:-8] # remove 'swh.' and '.classes'
entrypoints = EntryPoints()
pkgdir = Path(datadir) / package
if pkgdir.is_dir():
for entry in pkgdir.iterdir():
if entry.is_dir():
ep = mock(
module=f"swh.{package}.{entry.name}",
load=lambda: mock(
current_version=version,
__doc__="A mockup backend for tests",
),
)
# needed to overwrite the Mock's name argument, see
# https://docs.python.org/3/library/unittest.mock.html#mock-names-and-the-name-attribute
ep.name = entry.name
entrypoints[entry.name] = ep
return entrypoints
return mocker.patch("swh.core.config.get_entry_points", get_entry_points_mocker)
# for bw compat
mock_get_swh_backend_module = mock_get_entry_points
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment