summaryrefslogtreecommitdiffstats
path: root/packages/meshbay-node/tests/test_imports_resolve.py
blob: 2d6610b8593a3766a75efa18f98bfbedf8de9e70 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
"""
Every `from meshbay_… import NAME` in the node's source names something that
exists — including the imports inside function bodies, which nothing loads
until that function runs.

When code moves between modules, an import at the top of a file breaks at
once, and loudly. One inside a function breaks the first time somebody clicks
the button that calls it: the Peers tab answered 500 that way after
`_get_remote_ip` left `webrtc_server.py`.
"""

import ast
import importlib
from pathlib import Path

SRC = Path(__file__).resolve().parents[1] / "src"


def test_every_import_in_the_node_names_something_that_exists():
    missing, checked = [], 0
    for path in sorted(SRC.rglob("*.py")):
        tree = ast.parse(path.read_text(encoding="utf-8"))
        for node in ast.walk(tree):
            if not (isinstance(node, ast.ImportFrom) and node.level == 0
                    and node.module and node.module.startswith("meshbay_")):
                continue
            module = importlib.import_module(node.module)
            for alias in node.names:
                checked += 1
                if alias.name == "*" or hasattr(module, alias.name):
                    continue
                try:
                    importlib.import_module(f"{node.module}.{alias.name}")
                except ImportError:
                    missing.append(f"{path.relative_to(SRC)}:{node.lineno} "
                                   f"{node.module}.{alias.name}")
    assert checked > 300, "the walk found almost nothing to check"
    assert not missing, "imports of names that do not exist:\n" + "\n".join(missing)