Azure / Azure/azure-devops-cli-extension
[Bug] tests import fails due to None being added to sys.path by conftest.py
- 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
Assessment
This issue has not been assessed yet.