@@ -1219,6 +1219,46 @@ def test_foo() -> None:
1219
1219
assert result .ret == 0
1220
1220
1221
1221
1222
+ def test_import_submodule_not_namespace (pytester : Pytester ) -> None :
1223
+ """
1224
+ Regression test for importing a submodule 'foo.bar' while there is a 'bar' directory
1225
+ reachable from sys.path -- ensuring the top-level module does not end up imported as a namespace
1226
+ package.
1227
+
1228
+ #12194
1229
+ https://github.com/pytest-dev/pytest/pull/12208#issuecomment-2056458432
1230
+ """
1231
+ pytester .syspathinsert ()
1232
+ # Create package 'foo' with a submodule 'bar'.
1233
+ pytester .path .joinpath ("foo" ).mkdir ()
1234
+ foo_path = pytester .path .joinpath ("foo/__init__.py" )
1235
+ foo_path .touch ()
1236
+ bar_path = pytester .path .joinpath ("foo/bar.py" )
1237
+ bar_path .touch ()
1238
+ # Create top-level directory in `sys.path` with the same name as that submodule.
1239
+ pytester .path .joinpath ("bar" ).mkdir ()
1240
+
1241
+ # Import `foo`, then `foo.bar`, and check they were imported from the correct location.
1242
+ foo = import_path (
1243
+ foo_path ,
1244
+ mode = ImportMode .importlib ,
1245
+ root = pytester .path ,
1246
+ consider_namespace_packages = False ,
1247
+ )
1248
+ bar = import_path (
1249
+ bar_path ,
1250
+ mode = ImportMode .importlib ,
1251
+ root = pytester .path ,
1252
+ consider_namespace_packages = False ,
1253
+ )
1254
+ assert foo .__name__ == "foo"
1255
+ assert bar .__name__ == "foo.bar"
1256
+ assert foo .__file__ is not None
1257
+ assert bar .__file__ is not None
1258
+ assert Path (foo .__file__ ) == foo_path
1259
+ assert Path (bar .__file__ ) == bar_path
1260
+
1261
+
1222
1262
class TestNamespacePackages :
1223
1263
"""Test import_path support when importing from properly namespace packages."""
1224
1264
0 commit comments