diff --git a/tests/functional/flakes/flakes.sh b/tests/functional/flakes/flakes.sh index b799269a8..8600cab77 100644 --- a/tests/functional/flakes/flakes.sh +++ b/tests/functional/flakes/flakes.sh @@ -82,33 +82,14 @@ nix registry list | grepInverse '^user' # nothing in user registry expectStderr 1 nix eval flake1#ERROR | grepQuiet "error:.*does not provide attribute.*or 'ERROR'$" expectStderr 1 nix eval flake1#.ERROR | grepQuiet "error:.*does not provide attribute 'ERROR'$" -# Test 'nix flake metadata'. -nix flake metadata flake1 -nix flake metadata flake1 | grepQuiet 'Locked URL:.*flake1.*' - -# Test 'nix flake metadata' on a local flake. -(cd $flake1Dir && nix flake metadata) | grepQuiet 'URL:.*flake1.*' -(cd $flake1Dir && nix flake metadata .) | grepQuiet 'URL:.*flake1.*' -nix flake metadata $flake1Dir | grepQuiet 'URL:.*flake1.*' - -# Test 'nix flake metadata --json'. json=$(nix flake metadata flake1 --json | jq .) -[[ $(echo "$json" | jq -r .description) = 'Bla bla' ]] -[[ -d $(echo "$json" | jq -r .path) ]] -[[ $(echo "$json" | jq -r .lastModified) = $(git -C $flake1Dir log -n1 --format=%ct) ]] hash1=$(echo "$json" | jq -r .revision) echo foo > $flake1Dir/foo git -C $flake1Dir add $flake1Dir/foo -[[ $(nix flake metadata flake1 --json --refresh | jq -r .dirtyRevision) == "$hash1-dirty" ]] - echo -n '# foo' >> $flake1Dir/flake.nix -flake1OriginalCommit=$(git -C $flake1Dir rev-parse HEAD) git -C $flake1Dir commit -a -m 'Foo' -flake1NewCommit=$(git -C $flake1Dir rev-parse HEAD) hash2=$(nix flake metadata flake1 --json --refresh | jq -r .revision) -[[ $(nix flake metadata flake1 --json --refresh | jq -r .dirtyRevision) == "null" ]] -[[ $hash1 != $hash2 ]] # Test 'nix build' on a flake. nix build -o $TEST_ROOT/result flake1#foo @@ -522,6 +503,3 @@ nix flake lock "$flake3Dir" --override-input flake2/flake1 flake1/master/$hash1 nix flake update flake1 flake2/flake1 --flake "$flake3Dir" [[ $(jq -r .nodes.flake1.locked.rev "$flake3Dir/flake.lock") =~ $hash2 ]] [[ $(jq -r .nodes.flake1_2.locked.rev "$flake3Dir/flake.lock") =~ $hash2 ]] - -# Test 'nix flake metadata --json'. -nix flake metadata $flake3Dir --json | jq . diff --git a/tests/functional2/flakes/test_cli.py b/tests/functional2/flakes/test_cli.py index 2e71803fb..61db99ffb 100644 --- a/tests/functional2/flakes/test_cli.py +++ b/tests/functional2/flakes/test_cli.py @@ -1,5 +1,6 @@ from pathlib import Path import pytest +import re from testlib.fixtures.nix import Nix from testlib.fixtures.env import ManagedEnv @@ -68,6 +69,14 @@ def flake1(git: Git, env: ManagedEnv, request: pytest.FixtureRequest) -> Path: return _make_flake_repo("flake1", flake1_files, git, env, request) +def _modify_flake1(flake1: Path, git: Git | None): + (flake1 / "foo").write_text("foo") + (flake1 / "flake.nix").write_text((flake1 / "flake.nix").read_text() + "# foo") + if git is not None: + git(flake1, "add", "foo") + git(flake1, "commit", "-a", "-m", "Foo") + + @pytest.fixture def flake2(git: Git, env: ManagedEnv, request: pytest.FixtureRequest) -> Path: return _make_flake_repo("flake2", flake2_files, git, env, request) @@ -99,6 +108,44 @@ def registry(nix: Nix, flake1: Path, flake2: Path, flake3: Path) -> Path: return registry +@pytest.mark.usefixtures("registry") +class TestMetadata: + def test_registry(self, nix: Nix): + metadata = nix.nix(["flake", "metadata", "flake1"]).run().ok().stdout_s + assert re.search(r"Locked URL:.*flake1.*", metadata) + + @pytest.mark.parametrize("source", [[], ["."]]) + def test_cwd(self, nix: Nix, flake1: Path, source: list[str]): + metadata = nix.nix(["flake", "metadata", *source], cwd=flake1).run().ok().stdout_s + assert re.search(r"Locked URL:.*flake1.*", metadata) + + def test_absolute(self, nix: Nix, flake1: Path): + metadata = nix.nix(["flake", "metadata", flake1]).run().ok().stdout_s + assert re.search(r"Locked URL:.*flake1.*", metadata) + + @pytest.mark.parametrize("source", ["flake1", None]) + def test_json(self, nix: Nix, flake1: Path, source: str | None, git: Git): + flake1_original_commit = git(flake1, "rev-parse", "HEAD").stdout_s.strip() + metadata = nix.nix(["flake", "metadata", source or flake1, "--json"]).run().json() + assert metadata["description"] == "Bla bla" + assert Path(metadata["path"]).is_dir() + assert metadata["lastModified"] == 23 + assert metadata["revision"] == flake1_original_commit + + def test_json_registry_dirty(self, nix: Nix, flake1: Path, git: Git): + flake1_original_commit = git(flake1, "rev-parse", "HEAD").stdout_s.strip() + (flake1 / "foo").write_text("foo") + git(flake1, "add", "foo") + metadata = nix.nix(["flake", "metadata", "flake1", "--json"]).run().json() + assert metadata["dirtyRevision"] == f"{flake1_original_commit}-dirty" + + _modify_flake1(flake1, git) + flake1_modified_commit = git(flake1, "rev-parse", "HEAD").stdout_s.strip() + metadata = nix.nix(["flake", "metadata", "flake1", "--json", "--refresh"]).run().json() + assert metadata["revision"] == flake1_modified_commit + assert "dirtyRevision" not in metadata + + class TestAddPath: @with_files({"badFlake": {"flake.nix": File("INVALID")}}) def test_does_not_eval(self, nix: Nix, files: Path):