def test_compose_run(arrow_compose_path): expected_calls = [ "run --rm conda-cpp", ] compose = DockerCompose(arrow_compose_path) with assert_compose_calls(compose, expected_calls): compose.run('conda-cpp') expected_calls = ["run --rm conda-python"] expected_env = PartialEnv(PYTHON='3.6') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python') compose = DockerCompose(arrow_compose_path, params=dict(PYTHON='3.8')) expected_env = PartialEnv(PYTHON='3.8') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python') compose = DockerCompose(arrow_compose_path, params=dict(PYTHON='3.8')) for command in ["bash", "echo 1"]: expected_calls = [["run", "--rm", "conda-python", command]] expected_env = PartialEnv(PYTHON='3.8') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python', command) expected_calls = [ ("run --rm -e CONTAINER_ENV_VAR_A=a -e CONTAINER_ENV_VAR_B=b " "conda-python") ] compose = DockerCompose(arrow_compose_path) expected_env = PartialEnv(PYTHON='3.6') with assert_compose_calls(compose, expected_calls, env=expected_env): env = collections.OrderedDict([("CONTAINER_ENV_VAR_A", "a"), ("CONTAINER_ENV_VAR_B", "b")]) compose.run('conda-python', env=env)
def test_compose_run(arrow_compose_path): expected_calls = [ format_run("conda-cpp"), ] compose = DockerCompose(arrow_compose_path) with assert_compose_calls(compose, expected_calls): compose.run('conda-cpp') expected_calls = [ format_run("conda-python") ] expected_env = PartialEnv(PYTHON='3.6') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python') compose = DockerCompose(arrow_compose_path, params=dict(PYTHON='3.8')) expected_env = PartialEnv(PYTHON='3.8') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python') compose = DockerCompose(arrow_compose_path, params=dict(PYTHON='3.8')) for command in ["bash", "echo 1"]: expected_calls = [ format_run(["conda-python", command]), ] expected_env = PartialEnv(PYTHON='3.8') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python', command) expected_calls = [ ( format_run("-e CONTAINER_ENV_VAR_A=a -e CONTAINER_ENV_VAR_B=b " "conda-python") ) ] compose = DockerCompose(arrow_compose_path) expected_env = PartialEnv(PYTHON='3.6') with assert_compose_calls(compose, expected_calls, env=expected_env): env = collections.OrderedDict([ ("CONTAINER_ENV_VAR_A", "a"), ("CONTAINER_ENV_VAR_B", "b") ]) compose.run('conda-python', env=env) expected_calls = [ ( format_run("--volume /host/build:/build --volume " "/host/ccache:/ccache:delegated conda-python") ) ] compose = DockerCompose(arrow_compose_path) with assert_compose_calls(compose, expected_calls): volumes = ("/host/build:/build", "/host/ccache:/ccache:delegated") compose.run('conda-python', volumes=volumes)
def test_compose_pull_params(arrow_compose_path): expected_calls = [ "pull --ignore-pull-failures conda-cpp", "pull --ignore-pull-failures conda-python", ] compose = DockerCompose(arrow_compose_path, params=dict(UBUNTU='18.04')) expected_env = PartialEnv(PYTHON='3.6', PANDAS='latest') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.pull('conda-python-pandas', pull_leaf=False)
def test_compose_push(arrow_compose_path): compose = DockerCompose(arrow_compose_path, params=dict(PYTHON='3.8')) expected_env = PartialEnv(PYTHON="3.8") expected_calls = [ mock.call(["docker", "login", "-u", "user", "-p", "pass"], check=True), mock.call(["docker-compose", "--file", str(compose.config_path), "push", "conda-python"], check=True, env=expected_env) ] with assert_subprocess_calls(expected_calls): compose.push('conda-python', user='******', password='******')
def test_forwarding_env_variables(arrow_compose_path): expected_calls = [ "pull --ignore-pull-failures conda-cpp", "build conda-cpp", ] expected_env = PartialEnv(MY_CUSTOM_VAR_A='a', MY_CUSTOM_VAR_B='b') with override_env({'MY_CUSTOM_VAR_A': 'a', 'MY_CUSTOM_VAR_B': 'b'}): compose = DockerCompose(arrow_compose_path) with assert_compose_calls(compose, expected_calls, env=expected_env): assert os.environ['MY_CUSTOM_VAR_A'] == 'a' assert os.environ['MY_CUSTOM_VAR_B'] == 'b' compose.build('conda-cpp')
def test_compose_build_params(arrow_compose_path): expected_calls = [ "build ubuntu-cpp", ] compose = DockerCompose(arrow_compose_path, params=dict(UBUNTU='18.04')) expected_env = PartialEnv(UBUNTU="18.04") with assert_compose_calls(compose, expected_calls, env=expected_env): compose.build('ubuntu-cpp') compose = DockerCompose(arrow_compose_path, params=dict(UBUNTU='16.04')) expected_env = PartialEnv(UBUNTU="16.04") with assert_compose_calls(compose, expected_calls, env=expected_env): compose.build('ubuntu-cpp') expected_calls = [ "build --no-cache conda-cpp", "build --no-cache conda-python", "build --no-cache conda-python-pandas", ] compose = DockerCompose(arrow_compose_path, params=dict(UBUNTU='18.04')) expected_env = PartialEnv(PYTHON='3.6', PANDAS='latest') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.build('conda-python-pandas', use_cache=False)
def test_compose_push(arrow_compose_path): compose = DockerCompose(arrow_compose_path, params=dict(PYTHON='3.9')) expected_env = PartialEnv(PYTHON="3.9") expected_calls = [ mock.call(["docker", "login", "-u", "user", "-p", "pass"], check=True), ] for image in ["conda-cpp", "conda-python", "conda-python-pandas"]: expected_calls.append( mock.call([ "docker-compose", "--file", str(compose.config.path), "push", image ], check=True, env=expected_env)) with assert_subprocess_calls(expected_calls): compose.push('conda-python-pandas', user='******', password='******')
def test_assert_subprocess_calls(): expected_calls = ["echo Hello", ["echo", "World"]] with assert_subprocess_calls(expected_calls): subprocess.run(['echo', 'Hello']) subprocess.run(['echo', 'World']) expected_env = PartialEnv(CUSTOM_ENV_A='a', CUSTOM_ENV_C='c') with assert_subprocess_calls(expected_calls, env=expected_env): env = {'CUSTOM_ENV_A': 'a', 'CUSTOM_ENV_B': 'b', 'CUSTOM_ENV_C': 'c'} subprocess.run(['echo', 'Hello'], env=env) subprocess.run(['echo', 'World'], env=env) with pytest.raises(AssertionError): with assert_subprocess_calls(expected_calls, env=expected_env): env = {'CUSTOM_ENV_B': 'b', 'CUSTOM_ENV_C': 'c'} subprocess.run(['echo', 'Hello'], env=env) subprocess.run(['echo', 'World'], env=env)
def test_partial_env(): assert PartialEnv(a=1, b=2) == {'a': 1, 'b': 2, 'c': 3} assert PartialEnv(a=1) == {'a': 1, 'b': 2, 'c': 3} assert PartialEnv(a=1, b=2) == {'a': 1, 'b': 2} assert PartialEnv(a=1, b=2) != {'b': 2, 'c': 3} assert PartialEnv(a=1, b=2) != {'a': 1, 'c': 3}