pip/tests/unit/test_direct_url_helpers.py

197 lines
6.6 KiB
Python

from functools import partial
from mock import MagicMock, patch
from pip._internal.models.direct_url import (
DIRECT_URL_METADATA_NAME,
ArchiveInfo,
DirectUrl,
DirInfo,
VcsInfo,
)
from pip._internal.models.link import Link
from pip._internal.utils.direct_url_helpers import (
direct_url_as_pep440_direct_reference,
direct_url_from_link,
dist_get_direct_url,
)
from pip._internal.utils.urls import path_to_url
def test_as_pep440_requirement_archive():
direct_url = DirectUrl(
url="file:///home/user/archive.tgz",
info=ArchiveInfo(),
)
direct_url.validate()
assert (
direct_url_as_pep440_direct_reference(direct_url, "pkg") ==
"pkg @ file:///home/user/archive.tgz"
)
direct_url.subdirectory = "subdir"
direct_url.validate()
assert (
direct_url_as_pep440_direct_reference(direct_url, "pkg") ==
"pkg @ file:///home/user/archive.tgz#subdirectory=subdir"
)
direct_url.info.hash = "sha1=1b8c5bc61a86f377fea47b4276c8c8a5842d2220"
direct_url.validate()
assert (
direct_url_as_pep440_direct_reference(direct_url, "pkg") ==
"pkg @ file:///home/user/archive.tgz"
"#sha1=1b8c5bc61a86f377fea47b4276c8c8a5842d2220&subdirectory=subdir"
)
def test_as_pep440_requirement_dir():
direct_url = DirectUrl(
url="file:///home/user/project",
info=DirInfo(editable=False),
)
direct_url.validate()
assert (
direct_url_as_pep440_direct_reference(direct_url, "pkg") ==
"pkg @ file:///home/user/project"
)
def test_as_pep440_requirement_vcs():
direct_url = DirectUrl(
url="https:///g.c/u/p.git",
info=VcsInfo(
vcs="git", commit_id="1b8c5bc61a86f377fea47b4276c8c8a5842d2220"
)
)
direct_url.validate()
assert (
direct_url_as_pep440_direct_reference(direct_url, "pkg") ==
"pkg @ git+https:///g.c/u/p.git"
"@1b8c5bc61a86f377fea47b4276c8c8a5842d2220"
)
direct_url.subdirectory = "subdir"
direct_url.validate()
assert (
direct_url_as_pep440_direct_reference(direct_url, "pkg") ==
"pkg @ git+https:///g.c/u/p.git"
"@1b8c5bc61a86f377fea47b4276c8c8a5842d2220#subdirectory=subdir"
)
@patch("pip._internal.vcs.git.Git.get_revision")
def test_from_link_vcs(mock_get_backend_for_scheme):
_direct_url_from_link = partial(direct_url_from_link, source_dir="...")
direct_url = _direct_url_from_link(Link("git+https://g.c/u/p.git"))
assert direct_url.url == "https://g.c/u/p.git"
assert isinstance(direct_url.info, VcsInfo)
assert direct_url.info.vcs == "git"
direct_url = _direct_url_from_link(Link("git+https://g.c/u/p.git#egg=pkg"))
assert direct_url.url == "https://g.c/u/p.git"
direct_url = _direct_url_from_link(
Link("git+https://g.c/u/p.git#egg=pkg&subdirectory=subdir")
)
assert direct_url.url == "https://g.c/u/p.git"
assert direct_url.subdirectory == "subdir"
direct_url = _direct_url_from_link(Link("git+https://g.c/u/p.git@branch"))
assert direct_url.url == "https://g.c/u/p.git"
assert direct_url.info.requested_revision == "branch"
direct_url = _direct_url_from_link(
Link("git+https://g.c/u/p.git@branch#egg=pkg")
)
assert direct_url.url == "https://g.c/u/p.git"
assert direct_url.info.requested_revision == "branch"
direct_url = _direct_url_from_link(
Link("git+https://token@g.c/u/p.git")
)
assert direct_url.to_dict()["url"] == "https://g.c/u/p.git"
def test_from_link_vcs_with_source_dir_obtains_commit_id(script, tmpdir):
repo_path = tmpdir / 'test-repo'
repo_path.mkdir()
repo_dir = str(repo_path)
script.run('git', 'init', cwd=repo_dir)
(repo_path / "somefile").touch()
script.run('git', 'add', '.', cwd=repo_dir)
script.run('git', 'commit', '-m', 'commit msg', cwd=repo_dir)
commit_id = script.run(
'git', 'rev-parse', 'HEAD', cwd=repo_dir
).stdout.strip()
direct_url = direct_url_from_link(
Link("git+https://g.c/u/p.git"), source_dir=repo_dir
)
assert direct_url.url == "https://g.c/u/p.git"
assert direct_url.info.commit_id == commit_id
def test_from_link_vcs_without_source_dir(script, tmpdir):
direct_url = direct_url_from_link(
Link("git+https://g.c/u/p.git@1"), link_is_in_wheel_cache=True
)
assert direct_url.url == "https://g.c/u/p.git"
assert direct_url.info.commit_id == "1"
def test_from_link_archive():
direct_url = direct_url_from_link(Link("https://g.c/archive.tgz"))
assert direct_url.url == "https://g.c/archive.tgz"
assert isinstance(direct_url.info, ArchiveInfo)
direct_url = direct_url_from_link(
Link(
"https://g.c/archive.tgz"
"#sha1=1b8c5bc61a86f377fea47b4276c8c8a5842d2220"
)
)
assert isinstance(direct_url.info, ArchiveInfo)
assert (
direct_url.info.hash == "sha1=1b8c5bc61a86f377fea47b4276c8c8a5842d2220"
)
def test_from_link_dir(tmpdir):
dir_url = path_to_url(tmpdir)
direct_url = direct_url_from_link(Link(dir_url))
assert direct_url.url == dir_url
assert isinstance(direct_url.info, DirInfo)
def test_from_link_hide_user_password():
# Basic test only here, other variants are covered by
# direct_url.redact_url tests.
direct_url = direct_url_from_link(
Link("git+https://user:password@g.c/u/p.git@branch#egg=pkg"),
link_is_in_wheel_cache=True,
)
assert direct_url.to_dict()["url"] == "https://g.c/u/p.git"
direct_url = direct_url_from_link(
Link("git+ssh://git@g.c/u/p.git@branch#egg=pkg"),
link_is_in_wheel_cache=True,
)
assert direct_url.to_dict()["url"] == "ssh://git@g.c/u/p.git"
def test_dist_get_direct_url_no_metadata():
dist = MagicMock()
dist.has_metadata.return_value = False
assert dist_get_direct_url(dist) is None
dist.has_metadata.assert_called()
def test_dist_get_direct_url_bad_metadata():
dist = MagicMock()
dist.has_metadata.return_value = True
dist.get_metadata.return_value = "{}" # invalid direct_url.json
assert dist_get_direct_url(dist) is None
dist.get_metadata.assert_called_with(DIRECT_URL_METADATA_NAME)
def test_dist_get_direct_url_valid_metadata():
dist = MagicMock()
dist.has_metadata.return_value = True
dist.get_metadata.return_value = (
'{"url": "https://e.c/p.tgz", "archive_info": {}}'
)
direct_url = dist_get_direct_url(dist)
dist.get_metadata.assert_called_with(DIRECT_URL_METADATA_NAME)
assert direct_url.url == "https://e.c/p.tgz"
assert isinstance(direct_url.info, ArchiveInfo)