[7.4.x] Fix import_path for packages (#11395) · pytest-dev/pytest@1de00e9 (original) (raw)

`@@ -18,6 +18,7 @@

`

18

18

`from _pytest.pathlib import get_extended_length_path_str

`

19

19

`from _pytest.pathlib import get_lock_path

`

20

20

`from _pytest.pathlib import import_path

`

``

21

`+

from _pytest.pathlib import ImportMode

`

21

22

`from _pytest.pathlib import ImportPathMismatchError

`

22

23

`from _pytest.pathlib import insert_missing_modules

`

23

24

`from _pytest.pathlib import maybe_delete_a_numbered_dir

`

`@@ -585,6 +586,10 @@ def test_module_name_from_path(self, tmp_path: Path) -> None:

`

585

586

`result = module_name_from_path(Path("/home/foo/test_foo.py"), Path("/bar"))

`

586

587

`assert result == "home.foo.test_foo"

`

587

588

``

``

589

`+

Importing init.py files should return the package as module name.

`

``

590

`+

result = module_name_from_path(tmp_path / "src/app/init.py", tmp_path)

`

``

591

`+

assert result == "src.app"

`

``

592

+

588

593

`def test_insert_missing_modules(

`

589

594

`self, monkeypatch: MonkeyPatch, tmp_path: Path

`

590

595

` ) -> None:

`

`@@ -615,3 +620,43 @@ def test_parent_contains_child_module_attribute(

`

615

620

`assert sorted(modules) == ["xxx", "xxx.tests", "xxx.tests.foo"]

`

616

621

`assert modules["xxx"].tests is modules["xxx.tests"]

`

617

622

`assert modules["xxx.tests"].foo is modules["xxx.tests.foo"]

`

``

623

+

``

624

`+

def test_importlib_package(self, monkeypatch: MonkeyPatch, tmp_path: Path):

`

``

625

`+

"""

`

``

626

`+

Importing a package using --importmode=importlib should not import the

`

``

627

`+

package's init.py file more than once (#11306).

`

``

628

`+

"""

`

``

629

`+

monkeypatch.chdir(tmp_path)

`

``

630

`+

monkeypatch.syspath_prepend(tmp_path)

`

``

631

+

``

632

`+

package_name = "importlib_import_package"

`

``

633

`+

tmp_path.joinpath(package_name).mkdir()

`

``

634

`+

init = tmp_path.joinpath(f"{package_name}/init.py")

`

``

635

`+

init.write_text(

`

``

636

`+

dedent(

`

``

637

`+

"""

`

``

638

`+

from .singleton import Singleton

`

``

639

+

``

640

`+

instance = Singleton()

`

``

641

`+

"""

`

``

642

`+

),

`

``

643

`+

encoding="ascii",

`

``

644

`+

)

`

``

645

`+

singleton = tmp_path.joinpath(f"{package_name}/singleton.py")

`

``

646

`+

singleton.write_text(

`

``

647

`+

dedent(

`

``

648

`+

"""

`

``

649

`+

class Singleton:

`

``

650

`+

INSTANCES = []

`

``

651

+

``

652

`+

def init(self) -> None:

`

``

653

`+

self.INSTANCES.append(self)

`

``

654

`+

if len(self.INSTANCES) > 1:

`

``

655

`+

raise RuntimeError("Already initialized")

`

``

656

`+

"""

`

``

657

`+

),

`

``

658

`+

encoding="ascii",

`

``

659

`+

)

`

``

660

+

``

661

`+

mod = import_path(init, root=tmp_path, mode=ImportMode.importlib)

`

``

662

`+

assert len(mod.instance.INSTANCES) == 1

`