From 95b10ec3ef02c30505eda3914810ea37038cd7d8 Mon Sep 17 00:00:00 2001 From: Donovan Glover Date: Tue, 2 Apr 2024 05:15:15 -0400 Subject: [PATCH] meta: Begin writing tests in Nix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that I've figured out how to dynamically import modules and use those modules as outputs, the next step is to ensure that these modules work as intended when being used by end users. NixOS offers a built-in testing solution that enables us to conveniently spin up virtual machines with a given configuration, then verify their correctness through python scripting. The lib.nix file in particular is based on Jörg Thalheim's very useful blog post that explains how to use the built-in testing functionality with Nix flakes, which isn't covered in official documentation. See: https://blog.thalheim.io/2023/01/08/how-to-use-nixos-testing-framework-with-flakes/ --- flake.nix | 10 ++++++++++ tests/hyprland.nix | 15 +++++++++++++++ tests/lib.nix | 13 +++++++++++++ tests/neovim.nix | 15 +++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 tests/hyprland.nix create mode 100644 tests/lib.nix create mode 100644 tests/neovim.nix diff --git a/flake.nix b/flake.nix index 27e3a63e..37bc7590 100644 --- a/flake.nix +++ b/flake.nix @@ -25,6 +25,11 @@ inherit (nixpkgs.lib) nixosSystem; inherit (nixpkgs.legacyPackages.x86_64-linux) nixpkgs-fmt callPackage; + checkArgs = { + pkgs = nixpkgs.legacyPackages.x86_64-linux; + inherit self; + }; + flakeOutputs = [ "overlays" "nixosModules" "homeManagerModules" "packages" ]; flakeDirectories = [ "overlays" "modules" "home" "packages" ]; packageDirectory = "packages"; @@ -55,6 +60,11 @@ ]; }; }; + + checks.x86_64-linux = { + hyprland = import ./tests/hyprland.nix checkArgs; + neovim = import ./tests/neovim.nix checkArgs; + }; } // (builtins.listToAttrs (builtins.map diff --git a/tests/hyprland.nix b/tests/hyprland.nix new file mode 100644 index 00000000..64f0795f --- /dev/null +++ b/tests/hyprland.nix @@ -0,0 +1,15 @@ +# TODO: Write test to ensure that Hyprland starts with basic config +(import ./lib.nix) { + name = "hyprland"; + + nodes.machine = { self, pkgs, ... }: { + imports = with self.nixosModules; [ + hyprland + ]; + }; + + testScript = /* python */ '' + output = machine.succeed("echo 'Hello world'") + assert "Hello world" in output + ''; +} diff --git a/tests/lib.nix b/tests/lib.nix new file mode 100644 index 00000000..93748faa --- /dev/null +++ b/tests/lib.nix @@ -0,0 +1,13 @@ +test: { pkgs, self }: +let + inherit (pkgs) lib; + nixos-lib = import (pkgs.path + "/nixos/lib") { }; +in +(nixos-lib.runTest { + hostPkgs = pkgs; + defaults.documentation.enable = lib.mkDefault false; + node.specialArgs = { + inherit self; + }; + imports = [ test ]; +}).config.result diff --git a/tests/neovim.nix b/tests/neovim.nix new file mode 100644 index 00000000..ed0d0aa4 --- /dev/null +++ b/tests/neovim.nix @@ -0,0 +1,15 @@ +# TODO: Ensure that neovim config works without errors on startup +(import ./lib.nix) { + name = "neovim"; + + nodes.machine = { self, pkgs, ... }: { + imports = with self.nixosModules; [ + neovim + ]; + }; + + testScript = /* python */ '' + output = machine.succeed("echo 'Hello world'") + assert "Hello world" in output + ''; +}