mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-04-30 09:32:05 -04:00
nix: add VM tests for flake modules (#2281)
* nix: add VM tests for flake modules * ci: add NixOS tests
This commit is contained in:
52
distro/nix/tests/default.nix
Normal file
52
distro/nix/tests/default.nix
Normal file
@@ -0,0 +1,52 @@
|
||||
{
|
||||
self,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
rec {
|
||||
all = pkgs.symlinkJoin {
|
||||
name = "dms-nixos-tests";
|
||||
paths = [
|
||||
nixos-module
|
||||
nixos-service-start-module
|
||||
greeter-niri-module
|
||||
niri-home-module
|
||||
home-manager-module
|
||||
];
|
||||
};
|
||||
|
||||
nixos-module = import ./nixos-module.nix {
|
||||
inherit
|
||||
self
|
||||
pkgs
|
||||
;
|
||||
};
|
||||
|
||||
nixos-service-start-module = import ./nixos-service-start-module.nix {
|
||||
inherit
|
||||
self
|
||||
pkgs
|
||||
;
|
||||
};
|
||||
|
||||
greeter-niri-module = import ./greeter-niri-module.nix {
|
||||
inherit
|
||||
self
|
||||
pkgs
|
||||
;
|
||||
};
|
||||
|
||||
niri-home-module = import ./niri-home-module.nix {
|
||||
inherit
|
||||
self
|
||||
pkgs
|
||||
;
|
||||
};
|
||||
|
||||
home-manager-module = import ./home-manager-module.nix {
|
||||
inherit
|
||||
self
|
||||
pkgs
|
||||
;
|
||||
};
|
||||
}
|
||||
60
distro/nix/tests/greeter-niri-module.nix
Normal file
60
distro/nix/tests/greeter-niri-module.nix
Normal file
@@ -0,0 +1,60 @@
|
||||
{
|
||||
self,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
pkgs.testers.runNixOSTest {
|
||||
name = "dms-greeter-niri-module";
|
||||
|
||||
nodes.machine = {
|
||||
imports = [
|
||||
self.nixosModules.greeter
|
||||
];
|
||||
|
||||
users.groups.greeter = { };
|
||||
users.users.greeter = {
|
||||
isSystemUser = true;
|
||||
group = "greeter";
|
||||
};
|
||||
|
||||
services.greetd.settings.default_session.user = "greeter";
|
||||
|
||||
programs.niri.enable = true;
|
||||
|
||||
programs.dank-material-shell.greeter = {
|
||||
enable = true;
|
||||
compositor.name = "niri";
|
||||
};
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
import re
|
||||
|
||||
machine.wait_for_unit("multi-user.target")
|
||||
machine.wait_for_unit("greetd.service")
|
||||
|
||||
machine.succeed("systemctl is-enabled greetd.service")
|
||||
machine.succeed("systemctl is-active greetd.service")
|
||||
|
||||
greetd_unit = machine.succeed("cat /etc/systemd/system/greetd.service")
|
||||
config_match = re.search(r'--config (/nix/store[^ ]+-greetd.toml)', greetd_unit)
|
||||
if config_match is None:
|
||||
raise AssertionError(greetd_unit)
|
||||
|
||||
greetd_config_path = config_match.group(1)
|
||||
greetd_config = machine.succeed(f"cat {greetd_config_path}")
|
||||
t.assertIn("dms-greeter", greetd_config)
|
||||
|
||||
script_match = re.search(r'command\s*=\s*"([^"]+/bin/dms-greeter)"', greetd_config)
|
||||
if script_match is None:
|
||||
raise AssertionError(greetd_config)
|
||||
|
||||
script_path = script_match.group(1)
|
||||
script = machine.succeed(f"cat {script_path}")
|
||||
t.assertIn("--command", script)
|
||||
t.assertIn("niri", script)
|
||||
t.assertIn("/share/quickshell/dms", script)
|
||||
'';
|
||||
}
|
||||
107
distro/nix/tests/home-manager-module.nix
Normal file
107
distro/nix/tests/home-manager-module.nix
Normal file
@@ -0,0 +1,107 @@
|
||||
{
|
||||
self,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
homeManagerNixosModule =
|
||||
(fetchTarball {
|
||||
url = "https://github.com/nix-community/home-manager/archive/e82d4a4ecd18363aa2054cbaa3e32e4134c3dbf4.tar.gz";
|
||||
sha256 = "sha256-ZTYDofOM3/PJhRF1EuBh6uibm+DmkhU7Wor6mMN7YTc=";
|
||||
})
|
||||
+ "/nixos";
|
||||
in
|
||||
pkgs.testers.runNixOSTest {
|
||||
name = "dms-home-manager-module";
|
||||
|
||||
nodes.machine = {
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
homeManagerNixosModule
|
||||
];
|
||||
|
||||
users.users.danklinux = {
|
||||
isNormalUser = true;
|
||||
createHome = true;
|
||||
home = "/home/danklinux";
|
||||
extraGroups = [ "wheel" ];
|
||||
};
|
||||
|
||||
home-manager.useGlobalPkgs = true;
|
||||
home-manager.useUserPackages = true;
|
||||
|
||||
home-manager.users.danklinux = {
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
self.homeModules.dank-material-shell
|
||||
];
|
||||
|
||||
home.username = "danklinux";
|
||||
home.homeDirectory = "/home/danklinux";
|
||||
home.stateVersion = "25.11";
|
||||
|
||||
programs.dank-material-shell = {
|
||||
enable = true;
|
||||
systemd = {
|
||||
enable = true;
|
||||
target = "default.target";
|
||||
};
|
||||
|
||||
settings = {
|
||||
theme = "integration-test";
|
||||
};
|
||||
|
||||
clipboardSettings = {
|
||||
maxItems = 10;
|
||||
};
|
||||
|
||||
session = {
|
||||
startedFrom = "nixos-test";
|
||||
};
|
||||
|
||||
plugins.TestPlugin = {
|
||||
enable = true;
|
||||
src = pkgs.runCommand "dms-test-plugin" { } ''
|
||||
mkdir -p "$out"
|
||||
echo plugin > "$out/plugin.txt"
|
||||
'';
|
||||
settings = {
|
||||
enabled = true;
|
||||
source = "test";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
import json
|
||||
|
||||
machine.wait_for_unit("multi-user.target")
|
||||
|
||||
machine.succeed("su -- danklinux -c 'command -v dms'")
|
||||
machine.succeed("su -- danklinux -c 'test -f ~/.config/DankMaterialShell/settings.json'")
|
||||
machine.succeed("su -- danklinux -c 'test -f ~/.config/DankMaterialShell/clsettings.json'")
|
||||
machine.succeed("su -- danklinux -c 'test -f ~/.config/DankMaterialShell/plugin_settings.json'")
|
||||
machine.succeed("su -- danklinux -c 'test -e ~/.config/DankMaterialShell/plugins/TestPlugin'")
|
||||
machine.succeed("su -- danklinux -c 'test -f ~/.local/state/DankMaterialShell/session.json'")
|
||||
|
||||
settings = json.loads(machine.succeed("su -- danklinux -c 'cat ~/.config/DankMaterialShell/settings.json'"))
|
||||
clipboard = json.loads(machine.succeed("su -- danklinux -c 'cat ~/.config/DankMaterialShell/clsettings.json'"))
|
||||
session = json.loads(machine.succeed("su -- danklinux -c 'cat ~/.local/state/DankMaterialShell/session.json'"))
|
||||
plugins = json.loads(machine.succeed("su -- danklinux -c 'cat ~/.config/DankMaterialShell/plugin_settings.json'"))
|
||||
doctor = json.loads(machine.succeed("su -- danklinux -c 'dms doctor --json'"))
|
||||
|
||||
t.assertEqual(settings["theme"], "integration-test")
|
||||
t.assertEqual(clipboard["maxItems"], 10)
|
||||
t.assertEqual(session["startedFrom"], "nixos-test")
|
||||
t.assertTrue(plugins["TestPlugin"]["enabled"])
|
||||
t.assertEqual(plugins["TestPlugin"]["source"], "test")
|
||||
t.assertIsInstance(doctor.get("results"), list)
|
||||
'';
|
||||
}
|
||||
84
distro/nix/tests/niri-home-module.nix
Normal file
84
distro/nix/tests/niri-home-module.nix
Normal file
@@ -0,0 +1,84 @@
|
||||
{
|
||||
self,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
homeManagerNixosModule =
|
||||
(fetchTarball {
|
||||
url = "https://github.com/nix-community/home-manager/archive/e82d4a4ecd18363aa2054cbaa3e32e4134c3dbf4.tar.gz";
|
||||
sha256 = "sha256-ZTYDofOM3/PJhRF1EuBh6uibm+DmkhU7Wor6mMN7YTc=";
|
||||
})
|
||||
+ "/nixos";
|
||||
|
||||
niriFlake = builtins.getFlake "github:sodiboo/niri-flake/2bb22af2985e5f3cfd051b3d977ebfbf81126280?narHash=sha256-ooPmu%2B8tqOGh4kozPW4rJC7Y7WM/FHtEY3OK1PoNW7g%3D";
|
||||
|
||||
fakeNiri = (pkgs.writeScriptBin "niri" "") // {
|
||||
cargoBuildNoDefaultFeatures = false;
|
||||
};
|
||||
in
|
||||
pkgs.testers.runNixOSTest {
|
||||
name = "dms-niri-home-module";
|
||||
|
||||
nodes.machine = {
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
homeManagerNixosModule
|
||||
];
|
||||
|
||||
users.users.danklinux = {
|
||||
isNormalUser = true;
|
||||
createHome = true;
|
||||
home = "/home/danklinux";
|
||||
extraGroups = [ "wheel" ];
|
||||
};
|
||||
|
||||
home-manager.useGlobalPkgs = true;
|
||||
home-manager.useUserPackages = true;
|
||||
|
||||
environment.pathsToLink = [
|
||||
"/share/applications"
|
||||
"/share/xdg-desktop-portal"
|
||||
];
|
||||
|
||||
home-manager.users.danklinux = {
|
||||
...
|
||||
}: {
|
||||
imports = [
|
||||
self.homeModules.dank-material-shell
|
||||
niriFlake.homeModules.niri
|
||||
self.homeModules.niri
|
||||
];
|
||||
|
||||
home.username = "danklinux";
|
||||
home.homeDirectory = "/home/danklinux";
|
||||
home.stateVersion = "25.11";
|
||||
|
||||
programs.niri = {
|
||||
enable = true;
|
||||
package = fakeNiri; # avoids niri from being compiled in the CI
|
||||
};
|
||||
|
||||
programs.dank-material-shell = {
|
||||
enable = true;
|
||||
niri = {
|
||||
enableKeybinds = false;
|
||||
enableSpawn = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
machine.wait_for_unit("multi-user.target")
|
||||
|
||||
machine.succeed("su -- danklinux -c 'test -f ~/.config/niri/config.kdl'")
|
||||
machine.succeed("su -- danklinux -c 'grep -F \"include \\\"dms/binds.kdl\\\"\" ~/.config/niri/config.kdl'")
|
||||
machine.succeed("su -- danklinux -c 'grep -F \"include \\\"hm.kdl\\\"\" ~/.config/niri/config.kdl'")
|
||||
machine.succeed("su -- danklinux -c 'grep -F \"spawn-at-startup\" ~/.config/niri/hm.kdl'")
|
||||
machine.succeed("su -- danklinux -c 'grep -F \"\\\"dms\\\" \\\"run\\\"\" ~/.config/niri/hm.kdl'")
|
||||
'';
|
||||
}
|
||||
47
distro/nix/tests/nixos-module.nix
Normal file
47
distro/nix/tests/nixos-module.nix
Normal file
@@ -0,0 +1,47 @@
|
||||
{
|
||||
self,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
pkgs.testers.runNixOSTest {
|
||||
name = "dms-nixos-module";
|
||||
|
||||
nodes.machine = {
|
||||
imports = [
|
||||
self.nixosModules.dank-material-shell
|
||||
];
|
||||
|
||||
users.users.danklinux = {
|
||||
isNormalUser = true;
|
||||
extraGroups = [ "wheel" ];
|
||||
};
|
||||
|
||||
programs.dank-material-shell = {
|
||||
enable = true;
|
||||
systemd.enable = true;
|
||||
plugins = {
|
||||
TestPlugin = {
|
||||
src = pkgs.emptyDirectory;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
import json
|
||||
|
||||
machine.wait_for_unit("multi-user.target")
|
||||
|
||||
machine.succeed("command -v dms")
|
||||
machine.succeed("command -v quickshell")
|
||||
machine.succeed("su -- danklinux -c 'dms --help >/dev/null'")
|
||||
machine.succeed("test -d /etc/xdg/quickshell/dms-plugins")
|
||||
machine.succeed("test -f /run/current-system/sw/lib/systemd/user/dms.service")
|
||||
|
||||
payload = json.loads(machine.succeed("su -- danklinux -c 'dms doctor --json'"))
|
||||
t.assertIn("summary", payload)
|
||||
t.assertIsInstance(payload.get("results"), list)
|
||||
'';
|
||||
}
|
||||
48
distro/nix/tests/nixos-service-start-module.nix
Normal file
48
distro/nix/tests/nixos-service-start-module.nix
Normal file
@@ -0,0 +1,48 @@
|
||||
{
|
||||
self,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
fakeDms = pkgs.writeShellScriptBin "dms" ''
|
||||
printf '%s\n' "$@" > /tmp/dms-service-args
|
||||
exec ${pkgs.coreutils}/bin/sleep 300
|
||||
'';
|
||||
in
|
||||
pkgs.testers.runNixOSTest {
|
||||
name = "dms-nixos-service-start-module";
|
||||
|
||||
nodes.machine = {
|
||||
imports = [
|
||||
self.nixosModules.dank-material-shell
|
||||
];
|
||||
|
||||
users.users.danklinux = {
|
||||
isNormalUser = true;
|
||||
linger = true;
|
||||
extraGroups = [ "wheel" ];
|
||||
};
|
||||
|
||||
programs.dank-material-shell = {
|
||||
enable = true;
|
||||
package = fakeDms;
|
||||
systemd = {
|
||||
enable = true;
|
||||
target = "default.target";
|
||||
};
|
||||
};
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
};
|
||||
|
||||
testScript = ''
|
||||
machine.wait_for_unit("multi-user.target")
|
||||
machine.wait_for_unit("user@1000.service")
|
||||
|
||||
machine.succeed("systemctl --machine=danklinux@ --user start dms.service")
|
||||
machine.wait_until_succeeds("systemctl --machine=danklinux@ --user is-active dms.service")
|
||||
machine.wait_until_succeeds("test -f /tmp/dms-service-args")
|
||||
machine.succeed("grep -Fx run /tmp/dms-service-args")
|
||||
machine.succeed("grep -Fx -- --session /tmp/dms-service-args")
|
||||
'';
|
||||
}
|
||||
Reference in New Issue
Block a user