Refactor micromamba test_actiavation to use isolated fixtures

This commit is contained in:
AntoinePrv 2022-09-05 11:51:10 +02:00
parent 613328af41
commit 241c5f4f0e
2 changed files with 208 additions and 295 deletions

View File

@ -1,23 +1,13 @@
import os
import pathlib
import random
import shutil
import string
from typing import Generator
import pytest
def random_str(n: int = 10) -> str:
"""Return random characters and digits."""
return "".join(random.choices(string.ascii_uppercase + string.digits, k=n))
@pytest.fixture(params=[random_str, "some ™∞¢3 spaces §∞©ƒ√≈ç", "long_prefix_" * 20])
def tmp_env_name(request) -> str:
"""Return the explicit or implicit parametrization."""
if callable(request.param):
return request.param()
return request.param
from . import helpers
@pytest.fixture
@ -39,8 +29,72 @@ def tmp_home(tmp_path: pathlib.Path) -> Generator[pathlib.Path, None, None]:
yield pathlib.Path.home()
@pytest.fixture(scope="session")
def tmp_pkgs_dirs(tmp_path_factory: pytest.TempPathFactory) -> pathlib.Path:
"""A common package cache for mamba downloads.
The directory is not used automatically when calling this fixture.
"""
return tmp_path_factory.mktemp("pkgs_dirs")
@pytest.fixture(params=[False])
def shared_pkgs_dirs(request) -> bool:
"""A dummy fixture to control the use of shared package dir."""
return request.param
@pytest.fixture
def tmp_root_prefix(tmp_path: pathlib.Path) -> Generator[pathlib.Path, None, None]:
def tmp_clean_env(
tmp_pkgs_dirs: pathlib.Path, shared_pkgs_dirs: bool
) -> Generator[None, None, None]:
"""Remove all Conda/Mamba activation artifacts from environment."""
saved_environ = {}
for k, v in os.environ.items():
if k.startswith(("CONDA", "_CONDA", "MAMBA", "_MAMBA")):
saved_environ[k] = v
del os.environ[k]
def keep_in_path(
p: str, prefix: str | None = saved_environ.get("CONDA_PREFIX")
) -> bool:
if "condabin" in p:
return False
if prefix is not None:
p = str(pathlib.Path(p).expanduser().resolve())
prefix = str(pathlib.Path(prefix).expanduser().resolve())
return not p.startswith(prefix)
return True
path_list = os.environ["PATH"].split(os.pathsep)
path_list = [p for p in path_list if keep_in_path(p)]
os.environ["PATH"] = os.pathsep.join(path_list)
if shared_pkgs_dirs:
os.environ["CONDA_PKGS_DIRS"] = str(tmp_pkgs_dirs)
yield None
os.environ.update(saved_environ)
def random_str(n: int = 10) -> str:
"""Return random characters and digits."""
return "".join(random.choices(string.ascii_uppercase + string.digits, k=n))
@pytest.fixture(params=[random_str, "some ™∞¢3 spaces §∞©ƒ√≈ç", "long_prefix_" * 20])
def tmp_env_name(request) -> str:
"""Return the explicit or implicit parametrization."""
if callable(request.param):
return request.param()
return request.param
@pytest.fixture
def tmp_root_prefix(
tmp_path: pathlib.Path, tmp_clean_env: None
) -> Generator[pathlib.Path, None, None]:
"""Change the micromamba root directory to a tmp folder for the duration of a test."""
old_root_prefix = os.environ.get("MAMBA_ROOT_PREFIX")
new_root_prefix = tmp_path / "mamba"
@ -53,6 +107,15 @@ def tmp_root_prefix(tmp_path: pathlib.Path) -> Generator[pathlib.Path, None, Non
del os.environ["MAMBA_ROOT_PREFIX"]
@pytest.fixture
def tmp_empty_env(
tmp_root_prefix: pathlib.Path, tmp_env_name: str
) -> Generator[pathlib.Path, None, None]:
"""An empty envirnment created under a temporary root prefix."""
helpers.create("-n", tmp_env_name, no_dry_run=True)
yield tmp_root_prefix
@pytest.fixture
def tmp_prefix(
tmp_root_prefix: pathlib.Path, tmp_env_name: str

View File

@ -25,29 +25,6 @@ elif platform.system() == "Windows":
running_os = "win"
@pytest.fixture
def keep_cache(existing_cache):
yield True
@pytest.fixture
def clean_env(keep_cache):
clean_env = os.environ.copy()
clean_env = {
k: v
for k, v in clean_env.items()
if not k.startswith(("CONDA", "MAMBA"))
or (k == "CONDA_PKGS_DIRS" and keep_cache)
}
path = clean_env.get("PATH")
elems = path.split(os.pathsep)
elems = [e for e in elems if not "condabin" in e]
clean_env["PATH"] = os.pathsep.join(elems)
yield clean_env
suffixes = {
"cmd.exe": ".bat",
"bash": ".sh",
@ -137,42 +114,9 @@ regkey = "HKEY_CURRENT_USER\\Software\\Microsoft\\Command Processor\\AutoRun"
bkup_winreg_value = None
@pytest.fixture
def clean_shell_files():
global bkup_winreg_value
for f in shell_files:
if f.exists():
f_bkup = Path(str(f) + ".mamba_test_backup")
if f_bkup.exists():
f_bkup.unlink()
f.rename(f_bkup)
f.touch()
if plat == "win":
try:
regvalue = read_windows_registry(regkey)
bkup_winreg_value = regvalue
except:
print("Could not read registry value")
regvalue = ("", 1)
print("setting registry to ", regvalue[1])
write_windows_registry(regkey, "", regvalue[1])
yield shell_files
for f in shell_files:
f_bkup = Path(str(f) + ".mamba_test_backup")
if f_bkup.exists():
if f.exists():
f.unlink()
f_bkup.rename(str(f_bkup)[: -len(".mamba_test_backup")])
if plat == "win":
print("setting registry to ", regvalue[0], regvalue[1])
write_windows_registry(regkey, regvalue[0], regvalue[1])
def find_path_in_str(p, s):
if isinstance(p, Path):
p = str(p)
if p in s:
return True
if p.replace("\\", "\\\\") in s:
@ -293,47 +237,6 @@ def shvar(v, interpreter):
class TestActivation:
current_root_prefix = os.environ["MAMBA_ROOT_PREFIX"]
current_prefix = os.environ["CONDA_PREFIX"]
env_name = random_string()
root_prefix = os.path.expanduser(os.path.join("~", "tmproot" + random_string()))
other_root_prefix = os.path.expanduser(
os.path.join("~", "tmproot" + random_string())
)
prefix = os.path.join(root_prefix, "envs", env_name)
long_prefix = os.path.join(
root_prefix, *["some_very_long_prefix" for i in range(20)], env_name
)
@staticmethod
@pytest.fixture(scope="class")
def new_root_prefix(existing_cache):
os.environ["MAMBA_ROOT_PREFIX"] = TestActivation.root_prefix
os.environ["CONDA_PREFIX"] = TestActivation.prefix
create("-n", "base", no_dry_run=True)
create("xtensor", "-n", TestActivation.env_name, no_dry_run=True)
yield
os.environ["MAMBA_ROOT_PREFIX"] = TestActivation.current_root_prefix
os.environ["CONDA_PREFIX"] = TestActivation.current_prefix
if os.path.exists(TestActivation.root_prefix):
if platform.system() == "Windows":
p = r"\\?\ ".strip() + TestActivation.root_prefix
else:
p = TestActivation.root_prefix
# shutil.rmtree(p)
if os.path.exists(TestActivation.other_root_prefix):
if platform.system() == "Windows":
p = r"\\?\ ".strip() + TestActivation.other_root_prefix
else:
p = TestActivation.other_root_prefix
# shutil.rmtree(p)
@staticmethod
def to_dict(out, interpreter="bash"):
if interpreter == "cmd.exe":
@ -360,36 +263,39 @@ class TestActivation:
@pytest.mark.parametrize("interpreter", get_interpreters())
def test_shell_init(
self, tmp_path, interpreter, clean_shell_files, new_root_prefix
self,
tmp_home,
tmp_root_prefix,
tmp_path,
interpreter,
):
if interpreter not in valid_interpreters:
pytest.skip(f"{interpreter} not available")
umamba = get_umamba()
env = {"MAMBA_ROOT_PREFIX": self.root_prefix}
call = lambda s: call_interpreter(s, tmp_path, interpreter)
run_dir = tmp_path / "rundir"
run_dir.mkdir()
call = lambda s: call_interpreter(s, run_dir, interpreter)
rpv = shvar("MAMBA_ROOT_PREFIX", interpreter)
s = [f"echo {rpv}"]
stdout, stderr = call(s)
assert stdout == self.root_prefix
assert stdout == str(tmp_root_prefix)
# TODO remove root prefix here
s = [f"{umamba} shell init -p {rpv} {xonsh_shell_args(interpreter)}"]
stdout, stderr = call(s)
if interpreter == "cmd.exe":
value = read_windows_registry(regkey)
assert "mamba_hook.bat" in value[0]
assert find_path_in_str(self.root_prefix, value[0])
assert find_path_in_str(tmp_root_prefix, value[0])
prev_text = value[0]
else:
path = Path(paths[plat][interpreter]).expanduser()
with open(path) as fi:
x = fi.read()
print(x)
assert "micromamba" in x
assert find_path_in_str(self.root_prefix, x)
assert find_path_in_str(tmp_root_prefix, x)
prev_text = x
s = [f"{umamba} shell init -p {rpv} {xonsh_shell_args(interpreter)}"]
@ -398,7 +304,7 @@ class TestActivation:
if interpreter == "cmd.exe":
value = read_windows_registry(regkey)
assert "mamba_hook.bat" in value[0]
assert find_path_in_str(self.root_prefix, value[0])
assert find_path_in_str(tmp_root_prefix, value[0])
assert prev_text == value[0]
assert not "&" in value[0]
else:
@ -414,7 +320,7 @@ class TestActivation:
value = read_windows_registry(regkey)
assert "mamba_hook.bat" in value[0]
assert find_path_in_str(self.root_prefix, value[0])
assert find_path_in_str(tmp_root_prefix, value[0])
assert value[0].startswith("echo 'test' & ")
assert "&" in value[0]
@ -437,53 +343,57 @@ class TestActivation:
assert "mamba" in x
assert text == x
other_root_prefix = tmp_path / "prefix"
other_root_prefix.mkdir()
s = [
f"{umamba} shell init -p {self.other_root_prefix} {xonsh_shell_args(interpreter)}"
f"{umamba} shell init -p {other_root_prefix} {xonsh_shell_args(interpreter)}"
]
stdout, stderr = call(s)
if interpreter == "cmd.exe":
x = read_windows_registry(regkey)[0]
assert "mamba" in x
assert find_path_in_str(self.other_root_prefix, x)
assert not find_path_in_str(self.root_prefix, x)
assert find_path_in_str(other_root_prefix, x)
assert not find_path_in_str(tmp_root_prefix, x)
else:
with open(path) as fi:
x = fi.read()
assert "mamba" in x
assert find_path_in_str(self.other_root_prefix, x)
assert not find_path_in_str(self.root_prefix, x)
assert find_path_in_str(other_root_prefix, x)
assert not find_path_in_str(tmp_root_prefix, x)
@pytest.mark.parametrize("interpreter", get_interpreters())
def test_shell_init_deinit_root_prefix_files(
self, tmp_path, interpreter, clean_shell_files, new_root_prefix
self,
tmp_root_prefix,
tmp_path,
interpreter,
):
if interpreter not in valid_interpreters:
pytest.skip(f"{interpreter} not available")
umamba = get_umamba()
root_prefix_path = Path(self.root_prefix)
if interpreter == "bash" or interpreter == "zsh":
files = [root_prefix_path / "etc" / "profile.d" / "micromamba.sh"]
files = [tmp_root_prefix / "etc" / "profile.d" / "micromamba.sh"]
elif interpreter == "cmd.exe":
files = [
root_prefix_path / "condabin" / "mamba_hook.bat",
root_prefix_path / "condabin" / "micromamba.bat",
root_prefix_path / "condabin" / "_mamba_activate.bat",
root_prefix_path / "condabin" / "activate.bat",
tmp_root_prefix / "condabin" / "mamba_hook.bat",
tmp_root_prefix / "condabin" / "micromamba.bat",
tmp_root_prefix / "condabin" / "_mamba_activate.bat",
tmp_root_prefix / "condabin" / "activate.bat",
]
elif interpreter == "powershell":
files = [
root_prefix_path / "condabin" / "mamba_hook.ps1",
root_prefix_path / "condabin" / "Mamba.psm1",
tmp_root_prefix / "condabin" / "mamba_hook.ps1",
tmp_root_prefix / "condabin" / "Mamba.psm1",
]
elif interpreter == "fish":
files = [root_prefix_path / "etc" / "fish" / "conf.d" / "mamba.fish"]
files = [tmp_root_prefix / "etc" / "fish" / "conf.d" / "mamba.fish"]
elif interpreter == "xonsh":
files = [root_prefix_path / "etc" / "profile.d" / "mamba.xsh"]
files = [tmp_root_prefix / "etc" / "profile.d" / "mamba.xsh"]
elif interpreter in ["csh", "tcsh"]:
files = [root_prefix_path / "etc" / "profile.d" / "micromamba.csh"]
files = [tmp_root_prefix / "etc" / "profile.d" / "micromamba.csh"]
else:
raise ValueError(f"Unknown shell {interpreter}")
@ -491,7 +401,7 @@ class TestActivation:
return call_interpreter(command, tmp_path, interpreter)
s = [
f"{umamba} shell init -p {self.root_prefix} {xonsh_shell_args(interpreter)}"
f"{umamba} shell init -p {tmp_root_prefix} {xonsh_shell_args(interpreter)}"
]
call(s)
@ -499,7 +409,7 @@ class TestActivation:
assert file.exists()
s = [
f"{umamba} shell deinit -p {self.root_prefix} {xonsh_shell_args(interpreter)}"
f"{umamba} shell deinit -p {tmp_root_prefix} {xonsh_shell_args(interpreter)}"
]
call(s)
@ -507,7 +417,10 @@ class TestActivation:
assert not file.exists()
def test_shell_init_deinit_contents_cmdexe(
self, tmp_path, clean_shell_files, new_root_prefix
self,
tmp_home,
tmp_root_prefix,
tmp_path,
):
interpreter = "cmd.exe"
if interpreter not in valid_interpreters:
@ -520,19 +433,19 @@ class TestActivation:
prev_value = read_windows_registry(regkey)
assert "mamba_hook.bat" not in prev_value[0]
assert not find_path_in_str(self.root_prefix, prev_value[0])
assert not find_path_in_str(tmp_root_prefix, prev_value[0])
s = [
f"{umamba} shell init -p {self.root_prefix} {xonsh_shell_args(interpreter)}"
f"{umamba} shell init -p {tmp_root_prefix} {xonsh_shell_args(interpreter)}"
]
call(s)
value_after_init = read_windows_registry(regkey)
assert "mamba_hook.bat" in value_after_init[0]
assert find_path_in_str(self.root_prefix, value_after_init[0])
assert find_path_in_str(tmp_root_prefix, value_after_init[0])
s = [
f"{umamba} shell deinit -p {self.root_prefix} {xonsh_shell_args(interpreter)}"
f"{umamba} shell deinit -p {tmp_root_prefix} {xonsh_shell_args(interpreter)}"
]
call(s)
@ -541,7 +454,11 @@ class TestActivation:
@pytest.mark.parametrize("interpreter", get_interpreters(exclude=["cmd.exe"]))
def test_shell_init_deinit_contents(
self, tmp_path, interpreter, clean_shell_files, new_root_prefix
self,
tmp_home,
tmp_root_prefix,
tmp_path,
interpreter,
):
if interpreter not in valid_interpreters:
pytest.skip(f"{interpreter} not available")
@ -562,10 +479,10 @@ class TestActivation:
assert "#region mamba initialize" not in prev_rc_contents
else:
assert "# >>> mamba initialize >>>" not in prev_rc_contents
assert not find_path_in_str(self.root_prefix, prev_rc_contents)
assert not find_path_in_str(tmp_root_prefix, prev_rc_contents)
s = [
f"{umamba} shell init -p {self.root_prefix} {xonsh_shell_args(interpreter)}"
f"{umamba} shell init -p {tmp_root_prefix} {xonsh_shell_args(interpreter)}"
]
call(s)
@ -575,10 +492,10 @@ class TestActivation:
assert "#region mamba initialize" in rc_contents_after_init
else:
assert "# >>> mamba initialize >>>" in rc_contents_after_init
assert find_path_in_str(self.root_prefix, rc_contents_after_init)
assert find_path_in_str(tmp_root_prefix, rc_contents_after_init)
s = [
f"{umamba} shell deinit -p {self.root_prefix} {xonsh_shell_args(interpreter)}"
f"{umamba} shell deinit -p {tmp_root_prefix} {xonsh_shell_args(interpreter)}"
]
call(s)
@ -590,22 +507,17 @@ class TestActivation:
assert rc_contents_after_deinit == prev_rc_contents
@pytest.mark.parametrize("interpreter", get_interpreters())
def test_activation(
self, tmp_path, interpreter, clean_shell_files, new_root_prefix, clean_env
):
def test_env_activation(self, tmp_home, tmp_root_prefix, tmp_path, interpreter):
if interpreter not in valid_interpreters:
pytest.skip(f"{interpreter} not available")
umamba = get_umamba()
s = [f"{umamba} shell init -p {self.root_prefix}"]
s = [f"{umamba} shell init -p {tmp_root_prefix}"]
stdout, stderr = call_interpreter(s, tmp_path, interpreter)
call = lambda s: call_interpreter(
s, tmp_path, interpreter, interactive=True, env=clean_env
)
call = lambda s: call_interpreter(s, tmp_path, interpreter, interactive=True)
rp = Path(self.root_prefix)
evars = extract_vars(["CONDA_PREFIX", "CONDA_SHLVL", "PATH"], interpreter)
if interpreter == "cmd.exe":
@ -624,20 +536,17 @@ class TestActivation:
res = TestActivation.to_dict(stdout)
assert "condabin" in res["PATH"]
assert self.root_prefix in res["PATH"]
assert f"CONDA_PREFIX={self.root_prefix}" in stdout.splitlines()
assert str(tmp_root_prefix) in res["PATH"]
assert f"CONDA_PREFIX={tmp_root_prefix}" in stdout.splitlines()
assert f"CONDA_SHLVL=1" in stdout.splitlines()
# throw with non-existent
s = ["micromamba activate nonexistent"]
if plat != "win":
with pytest.raises(subprocess.CalledProcessError):
stdout, stderr = call(s)
stdout, stderr = call(["micromamba activate nonexistent"])
s1 = ["micromamba create -n abc -y"]
s2 = ["micromamba create -n xyz -y"]
call(s1)
call(s2)
call(["micromamba create -n abc -y"])
call(["micromamba create -n xyz -y"])
s = [
"micromamba activate",
@ -646,45 +555,10 @@ class TestActivation:
] + evars
stdout, stderr = call(s)
res = TestActivation.to_dict(stdout)
assert find_path_in_str(str(rp / "condabin"), res["PATH"])
assert not find_path_in_str(str(rp / "bin"), res["PATH"])
assert find_path_in_str(str(rp / "envs" / "xyz"), res["PATH"])
assert not find_path_in_str(str(rp / "envs" / "abc"), res["PATH"])
# long paths
s = [
f"micromamba create -p {TestActivation.long_prefix} xtensor six -v -y -c conda-forge"
]
call(s)
assert os.path.exists(TestActivation.long_prefix)
s = [
"micromamba activate",
f"micromamba activate -p {TestActivation.long_prefix}",
] + evars
# currently skipping longprefix _activation_ check with cmd.exe as it fails
# on CI for mysterious reasons
if not (plat == "win" and interpreter == "cmd.exe"):
stdout, stderr = call(s)
res = TestActivation.to_dict(stdout)
assert find_path_in_str(str(rp / "condabin"), res["PATH"])
assert not find_path_in_str(str(rp / "bin"), res["PATH"])
assert find_path_in_str(TestActivation.long_prefix, res["PATH"])
s = [
"micromamba activate",
"micromamba activate abc",
"micromamba activate xyz --stack",
] + evars
stdout, stderr = call(s)
res = TestActivation.to_dict(stdout)
assert find_path_in_str(str(rp / "condabin"), res["PATH"])
assert not find_path_in_str(str(rp / "bin"), res["PATH"])
assert find_path_in_str(str(rp / "envs" / "abc"), res["PATH"])
assert find_path_in_str(str(rp / "envs" / "xyz"), res["PATH"])
assert find_path_in_str(tmp_root_prefix / "condabin", res["PATH"])
assert not find_path_in_str(tmp_root_prefix / "bin", res["PATH"])
assert find_path_in_str(tmp_root_prefix / "envs" / "xyz", res["PATH"])
assert not find_path_in_str(tmp_root_prefix / "envs" / "abc", res["PATH"])
s = [
"micromamba activate",
@ -693,28 +567,37 @@ class TestActivation:
] + evars
stdout, stderr = call(s)
res = TestActivation.to_dict(stdout)
assert find_path_in_str(str(rp / "condabin"), res["PATH"])
assert not find_path_in_str(str(rp / "bin"), res["PATH"])
assert find_path_in_str(str(rp / "envs" / "xyz"), res["PATH"])
assert find_path_in_str(str(rp / "envs" / "abc"), res["PATH"])
assert find_path_in_str(tmp_root_prefix / "condabin", res["PATH"])
assert not find_path_in_str(tmp_root_prefix / "bin", res["PATH"])
assert find_path_in_str(tmp_root_prefix / "envs" / "xyz", res["PATH"])
assert find_path_in_str(tmp_root_prefix / "envs" / "abc", res["PATH"])
stdout, stderr = call(["micromamba deactivate"] + evars)
res = TestActivation.to_dict(stdout)
assert find_path_in_str(tmp_root_prefix / "condabin", res["PATH"])
assert not find_path_in_str(tmp_root_prefix / "bin", res["PATH"])
assert not find_path_in_str(tmp_root_prefix / "envs" / "xyz", res["PATH"])
assert not find_path_in_str(tmp_root_prefix / "envs" / "abc", res["PATH"])
@pytest.mark.parametrize("interpreter", get_interpreters())
def test_activation_envvars(
self, tmp_path, interpreter, clean_shell_files, new_root_prefix, clean_env
self,
tmp_home,
tmp_clean_env,
tmp_root_prefix,
tmp_path,
interpreter,
):
if interpreter not in valid_interpreters:
pytest.skip(f"{interpreter} not available")
umamba = get_umamba()
s = [f"{umamba} shell init -p {self.root_prefix}"]
s = [f"{umamba} shell init -p {tmp_root_prefix}"]
stdout, stderr = call_interpreter(s, tmp_path, interpreter)
call = lambda s: call_interpreter(
s, tmp_path, interpreter, interactive=True, env=clean_env
)
call = lambda s: call_interpreter(s, tmp_path, interpreter, interactive=True)
rp = Path(self.root_prefix)
evars = extract_vars(["CONDA_PREFIX", "CONDA_SHLVL", "PATH"], interpreter)
if interpreter == "cmd.exe":
@ -723,14 +606,9 @@ class TestActivation:
assert fp.exists()
if interpreter in ["bash", "zsh", "powershell", "cmd.exe"]:
print("Creating __def__")
s1 = ["micromamba create -n def -y"]
call(s1)
call(["micromamba create -n def -y"])
s = [
"micromamba activate def",
] + evars
stdout, stderr = call(s)
stdout, stderr = call(["micromamba activate def"] + evars)
res = TestActivation.to_dict(stdout)
abc_prefix = pathlib.Path(res["CONDA_PREFIX"])
@ -751,14 +629,11 @@ class TestActivation:
)
)
s = (
[
"micromamba activate def",
]
stdout, stderr = call(
["micromamba activate def"]
+ evars
+ extract_vars(["TEST", "HELLO", "WORKING", "AAA"], interpreter)
)
stdout, stderr = call(s)
# assert that env vars are in the same order
activation_script, stderr = call(
@ -798,11 +673,8 @@ class TestActivation:
activation_script, stderr = call(
["micromamba shell activate -s bash -n def"]
)
print(activation_script)
s = (
[
"micromamba activate def",
]
stdout, stderr = call(
["micromamba activate def"]
+ evars
+ extract_vars(
[
@ -817,7 +689,6 @@ class TestActivation:
interpreter,
)
)
stdout, stderr = call(s)
res = TestActivation.to_dict(stdout)
assert res["HELLO"] == "world"
@ -829,22 +700,24 @@ class TestActivation:
assert res["TEST"] == "Test"
@pytest.mark.parametrize("interpreter", get_interpreters())
@pytest.mark.parametrize("shared_pkgs_dirs", [True], indirect=True)
def test_unicode_activation(
self, tmp_path, interpreter, clean_shell_files, new_root_prefix, clean_env
self,
tmp_home,
tmp_root_prefix,
tmp_path,
interpreter,
):
if interpreter not in valid_interpreters:
pytest.skip(f"{interpreter} not available")
umamba = get_umamba()
s = [f"{umamba} shell init -p {self.root_prefix}"]
s = [f"{umamba} shell init -p {tmp_root_prefix}"]
stdout, stderr = call_interpreter(s, tmp_path, interpreter)
call = lambda s: call_interpreter(
s, tmp_path, interpreter, interactive=True, env=clean_env
)
call = lambda s: call_interpreter(s, tmp_path, interpreter, interactive=True)
rp = Path(self.root_prefix)
evars = extract_vars(["CONDA_PREFIX", "CONDA_SHLVL", "PATH"], interpreter)
if interpreter == "cmd.exe":
@ -863,8 +736,8 @@ class TestActivation:
res = TestActivation.to_dict(stdout)
assert "condabin" in res["PATH"]
assert self.root_prefix in res["PATH"]
assert f"CONDA_PREFIX={self.root_prefix}" in stdout.splitlines()
assert str(tmp_root_prefix) in res["PATH"]
assert f"CONDA_PREFIX={tmp_root_prefix}" in stdout.splitlines()
assert f"CONDA_SHLVL=1" in stdout.splitlines()
# throw with non-existent
@ -886,32 +759,15 @@ class TestActivation:
call(s2)
call(s3)
assert (rp / "envs" / u1 / "conda-meta").is_dir()
assert (rp / "envs" / u2 / "conda-meta").is_dir()
assert (rp / "envs" / u3 / "conda-meta").is_dir()
assert (rp / "envs" / u1 / "conda-meta" / "history").exists()
assert (rp / "envs" / u2 / "conda-meta" / "history").exists()
assert (rp / "envs" / u3 / "conda-meta" / "history").exists()
if plat == "win":
assert (
rp / "envs" / u1 / "Library" / "include" / "xtensor" / "xtensor.hpp"
).exists()
assert (
rp / "envs" / u2 / "Library" / "include" / "xtensor" / "xtensor.hpp"
).exists()
assert (
rp / "envs" / u3 / "Library" / "include" / "xtensor" / "xtensor.hpp"
).exists()
else:
assert (
rp / "envs" / u1 / "include" / "xtensor" / "xtensor.hpp"
).exists()
assert (
rp / "envs" / u2 / "include" / "xtensor" / "xtensor.hpp"
).exists()
assert (
rp / "envs" / u3 / "include" / "xtensor" / "xtensor.hpp"
).exists()
for u in [u1, u2, u3]:
assert (tmp_root_prefix / f"envs/{u}/conda-meta").is_dir()
assert (tmp_root_prefix / f"envs/{u}/conda-meta/history").exists()
if plat == "win":
include_dir = tmp_root_prefix / f"envs/{u}/Library/include"
else:
include_dir = tmp_root_prefix / f"envs/{u}/include"
assert (include_dir / "xtensor/xtensor.hpp").exists()
# unicode activation on win: todo
if plat == "win":
@ -925,10 +781,10 @@ class TestActivation:
stdout, stderr = call(s)
res = TestActivation.to_dict(stdout)
assert find_path_in_str(str(rp / "condabin"), res["PATH"])
assert not find_path_in_str(str(rp / "bin"), res["PATH"])
assert find_path_in_str(str(rp / "envs" / u2), res["PATH"])
assert not find_path_in_str(str(rp / "envs" / u1), res["PATH"])
assert find_path_in_str(str(tmp_root_prefix / "condabin"), res["PATH"])
assert not find_path_in_str(str(tmp_root_prefix / "bin"), res["PATH"])
assert find_path_in_str(str(tmp_root_prefix / "envs" / u2), res["PATH"])
assert not find_path_in_str(str(tmp_root_prefix / "envs" / u1), res["PATH"])
s = [
"micromamba activate",
@ -937,10 +793,10 @@ class TestActivation:
] + evars
stdout, stderr = call(s)
res = TestActivation.to_dict(stdout)
assert find_path_in_str(str(rp / "condabin"), res["PATH"])
assert not find_path_in_str(str(rp / "bin"), res["PATH"])
assert find_path_in_str(str(rp / "envs" / u1), res["PATH"])
assert find_path_in_str(str(rp / "envs" / u2), res["PATH"])
assert find_path_in_str(str(tmp_root_prefix / "condabin"), res["PATH"])
assert not find_path_in_str(str(tmp_root_prefix / "bin"), res["PATH"])
assert find_path_in_str(str(tmp_root_prefix / "envs" / u1), res["PATH"])
assert find_path_in_str(str(tmp_root_prefix / "envs" / u2), res["PATH"])
s = [
"micromamba activate",
@ -948,34 +804,28 @@ class TestActivation:
] + evars
stdout, stderr = call(s)
res = TestActivation.to_dict(stdout)
assert find_path_in_str(str(rp / "condabin"), res["PATH"])
assert not find_path_in_str(str(rp / "bin"), res["PATH"])
assert find_path_in_str(str(rp / "envs" / u3), res["PATH"])
assert find_path_in_str(str(tmp_root_prefix / "condabin"), res["PATH"])
assert not find_path_in_str(str(tmp_root_prefix / "bin"), res["PATH"])
assert find_path_in_str(str(tmp_root_prefix / "envs" / u3), res["PATH"])
@pytest.mark.parametrize("interpreter", get_interpreters())
def test_activate_path(self, tmp_path, interpreter, new_root_prefix):
def test_activate_path(self, tmp_empty_env, tmp_env_name, interpreter, tmp_path):
if interpreter not in valid_interpreters:
pytest.skip(f"{interpreter} not available")
test_dir = tmp_path / self.env_name
os.mkdir(test_dir)
create("-n", self.env_name)
res = shell("activate", self.env_name, "-s", interpreter)
# Activate env name
res = shell("activate", tmp_env_name, "-s", interpreter)
dict_res = self.to_dict(res, interpreter)
assert any([str(self.prefix) in p for p in dict_res.values()])
assert any([str(tmp_empty_env) in p for p in dict_res.values()])
res = shell("activate", self.prefix, "-s", interpreter)
# Activate path
res = shell("activate", str(tmp_empty_env), "-s", interpreter)
dict_res = self.to_dict(res, interpreter)
assert any([str(self.prefix) in p for p in dict_res.values()])
assert any([str(tmp_empty_env) in p for p in dict_res.values()])
prefix_short = self.prefix.replace(os.path.expanduser("~"), "~")
# Activate path with home
prefix_short = str(tmp_empty_env).replace(os.path.expanduser("~"), "~")
res = shell("activate", prefix_short, "-s", interpreter)
dict_res = self.to_dict(res, interpreter)
assert any([str(self.prefix) in p for p in dict_res.values()])
res = shell("activate", test_dir, "-s", interpreter)
dict_res = self.to_dict(res, interpreter)
assert any([str(test_dir) in p for p in dict_res.values()])
assert any([str(tmp_empty_env) in p for p in dict_res.values()])