diff --git a/tests/functional/meson.build b/tests/functional/meson.build index 2296070a9..b9979f121 100644 --- a/tests/functional/meson.build +++ b/tests/functional/meson.build @@ -108,7 +108,6 @@ functional_tests_scripts = [ 'db-migration.sh', 'bash-profile.sh', 'pass-as-file.sh', - 'suggestions.sh', 'store-ping.sh', 'flakes/show.sh', 'path-from-hash-part.sh', diff --git a/tests/functional/suggestions.sh b/tests/functional/suggestions.sh deleted file mode 100644 index 480e92f81..000000000 --- a/tests/functional/suggestions.sh +++ /dev/null @@ -1,48 +0,0 @@ -source common.sh - -clearStore - -cd "$TEST_HOME" - -cat < flake.nix -{ - outputs = a: { - packages.$system = { - foo = 1; - fo1 = 1; - fo2 = 1; - fooo = 1; - foooo = 1; - fooooo = 1; - fooooo1 = 1; - fooooo2 = 1; - fooooo3 = 1; - fooooo4 = 1; - fooooo5 = 1; - fooooo6 = 1; - }; - }; -} -EOF - -# Probable typo in the requested attribute path. Suggest some close possibilities -NIX_BUILD_STDERR_WITH_SUGGESTIONS=$(! nix build .\#fob 2>&1 1>/dev/null) -[[ "$NIX_BUILD_STDERR_WITH_SUGGESTIONS" =~ "Did you mean one of fo1, fo2, foo or fooo?" ]] || \ - fail "The nix build stderr should suggest the three closest possiblities" - -# None of the possible attributes is close to `bar`, so shouldn’t suggest anything -NIX_BUILD_STDERR_WITH_NO_CLOSE_SUGGESTION=$(! nix build .\#bar 2>&1 1>/dev/null) -[[ ! "$NIX_BUILD_STDERR_WITH_NO_CLOSE_SUGGESTION" =~ "Did you mean" ]] || \ - fail "The nix build stderr shouldn’t suggest anything if there’s nothing relevant to suggest" - -NIX_EVAL_STDERR_WITH_SUGGESTIONS=$(! nix build --impure --expr '(builtins.getFlake (builtins.toPath ./.)).packages.'$system'.fob' 2>&1 1>/dev/null) -[[ "$NIX_EVAL_STDERR_WITH_SUGGESTIONS" =~ "Did you mean one of fo1, fo2, foo or fooo?" ]] || \ - fail "The evaluator should suggest the three closest possiblities" - -NIX_EVAL_STDERR_WITH_SUGGESTIONS=$(! nix build --impure --expr '({ foo }: foo) { foo = 1; fob = 2; }' 2>&1 1>/dev/null) -[[ ! "$NIX_EVAL_STDERR_WITH_SUGGESTIONS" =~ "Did you mean" ]] || \ - fail "The evaluator shouldn't suggest anything if all arguments are already provided." - -NIX_EVAL_STDERR_WITH_SUGGESTIONS=$(! nix build --impure --expr '({ foo ? 1 }: foo) { fob = 2; }' 2>&1 1>/dev/null) -[[ "$NIX_EVAL_STDERR_WITH_SUGGESTIONS" =~ "Did you mean foo?" ]] || \ - fail "The evaluator should suggest the three closest possiblities" diff --git a/tests/functional2/cli/test_suggestions.py b/tests/functional2/cli/test_suggestions.py new file mode 100644 index 000000000..d17563b11 --- /dev/null +++ b/tests/functional2/cli/test_suggestions.py @@ -0,0 +1,62 @@ +import pytest +from testlib.fixtures.nix import Nix +from testlib.fixtures.file_helper import File, with_files + + +@with_files( + { + "flake.nix": File("""{ + outputs = a: { + packages.system = { + foo = 1; + fo1 = 1; + fo2 = 1; + fooo = 1; + foooo = 1; + fooooo = 1; + fooooo1 = 1; + fooooo2 = 1; + fooooo3 = 1; + fooooo4 = 1; + fooooo5 = 1; + fooooo6 = 1; + }; + }; + }""") + } +) +class TestSuggestions: + @pytest.fixture(autouse=True) + def setup(self, nix: Nix): + nix.settings.add_xp_feature("nix-command", "flakes") + nix.settings.system = "system" + + @pytest.mark.parametrize( + "args", + [ + [".#fob"], + ["--impure", "--expr", "(builtins.getFlake (builtins.toPath ./.)).packages.system.fob"], + ], + ) + def test_three_closest(self, nix: Nix, args: list[str]): + err = nix.nix(["build", *args]).run().expect(1).stderr_s + assert "Did you mean one of fo1, fo2, foo or fooo?" in err + + def test_only_suggest_relevant(self, nix: Nix): + assert "Did you mean" not in nix.nix(["build", ".#bar"]).run().expect(1).stderr_s + + def test_inactive_if_all_args_provided(self, nix: Nix): + assert "Did you mean" not in ( + nix.nix(["build", "--impure", "--expr", "({ foo }: foo) { foo = 1; fob = 2; }"]) + .run() + .expect(1) + .stderr_s + ) + + def test_expr(self, nix: Nix): + assert "Did you mean foo?" in ( + nix.nix(["build", "--impure", "--expr", "({ foo ? 1 }: foo) { fob = 2; }"]) + .run() + .expect(1) + .stderr_s + )