diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index 18925ab8..56fddfaf 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -15,6 +15,12 @@ jobs: - uses: actions/checkout@v4 - run: nix-build -A tests + check-data-model: + runs-on: native + steps: + - uses: actions/checkout@v4 + - run: nix-shell --run 'nix-unit ./test.nix' + check-peertube: runs-on: native steps: diff --git a/default.nix b/default.nix index 4c71ec49..09da3710 100644 --- a/default.nix +++ b/default.nix @@ -41,6 +41,23 @@ in shell = pkgs.mkShellNoCC { inherit (pre-commit-check) shellHook; buildInputs = pre-commit-check.enabledPackages; + packages = + let + test-loop = pkgs.writeShellApplication { + name = "test-loop"; + runtimeInputs = [ + pkgs.watchexec + pkgs.nix-unit + ]; + text = '' + watchexec -w ${builtins.toString ./.} -- nix-unit ${builtins.toString ./test.nix} "$@" + ''; + }; + in + [ + pkgs.nix-unit + test-loop + ]; }; tests = { diff --git a/deployment/application.nix b/deployment/application.nix new file mode 100644 index 00000000..12326907 --- /dev/null +++ b/deployment/application.nix @@ -0,0 +1,42 @@ +{ + lib, + ... +}: +let + inherit (lib) types mkOption; +in +with types; +{ + options = { + runtime-environments = mkOption { + type = attrsOf (attrTag { + nixos = mkOption { + type = submodule { + options = { + module = mkOption { + description = "The NixOS module of the run-time environment"; + type = deferredModule; + }; + }; + }; + }; + }); + }; + applications = mkOption { + description = "Collection of NixOS modules, each implementing a Fediversity application"; + type = attrsOf (submoduleWith { + description = "A Fediversity application"; + modules = [ + { + options = { + module = mkOption { + description = "The NixOS module to compose into an operator's configuration"; + type = deferredModule; + }; + }; + } + ]; + }); + }; + }; +} diff --git a/test.nix b/test.nix new file mode 100644 index 00000000..b84ac16c --- /dev/null +++ b/test.nix @@ -0,0 +1,45 @@ +let + inherit (import ./default.nix { }) pkgs; + inherit (pkgs) lib; + eval = + module: + (lib.evalModules { + modules = [ + module + ./deployment/application.nix + ]; + }).config; +in +{ + test-foo = { + expr = + let + example = eval { + runtime-environments.bar.nixos = { + module = + { ... }: + { + system.stateVersion = "25.05"; + }; + }; + applications.foo = { + module = + { pkgs, ... }: + { + environment.systemPackages = [ + pkgs.hello + ]; + }; + }; + }; + in + { + has-runtime = example.runtime-environments.bar.nixos ? module; + has-application = example.applications.foo ? module; + }; + expected = { + has-runtime = true; + has-application = true; + }; + }; +}