Azure / Azure/azure-devops-cli-extension

[Bug] tests import fails due to None being added to sys.path by conftest.py

Open
#1,029 0 comments 0 reactions 0 assignees View on GitHub
Area: ProToCol bug
Dominant language
Python
Stars
682
Forks
278
Avg merge
3d 23h
Merged PRs (30d)
3

Description

**Describe the bug**

Tests fail to run on build machine due to tests/__init__.py calling get_importer(None) from pkg_resources after conftest.py appended None (as returned by azure.cli) to sys.path. Full backtrace and exception:

```
File "/usr/lib/python3.8/runpy.py", line 193, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.8/runpy.py", line 86, in _run_code
exec(code, run_globals)
File "/usr/lib/python3/dist-packages/pytest.py", line 102, in
raise SystemExit(pytest.main())
File "/usr/lib/python3/dist-packages/_pytest/config/__init__.py", line 82, in main
return config.hook.pytest_cmdline_main(config=config)
File "/usr/lib/python3/dist-packages/pluggy/hooks.py", line 286, in __call__
return self._hookexec(self, self.get_hookimpls(), kwargs)
File "/usr/lib/python3/dist-packages/pluggy/manager.py", line 92, in _hookexec
return self._inner_hookexec(hook, methods, kwargs)
File "/usr/lib/python3/dist-packages/pluggy/manager.py", line 83, in
self._inner_hookexec = lambda hook, methods, kwargs: hook.multicall(
File "/usr/lib/python3/dist-packages/pluggy/callers.py", line 187, in _multicall
res = hook_impl.function(*args)
File "/usr/lib/python3/dist-packages/_pytest/main.py", line 243, in pytest_cmdline_main
return wrap_session(config, _main)
File "/usr/lib/python3/dist-packages/_pytest/main.py", line 206, in wrap_session
session.exitstatus = doit(config, session) or 0
File "/usr/lib/python3/dist-packages/_pytest/main.py", line 249, in _main
config.hook.pytest_collection(session=session)
File "/usr/lib/python3/dist-packages/pluggy/hooks.py", line 286, in __call__
return self._hookexec(self, self.get_hookimpls(), kwargs)
File "/usr/lib/python3/dist-packages/pluggy/manager.py", line 92, in _hookexec
return self._inner_hookexec(hook, methods, kwargs)
File "/usr/lib/python3/dist-packages/pluggy/manager.py", line 83, in
self._inner_hookexec = lambda hook, methods, kwargs: hook.multicall(
File "/usr/lib/python3/dist-packages/pluggy/callers.py", line 187, in _multicall
res = hook_impl.function(*args)
File "/usr/lib/python3/dist-packages/_pytest/main.py", line 259, in pytest_collection
return session.perform_collect()
File "/usr/lib/python3/dist-packages/_pytest/main.py", line 495, in perform_collect
items = self._perform_collect(args, genitems)
File "/usr/lib/python3/dist-packages/_pytest/main.py", line 534, in _perform_collect
self.items.extend(self.genitems(node))
File "/usr/lib/python3/dist-packages/_pytest/main.py", line 778, in genitems
for x in self.genitems(subnode):
File "/usr/lib/python3/dist-packages/_pytest/main.py", line 775, in genitems
rep = collect_one_node(node)
File "/usr/lib/python3/dist-packages/_pytest/runner.py", line 371, in collect_one_node
rep = ihook.pytest_make_collect_report(collector=collector)
File "/usr/lib/python3/dist-packages/pluggy/hooks.py", line 286, in __call__
return self._hookexec(self, self.get_hookimpls(), kwargs)
File "/usr/lib/python3/dist-packages/pluggy/manager.py", line 92, in _hookexec
return self._inner_hookexec(hook, methods, kwargs)
File "/usr/lib/python3/dist-packages/pluggy/manager.py", line 83, in
self._inner_hookexec = lambda hook, methods, kwargs: hook.multicall(
File "/usr/lib/python3/dist-packages/pluggy/callers.py", line 187, in _multicall
res = hook_impl.function(*args)
File "/usr/lib/python3/dist-packages/_pytest/runner.py", line 253, in pytest_make_collect_report
call = CallInfo.from_call(lambda: list(collector.collect()), "collect")
File "/usr/lib/python3/dist-packages/_pytest/runner.py", line 226, in from_call
result = func()
File "/usr/lib/python3/dist-packages/_pytest/runner.py", line 253, in
call = CallInfo.from_call(lambda: list(collector.collect()), "collect")
File "/usr/lib/python3/dist-packages/_pytest/python.py", line 443, in collect
self._inject_setup_module_fixture()
File "/usr/lib/python3/dist-packages/_pytest/python.py", line 455, in _inject_setup_module_fixture
setup_module = _get_non_fixture_func(self.obj, "setUpModule")
File "/usr/lib/python3/dist-packages/_pytest/python.py", line 259, in obj
self._obj = obj = self._getobj()
File "/usr/lib/python3/dist-packages/_pytest/python.py", line 440, in _getobj
return self._importtestmodule()
File "/usr/lib/python3/dist-packages/_pytest/python.py", line 507, in _importtestmodule
mod = self.fspath.pyimport(ensuresyspath=importmode)
File "/usr/lib/python3/dist-packages/py/_path/local.py", line 701, in pyimport
__import__(modname)
File "", line 991, in _find_and_load
File "", line 961, in _find_and_load_unlocked
File "", line 219, in _call_with_frames_removed
File "", line 991, in _find_and_load
File "", line 975, in _find_and_load_unlocked
File "", line 671, in _load_unlocked
File "", line 783, in exec_module
File "", line 219, in _call_with_frames_removed
File "/build/azure-devops-cli-extension/tests/__init__.py", line 8, in
__import__('pkg_resources').declare_namespace(__name__)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2284, in declare_namespace
_handle_ns(packageName, path_item)
File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2194, in _handle_ns
importer = get_importer(path_item)

___________________________________ ERROR collecting tests/test_adminBannerTest.py ___________________________________
/usr/lib/python3.8/pkgutil.py:415: in get_importer
importer = sys.path_importer_cache[path_item]
E KeyError: None

During handling of the above exception, another exception occurred:
/usr/lib/python3/dist-packages/py/_path/local.py:701: in pyimport
__import__(modname)
tests/__init__.py:7: in
pkg_resources.declare_namespace(__name__)
/usr/lib/python3/dist-packages/pkg_resources/__init__.py:2290: in declare_namespace
_handle_ns(packageName, path_item)
/usr/lib/python3/dist-packages/pkg_resources/__init__.py:2196: in _handle_ns
importer = get_importer(path_item)
/usr/lib/python3.8/pkgutil.py:419: in get_importer
importer = path_hook(path_item)
:66: in __init__
???
/usr/lib/python3.8/os.py:818: in fsdecode
filename = fspath(filename) # Does type-checking of `filename`.
E TypeError: expected str, bytes or os.PathLike object, not NoneType
```

**To Reproduce**

```$ python3 -m pytest --collect-only --assert plain```

**Additional context**

It looks like azure.cli.core.extension.get_extension_path() can return None in some cases, especially when running tests on build machines.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.