kopia lustrzana https://github.com/jupyterhub/repo2docker
Add test fixture for setting base image
rodzic
f35a948e75
commit
446e67820e
|
@ -100,6 +100,14 @@ def run_repo2docker():
|
||||||
return run_test
|
return run_test
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture()
|
||||||
|
def base_image():
|
||||||
|
"""
|
||||||
|
Base ubuntu image to use when testing specific BuildPacks
|
||||||
|
"""
|
||||||
|
return "buildpack-deps:bionic"
|
||||||
|
|
||||||
|
|
||||||
def _add_content_to_git(repo_dir):
|
def _add_content_to_git(repo_dir):
|
||||||
"""Add content to file 'test' in git repository and commit."""
|
"""Add content to file 'test' in git repository and commit."""
|
||||||
# use append mode so this can be called multiple times
|
# use append mode so this can be called multiple times
|
||||||
|
|
|
@ -6,21 +6,21 @@ from repo2docker import buildpacks
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("binder_dir", ["binder", ".binder", ""])
|
@pytest.mark.parametrize("binder_dir", ["binder", ".binder", ""])
|
||||||
def test_binder_dir(tmpdir, binder_dir):
|
def test_binder_dir(tmpdir, binder_dir, base_image):
|
||||||
tmpdir.chdir()
|
tmpdir.chdir()
|
||||||
if binder_dir:
|
if binder_dir:
|
||||||
os.mkdir(binder_dir)
|
os.mkdir(binder_dir)
|
||||||
|
|
||||||
bp = buildpacks.BuildPack()
|
bp = buildpacks.BuildPack(base_image)
|
||||||
assert binder_dir == bp.binder_dir
|
assert binder_dir == bp.binder_dir
|
||||||
assert bp.binder_path("foo.yaml") == os.path.join(binder_dir, "foo.yaml")
|
assert bp.binder_path("foo.yaml") == os.path.join(binder_dir, "foo.yaml")
|
||||||
|
|
||||||
|
|
||||||
def test_exclusive_binder_dir(tmpdir):
|
def test_exclusive_binder_dir(tmpdir, base_image):
|
||||||
tmpdir.chdir()
|
tmpdir.chdir()
|
||||||
os.mkdir("./binder")
|
os.mkdir("./binder")
|
||||||
os.mkdir("./.binder")
|
os.mkdir("./.binder")
|
||||||
|
|
||||||
bp = buildpacks.BuildPack()
|
bp = buildpacks.BuildPack(base_image)
|
||||||
with pytest.raises(RuntimeError):
|
with pytest.raises(RuntimeError):
|
||||||
_ = bp.binder_dir
|
_ = bp.binder_dir
|
||||||
|
|
|
@ -5,36 +5,37 @@ import pytest
|
||||||
|
|
||||||
from repo2docker.buildpacks import LegacyBinderDockerBuildPack, PythonBuildPack
|
from repo2docker.buildpacks import LegacyBinderDockerBuildPack, PythonBuildPack
|
||||||
from repo2docker.utils import chdir
|
from repo2docker.utils import chdir
|
||||||
|
from tests.conftest import base_image
|
||||||
|
|
||||||
|
|
||||||
def test_legacy_raises():
|
def test_legacy_raises(base_image):
|
||||||
# check legacy buildpack raises on a repo that triggers it
|
# check legacy buildpack raises on a repo that triggers it
|
||||||
with TemporaryDirectory() as repodir:
|
with TemporaryDirectory() as repodir:
|
||||||
with open(pjoin(repodir, "Dockerfile"), "w") as d:
|
with open(pjoin(repodir, "Dockerfile"), "w") as d:
|
||||||
d.write("FROM andrewosh/binder-base")
|
d.write("FROM andrewosh/binder-base")
|
||||||
|
|
||||||
with chdir(repodir):
|
with chdir(repodir):
|
||||||
bp = LegacyBinderDockerBuildPack()
|
bp = LegacyBinderDockerBuildPack(base_image)
|
||||||
with pytest.raises(RuntimeError):
|
with pytest.raises(RuntimeError):
|
||||||
bp.detect()
|
bp.detect()
|
||||||
|
|
||||||
|
|
||||||
def test_legacy_doesnt_detect():
|
def test_legacy_doesnt_detect(base_image):
|
||||||
# check legacy buildpack doesn't trigger
|
# check legacy buildpack doesn't trigger
|
||||||
with TemporaryDirectory() as repodir:
|
with TemporaryDirectory() as repodir:
|
||||||
with open(pjoin(repodir, "Dockerfile"), "w") as d:
|
with open(pjoin(repodir, "Dockerfile"), "w") as d:
|
||||||
d.write("FROM andrewosh/some-image")
|
d.write("FROM andrewosh/some-image")
|
||||||
|
|
||||||
with chdir(repodir):
|
with chdir(repodir):
|
||||||
bp = LegacyBinderDockerBuildPack()
|
bp = LegacyBinderDockerBuildPack(base_image)
|
||||||
assert not bp.detect()
|
assert not bp.detect()
|
||||||
|
|
||||||
|
|
||||||
def test_legacy_on_repo_without_dockerfile():
|
def test_legacy_on_repo_without_dockerfile(base_image):
|
||||||
# check legacy buildpack doesn't trigger on a repo w/o Dockerfile
|
# check legacy buildpack doesn't trigger on a repo w/o Dockerfile
|
||||||
with TemporaryDirectory() as repodir:
|
with TemporaryDirectory() as repodir:
|
||||||
with chdir(repodir):
|
with chdir(repodir):
|
||||||
bp = LegacyBinderDockerBuildPack()
|
bp = LegacyBinderDockerBuildPack(base_image)
|
||||||
assert not bp.detect()
|
assert not bp.detect()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ def test_cache_from_base(tmpdir):
|
||||||
assert called_kwargs["cache_from"] == cache_from
|
assert called_kwargs["cache_from"] == cache_from
|
||||||
|
|
||||||
|
|
||||||
def test_cache_from_docker(tmpdir):
|
def test_cache_from_docker(tmpdir, base_image):
|
||||||
cache_from = ["image-1:latest"]
|
cache_from = ["image-1:latest"]
|
||||||
fake_log_value = {"stream": "fake"}
|
fake_log_value = {"stream": "fake"}
|
||||||
fake_client = MagicMock(spec=docker.APIClient)
|
fake_client = MagicMock(spec=docker.APIClient)
|
||||||
|
@ -42,7 +42,7 @@ def test_cache_from_docker(tmpdir):
|
||||||
with tmpdir.join("Dockerfile").open("w") as f:
|
with tmpdir.join("Dockerfile").open("w") as f:
|
||||||
f.write("FROM scratch\n")
|
f.write("FROM scratch\n")
|
||||||
|
|
||||||
for line in DockerBuildPack().build(
|
for line in DockerBuildPack(base_image).build(
|
||||||
fake_client, "image-2", 100, {}, cache_from, extra_build_kwargs
|
fake_client, "image-2", 100, {}, cache_from, extra_build_kwargs
|
||||||
):
|
):
|
||||||
assert line == fake_log_value
|
assert line == fake_log_value
|
||||||
|
|
|
@ -9,20 +9,20 @@ import pytest
|
||||||
from repo2docker import buildpacks
|
from repo2docker import buildpacks
|
||||||
|
|
||||||
|
|
||||||
def test_empty_env_yml(tmpdir):
|
def test_empty_env_yml(tmpdir, base_image):
|
||||||
tmpdir.chdir()
|
tmpdir.chdir()
|
||||||
p = tmpdir.join("environment.yml")
|
p = tmpdir.join("environment.yml")
|
||||||
p.write("")
|
p.write("")
|
||||||
bp = buildpacks.CondaBuildPack()
|
bp = buildpacks.CondaBuildPack(base_image)
|
||||||
py_ver = bp.python_version
|
py_ver = bp.python_version
|
||||||
# If the environment.yml is empty python_version will get an empty string
|
# If the environment.yml is empty python_version will get an empty string
|
||||||
assert py_ver == ""
|
assert py_ver == ""
|
||||||
|
|
||||||
|
|
||||||
def test_no_dict_env_yml(tmpdir):
|
def test_no_dict_env_yml(tmpdir, base_image):
|
||||||
tmpdir.chdir()
|
tmpdir.chdir()
|
||||||
q = tmpdir.join("environment.yml")
|
q = tmpdir.join("environment.yml")
|
||||||
q.write("numpy\n " "matplotlib\n")
|
q.write("numpy\n " "matplotlib\n")
|
||||||
bq = buildpacks.CondaBuildPack()
|
bq = buildpacks.CondaBuildPack(base_image)
|
||||||
with pytest.raises(TypeError):
|
with pytest.raises(TypeError):
|
||||||
py_ver = bq.python_version
|
py_ver = bq.python_version
|
||||||
|
|
|
@ -12,8 +12,8 @@ from repo2docker.buildpacks import BuildPack
|
||||||
URL = "https://github.com/binderhub-ci-repos/repo2docker-ci-clone-depth"
|
URL = "https://github.com/binderhub-ci-repos/repo2docker-ci-clone-depth"
|
||||||
|
|
||||||
|
|
||||||
def test_buildpack_labels_rendered():
|
def test_buildpack_labels_rendered(base_image):
|
||||||
bp = BuildPack()
|
bp = BuildPack(base_image)
|
||||||
assert "LABEL" not in bp.render()
|
assert "LABEL" not in bp.render()
|
||||||
bp.labels["first_label"] = "firstlabel"
|
bp.labels["first_label"] = "firstlabel"
|
||||||
assert 'LABEL first_label="firstlabel"\n' in bp.render()
|
assert 'LABEL first_label="firstlabel"\n' in bp.render()
|
||||||
|
|
|
@ -48,14 +48,16 @@ def test_memory_limit_enforced(tmpdir):
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("BuildPack", [BaseImage, DockerBuildPack])
|
@pytest.mark.parametrize("BuildPack", [BaseImage, DockerBuildPack])
|
||||||
def test_memlimit_argument_type(BuildPack):
|
def test_memlimit_argument_type(BuildPack, base_image):
|
||||||
# check that an exception is raised when the memory limit isn't an int
|
# check that an exception is raised when the memory limit isn't an int
|
||||||
fake_log_value = {"stream": "fake"}
|
fake_log_value = {"stream": "fake"}
|
||||||
fake_client = MagicMock(spec=docker.APIClient)
|
fake_client = MagicMock(spec=docker.APIClient)
|
||||||
fake_client.build.return_value = iter([fake_log_value])
|
fake_client.build.return_value = iter([fake_log_value])
|
||||||
|
|
||||||
with pytest.raises(ValueError) as exc_info:
|
with pytest.raises(ValueError) as exc_info:
|
||||||
for line in BuildPack().build(fake_client, "image-2", "10Gi", {}, [], {}):
|
for line in BuildPack(base_image).build(
|
||||||
|
fake_client, "image-2", "10Gi", {}, [], {}
|
||||||
|
):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
assert "The memory limit has to be specified as an" in str(exc_info.value)
|
assert "The memory limit has to be specified as an" in str(exc_info.value)
|
||||||
|
|
|
@ -6,7 +6,7 @@ from repo2docker import buildpacks
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("binder_dir", ["", ".binder", "binder"])
|
@pytest.mark.parametrize("binder_dir", ["", ".binder", "binder"])
|
||||||
def test_combine_preassemble_steps(tmpdir, binder_dir):
|
def test_combine_preassemble_steps(tmpdir, binder_dir, base_image):
|
||||||
tmpdir.chdir()
|
tmpdir.chdir()
|
||||||
if binder_dir:
|
if binder_dir:
|
||||||
os.mkdir(binder_dir)
|
os.mkdir(binder_dir)
|
||||||
|
@ -19,7 +19,7 @@ def test_combine_preassemble_steps(tmpdir, binder_dir):
|
||||||
with open(os.path.join(binder_dir, "runtime.txt"), "w") as f:
|
with open(os.path.join(binder_dir, "runtime.txt"), "w") as f:
|
||||||
f.write("r-2019-01-30")
|
f.write("r-2019-01-30")
|
||||||
|
|
||||||
bp = buildpacks.RBuildPack()
|
bp = buildpacks.RBuildPack(base_image)
|
||||||
files = bp.get_preassemble_script_files()
|
files = bp.get_preassemble_script_files()
|
||||||
|
|
||||||
assert len(files) == 2
|
assert len(files) == 2
|
||||||
|
|
|
@ -10,7 +10,7 @@ from repo2docker import buildpacks
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"runtime_version, expected", [("", "4.2"), ("3.6", "3.6"), ("3.5.1", "3.5")]
|
"runtime_version, expected", [("", "4.2"), ("3.6", "3.6"), ("3.5.1", "3.5")]
|
||||||
)
|
)
|
||||||
def test_version_specification(tmpdir, runtime_version, expected):
|
def test_version_specification(tmpdir, runtime_version, expected, base_image):
|
||||||
tmpdir.chdir()
|
tmpdir.chdir()
|
||||||
|
|
||||||
with open("runtime.txt", "w") as f:
|
with open("runtime.txt", "w") as f:
|
||||||
|
@ -18,17 +18,17 @@ def test_version_specification(tmpdir, runtime_version, expected):
|
||||||
runtime_version += "-"
|
runtime_version += "-"
|
||||||
f.write(f"r-{runtime_version}2019-01-01")
|
f.write(f"r-{runtime_version}2019-01-01")
|
||||||
|
|
||||||
r = buildpacks.RBuildPack()
|
r = buildpacks.RBuildPack(base_image)
|
||||||
assert r.r_version.startswith(expected)
|
assert r.r_version.startswith(expected)
|
||||||
|
|
||||||
|
|
||||||
def test_version_completion(tmpdir):
|
def test_version_completion(tmpdir, base_image):
|
||||||
tmpdir.chdir()
|
tmpdir.chdir()
|
||||||
|
|
||||||
with open("runtime.txt", "w") as f:
|
with open("runtime.txt", "w") as f:
|
||||||
f.write(f"r-3.6-2019-01-01")
|
f.write(f"r-3.6-2019-01-01")
|
||||||
|
|
||||||
r = buildpacks.RBuildPack()
|
r = buildpacks.RBuildPack(base_image)
|
||||||
assert r.r_version == "3.6.3"
|
assert r.r_version == "3.6.3"
|
||||||
|
|
||||||
|
|
||||||
|
@ -40,17 +40,17 @@ def test_version_completion(tmpdir):
|
||||||
("r-3.5-2019-01-01", (2019, 1, 1)),
|
("r-3.5-2019-01-01", (2019, 1, 1)),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_mran_date(tmpdir, runtime, expected):
|
def test_mran_date(tmpdir, runtime, expected, base_image):
|
||||||
tmpdir.chdir()
|
tmpdir.chdir()
|
||||||
|
|
||||||
with open("runtime.txt", "w") as f:
|
with open("runtime.txt", "w") as f:
|
||||||
f.write(runtime)
|
f.write(runtime)
|
||||||
|
|
||||||
r = buildpacks.RBuildPack()
|
r = buildpacks.RBuildPack(base_image)
|
||||||
assert r.checkpoint_date == date(*expected)
|
assert r.checkpoint_date == date(*expected)
|
||||||
|
|
||||||
|
|
||||||
def test_snapshot_rspm_date():
|
def test_snapshot_rspm_date(base_image):
|
||||||
test_dates = {
|
test_dates = {
|
||||||
# Even though there is no snapshot specified in the interface at https://packagemanager.rstudio.com/client/#/repos/1/overview
|
# Even though there is no snapshot specified in the interface at https://packagemanager.rstudio.com/client/#/repos/1/overview
|
||||||
# For 2021 Oct 22, the API still returns a valid URL that one can install
|
# For 2021 Oct 22, the API still returns a valid URL that one can install
|
||||||
|
@ -61,7 +61,7 @@ def test_snapshot_rspm_date():
|
||||||
date(2022, 1, 1): date(2022, 1, 1),
|
date(2022, 1, 1): date(2022, 1, 1),
|
||||||
}
|
}
|
||||||
|
|
||||||
r = buildpacks.RBuildPack()
|
r = buildpacks.RBuildPack(base_image)
|
||||||
for requested, expected in test_dates.items():
|
for requested, expected in test_dates.items():
|
||||||
snapshot_url = r.get_rspm_snapshot_url(requested)
|
snapshot_url = r.get_rspm_snapshot_url(requested)
|
||||||
assert snapshot_url.startswith(
|
assert snapshot_url.startswith(
|
||||||
|
@ -75,7 +75,7 @@ def test_snapshot_rspm_date():
|
||||||
|
|
||||||
@pytest.mark.parametrize("expected", [date(2019, 12, 29), date(2019, 12, 26)])
|
@pytest.mark.parametrize("expected", [date(2019, 12, 29), date(2019, 12, 26)])
|
||||||
@pytest.mark.parametrize("requested", [date(2019, 12, 31)])
|
@pytest.mark.parametrize("requested", [date(2019, 12, 31)])
|
||||||
def test_snapshot_mran_date(requested, expected):
|
def test_snapshot_mran_date(requested, expected, base_image):
|
||||||
def mock_request_head(url):
|
def mock_request_head(url):
|
||||||
r = Response()
|
r = Response()
|
||||||
if url == "https://mran.microsoft.com/snapshot/" + expected.isoformat():
|
if url == "https://mran.microsoft.com/snapshot/" + expected.isoformat():
|
||||||
|
@ -86,7 +86,7 @@ def test_snapshot_mran_date(requested, expected):
|
||||||
return r
|
return r
|
||||||
|
|
||||||
with patch("requests.head", side_effect=mock_request_head):
|
with patch("requests.head", side_effect=mock_request_head):
|
||||||
r = buildpacks.RBuildPack()
|
r = buildpacks.RBuildPack(base_image)
|
||||||
assert (
|
assert (
|
||||||
r.get_mran_snapshot_url(requested)
|
r.get_mran_snapshot_url(requested)
|
||||||
== f"https://mran.microsoft.com/snapshot/{expected.isoformat()}"
|
== f"https://mran.microsoft.com/snapshot/{expected.isoformat()}"
|
||||||
|
|
Ładowanie…
Reference in New Issue