123 lines
3.8 KiB
Python
123 lines
3.8 KiB
Python
from testlib.fixtures.nix import Nix
|
|
from testlib.fixtures.git import Git
|
|
from testlib.fixtures.file_helper import with_files, File, EnvTemplate, CopyFile
|
|
from testlib.environ import environ
|
|
from testlib.utils import get_global_asset, get_global_asset_pack
|
|
from pathlib import Path
|
|
import pytest
|
|
|
|
system = environ.get("system")
|
|
|
|
flake = {
|
|
"flake.nix": EnvTemplate(f"""{{
|
|
inputs.nixpkgs.url = "@HOME@/nixpkgs";
|
|
outputs = {{self, nixpkgs}}: {{
|
|
packages.{system}.hello = (import ./config.nix).mkDerivation {{
|
|
name = "hello";
|
|
outputs = [ "out" "dev" ];
|
|
meta.outputsToInstall = [ "out" ];
|
|
buildCommand = "";
|
|
}};
|
|
}};
|
|
}}"""),
|
|
"config.nix": get_global_asset("config.nix"),
|
|
"shell-hello.nix": CopyFile("assets/shell-hello.nix"),
|
|
}
|
|
nixpkgs = {
|
|
"flake.nix": File(f"""{{
|
|
outputs = {{self}}: {{
|
|
legacyPackages.{system}.bashInteractive = (import ./shell.nix {{}}).bashInteractive;
|
|
}};
|
|
}}"""),
|
|
"config.nix": get_global_asset("config.nix"),
|
|
"shell.nix": get_global_asset("shell.nix"),
|
|
}
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def common_init(nix: Nix):
|
|
nix.settings.add_xp_feature("nix-command", "flakes")
|
|
|
|
|
|
@with_files(flake | {"nixpkgs": nixpkgs})
|
|
class TestDevelop:
|
|
def test_env_passthrough(self, nix: Nix):
|
|
nix.env["ENVVAR"] = "a"
|
|
|
|
result = (
|
|
nix.nix(["develop", "--no-write-lock-file", ".#hello"])
|
|
.with_stdin(b'echo "$ENVVAR"')
|
|
.run()
|
|
.ok()
|
|
)
|
|
assert result.stdout_s == "a\n"
|
|
|
|
def test_no_env_passthrough_on_ignore_environment(self, nix: Nix):
|
|
nix.env["ENVVAR"] = "a"
|
|
|
|
result = (
|
|
nix.nix(["develop", "--ignore-environment", "--no-write-lock-file", ".#hello"])
|
|
.with_stdin(b'echo "$ENVVAR"')
|
|
.run()
|
|
.ok()
|
|
)
|
|
assert result.stdout_s == "\n"
|
|
|
|
class TestShell:
|
|
@pytest.fixture(autouse=True)
|
|
def shell_init(self, nix: Nix, files: Path): # noqa: ARG002
|
|
nix.nix(
|
|
[
|
|
"build",
|
|
"--no-write-lock-file",
|
|
"./nixpkgs#bashInteractive",
|
|
"--out-link",
|
|
"./bash-interactive",
|
|
]
|
|
).run().ok()
|
|
self.bash_interactive = nix.env.dirs.home / "bash-interactive/bin/bash"
|
|
|
|
nix.env["SHELL"] = "custom"
|
|
|
|
@pytest.mark.parametrize("extra_args", [[], ["--ignore-environment"]])
|
|
def test_shell_is_bash_interactive(self, nix: Nix, extra_args: list[str]):
|
|
result = (
|
|
nix.nix(["develop", *extra_args, "--no-write-lock-file", ".#hello"])
|
|
.with_stdin(b'echo "$SHELL"')
|
|
.run()
|
|
.ok()
|
|
)
|
|
assert Path(result.stdout_s.strip()).samefile(self.bash_interactive)
|
|
|
|
@pytest.mark.parametrize("extra_args", [[], ["--ignore-environment"]])
|
|
def test_sets_in_nix_shell(self, nix: Nix, extra_args: list[str]):
|
|
result = (
|
|
nix.nix(
|
|
[
|
|
"develop",
|
|
"--no-write-lock-file",
|
|
*extra_args,
|
|
".#hello",
|
|
"-c",
|
|
"sh",
|
|
"-c",
|
|
"echo $IN_NIX_SHELL",
|
|
]
|
|
)
|
|
.run()
|
|
.ok()
|
|
)
|
|
assert result.stdout_s == "impure\n"
|
|
|
|
|
|
@with_files(
|
|
{
|
|
"t": flake | get_global_asset_pack(".git") | {".gitignore": File("flake.lock\n")},
|
|
"nixpkgs": nixpkgs,
|
|
}
|
|
)
|
|
def test_ignoring_lockfile_does_not_break_develop(nix: Nix, files: Path, git: Git):
|
|
git(files / "t", "add", "config.nix", "shell-hello.nix", "flake.nix", ".gitignore")
|
|
|
|
nix.nix(["develop", ".#hello"], cwd=files / "t").with_stdin(b"true").run().ok()
|