From afbf007bb5e05b7837be5485e221ea50c4fd4f1b Mon Sep 17 00:00:00 2001 From: Robert Helgesson Date: Tue, 24 Dec 2024 09:12:59 +0100 Subject: [PATCH] tests: add integration test for nh --- tests/integration/default.nix | 1 + tests/integration/standalone/nh.nix | 89 +++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 tests/integration/standalone/nh.nix diff --git a/tests/integration/default.nix b/tests/integration/default.nix index 697a2843..4fbaaf7a 100644 --- a/tests/integration/default.nix +++ b/tests/integration/default.nix @@ -13,6 +13,7 @@ let home-with-symbols = runTest ./standalone/home-with-symbols.nix; kitty = runTest ./standalone/kitty.nix; mu = runTest ./standalone/mu; + nh = runTest ./standalone/nh.nix; nixos-basics = runTest ./nixos/basics.nix; standalone-flake-basics = runTest ./standalone/flake-basics.nix; standalone-standard-basics = runTest ./standalone/standard-basics.nix; diff --git a/tests/integration/standalone/nh.nix b/tests/integration/standalone/nh.nix new file mode 100644 index 00000000..b19b2140 --- /dev/null +++ b/tests/integration/standalone/nh.nix @@ -0,0 +1,89 @@ +{ pkgs, ... }: + +let + + inherit (pkgs.lib) escapeShellArg; + + home = "/home/alice"; + +in { + name = "works-with-nh-stable"; + meta.maintainers = [ pkgs.lib.maintainers.rycee ]; + + nodes.machine = { ... }: { + imports = [ "${pkgs.path}/nixos/modules/installer/cd-dvd/channel.nix" ]; + virtualisation.memorySize = 2048; + environment.systemPackages = [ pkgs.nh ]; + nix = { + registry.home-manager.to = { + type = "path"; + path = ../../..; + }; + settings.extra-experimental-features = [ "nix-command" "flakes" ]; + }; + users.users.alice = { + isNormalUser = true; + description = "Alice Foobar"; + password = "foobar"; + uid = 1000; + inherit home; + }; + }; + + testScript = '' + import shlex + + start_all() + machine.wait_for_unit("network.target") + machine.wait_for_unit("multi-user.target") + + home_manager = "${../..}" + + def login_as_alice(): + machine.wait_until_tty_matches("1", "login: ") + machine.send_chars("alice\n") + machine.wait_until_tty_matches("1", "Password: ") + machine.send_chars("foobar\n") + machine.wait_until_tty_matches("1", "alice\\@machine") + + def logout_alice(): + machine.send_chars("exit\n") + + def alice_cmd(cmd): + cmd = shlex.quote(f"export XDG_RUNTIME_DIR=/run/user/$UID ; {cmd}") + return f"su -l alice --shell /bin/sh -c {cmd}" + + def succeed_as_alice(cmd): + return machine.succeed(alice_cmd(cmd)) + + def fail_as_alice(cmd): + return machine.fail(alice_cmd(cmd)) + + # Create a persistent login so that Alice has a systemd session. + login_as_alice() + + # Set up a home-manager channel. + succeed_as_alice(" ; ".join([ + "mkdir -p ${home}/.nix-defexpr/channels", + f"ln -s {home_manager} ${home}/.nix-defexpr/channels/home-manager" + ])) + + with subtest("Run nh home switch"): + # Copy a configuration to activate. + succeed_as_alice(" ; ".join([ + "mkdir -vp ${home}/.config/home-manager", + "cp -v ${ + ./alice-flake-init.nix + } ${home}/.config/home-manager/flake.nix", + "cp -v ${./alice-home-next.nix} ${home}/.config/home-manager/home.nix" + ])) + + actual = succeed_as_alice("nh home switch --no-nom '${home}/.config/home-manager'") + expected = "Starting Home Manager activation" + assert expected in actual, \ + f"expected nh home switch to contain {expected}, but got {actual}" + + # The default configuration creates this link on activation. + machine.succeed("test -L '${home}/.cache/.keep'") + ''; +}