Skip to content

Commit

Permalink
meta: Begin writing tests in Nix
Browse files Browse the repository at this point in the history
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/
  • Loading branch information
donovanglover committed Apr 2, 2024
1 parent 1d165d3 commit 95b10ec
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 0 deletions.
10 changes: 10 additions & 0 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -55,6 +60,11 @@
];
};
};

checks.x86_64-linux = {
hyprland = import ./tests/hyprland.nix checkArgs;
neovim = import ./tests/neovim.nix checkArgs;
};
} //
(builtins.listToAttrs
(builtins.map
Expand Down
15 changes: 15 additions & 0 deletions tests/hyprland.nix
Original file line number Diff line number Diff line change
@@ -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
'';
}
13 changes: 13 additions & 0 deletions tests/lib.nix
Original file line number Diff line number Diff line change
@@ -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
15 changes: 15 additions & 0 deletions tests/neovim.nix
Original file line number Diff line number Diff line change
@@ -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
'';
}

0 comments on commit 95b10ec

Please sign in to comment.