diff --git a/cells/repo/flake.lock b/cells/repo/flake.lock index b99a60f..d6fd692 100644 --- a/cells/repo/flake.lock +++ b/cells/repo/flake.lock @@ -69,12 +69,31 @@ "type": "gitlab" } }, + "nixtest-lib": { + "locked": { + "dir": "lib", + "lastModified": 1765728058, + "narHash": "sha256-V3FXECl1oTxEtGteNz3o3GJs/X8asSn1TxRpZ2F+htU=", + "owner": "TECHNOFAB", + "repo": "nixtest", + "rev": "2477ad31ae3aa4134e1bb5eeddbebe0cb64ccb57", + "type": "gitlab" + }, + "original": { + "dir": "lib", + "owner": "TECHNOFAB", + "ref": "v1.2.1", + "repo": "nixtest", + "type": "gitlab" + } + }, "root": { "inputs": { "devshell": "devshell", "devtools-lib": "devtools-lib", "nix-gitlab-ci-lib": "nix-gitlab-ci-lib", "nixmkdocs": "nixmkdocs", + "nixtest-lib": "nixtest-lib", "soonix-lib": "soonix-lib", "treefmt-nix": "treefmt-nix" } diff --git a/cells/repo/flake.nix b/cells/repo/flake.nix index 46a3c1d..8180fcc 100644 --- a/cells/repo/flake.nix +++ b/cells/repo/flake.nix @@ -5,6 +5,7 @@ soonix-lib.url = "gitlab:TECHNOFAB/soonix?dir=lib"; nix-gitlab-ci-lib.url = "gitlab:TECHNOFAB/nix-gitlab-ci/3.1.2?dir=lib"; devtools-lib.url = "gitlab:rensa-nix/devtools?dir=lib"; + nixtest-lib.url = "gitlab:TECHNOFAB/nixtest/v1.2.1?dir=lib"; treefmt-nix = { url = "github:numtide/treefmt-nix"; flake = false; @@ -18,6 +19,8 @@ doclib = i.nixmkdocs.lib {inherit (i.parent) pkgs;}; soonix = i.soonix-lib.lib {inherit (i.parent) pkgs;}; cilib = i.nix-gitlab-ci-lib.lib {inherit (i.parent) pkgs;}; + ntlib = i.nixtest-lib.lib {inherit (i.parent) pkgs;}; + rensa = import "${i.parent.self}/lib" {inherit (i.parent.pkgs) lib;}; treefmt = import i.treefmt-nix; }; } diff --git a/cells/repo/tests.nix b/cells/repo/tests.nix new file mode 100644 index 0000000..fa75087 --- /dev/null +++ b/cells/repo/tests.nix @@ -0,0 +1,10 @@ +{inputs, ...}: let + inherit (inputs) pkgs ntlib rensa; +in { + tests = ntlib.mkNixtest { + modules = ntlib.autodiscover {dir = "${inputs.self}/tests";}; + args = { + inherit pkgs ntlib rensa; + }; + }; +} diff --git a/flake.nix b/flake.nix index a47fa5a..52b2326 100644 --- a/flake.nix +++ b/flake.nix @@ -24,12 +24,14 @@ (simple "docs") (simple "ci") (simple "soonix") + (simple "tests") ]; } { packages = rensa.select inputs.self [ ["repo" "docs"] ["repo" "ci" "packages"] ["repo" "soonix" "packages"] + ["repo" "tests"] ]; }; } diff --git a/tests/builder_test.nix b/tests/builder_test.nix new file mode 100644 index 0000000..a520b43 --- /dev/null +++ b/tests/builder_test.nix @@ -0,0 +1,90 @@ +{ + pkgs, + ntlib, + rensa, + ... +}: { + suites."Builder" = { + pos = __curPos; + tests = [ + { + name = "has system outputs"; + expected = true; + actual = let + testFlake = rensa.build { + inputs = {}; + cellsFrom = ../cells; + cellBlocks = with rensa.blocks; [ + (simple "test") + ]; + systems = ["x86_64-linux"]; + }; + in + builtins.hasAttr "x86_64-linux" testFlake; + } + { + name = "has ren metadata"; + expected = true; + actual = let + testFlake = rensa.build { + inputs = {}; + cellsFrom = ../cells; + cellBlocks = with rensa.blocks; [ + (simple "test") + ]; + systems = ["x86_64-linux"]; + }; + in + builtins.hasAttr "__ren" testFlake; + } + { + name = "merges outputs"; + expected = { + packages = { + test-package = "merged"; + }; + }; + actual = let + testFlake = + rensa.buildWith { + inputs = {}; + cellsFrom = ../cells; + cellBlocks = with rensa.blocks; [ + (simple "test") + ]; + systems = ["x86_64-linux"]; + } { + packages = { + test-package = "merged"; + }; + }; + in { + packages = testFlake.packages; + }; + } + { + name = "eval test"; + type = "script"; + script = '' + ${ntlib.helpers.path [pkgs.gnugrep pkgs.coreutils pkgs.nix]} + ${ntlib.helpers.scriptHelpers} + + result=$(nix eval --impure --expr ' + let + rensa = import ${../lib} {lib = import ${pkgs.path}/lib;}; + testFlake = rensa.build { + inputs = { test = "value"; }; + cellsFrom = ${../cells}; + cellBlocks = []; + systems = [ "x86_64-linux" ]; + }; + in + testFlake.__ren.__schema + ') + + assert "$result == \"v0\"" "should contain version" + ''; + } + ]; + }; +} diff --git a/tests/filter_test.nix b/tests/filter_test.nix new file mode 100644 index 0000000..f45f1a3 --- /dev/null +++ b/tests/filter_test.nix @@ -0,0 +1,51 @@ +{rensa, ...}: { + suites."Filter" = { + pos = __curPos; + tests = [ + { + name = "filter by cell"; + expected = { + x86_64-linux = {}; + }; + actual = let + testFlake = { + __ren = { + cells = ["repo" "other"]; + }; + x86_64-linux = { + repo = { + docs = {value = "docs-value";}; + ci = {value = "ci-value";}; + }; + other = { + packages = {value = "other-packages";}; + }; + }; + }; + in + rensa.filter (_: cell: cell == "repo") testFlake [["*" "*"]]; + } + { + name = "filter by block"; + expected = { + x86_64-linux = {}; + }; + actual = let + testFlake = { + __ren = { + cells = ["repo"]; + }; + x86_64-linux = { + repo = { + docs = {value = "docs-value";}; + ci = {value = "ci-value";}; + packages = {value = "packages-value";}; + }; + }; + }; + in + rensa.filter (block: _: block == "docs") testFlake [["repo" "*"]]; + } + ]; + }; +} diff --git a/tests/loader_test.nix b/tests/loader_test.nix new file mode 100644 index 0000000..9732293 --- /dev/null +++ b/tests/loader_test.nix @@ -0,0 +1,57 @@ +{ + pkgs, + ntlib, + rensa, + ... +}: { + suites."Loader" = { + pos = __curPos; + tests = [ + { + name = "cell sibling access"; + expected = { + hello = "world"; + }; + actual = let + testFlake = rensa.build { + inputs = {}; + cellsFrom = ../cells; + cellBlocks = with rensa.blocks; [ + (simple "test") + ]; + systems = ["x86_64-linux"]; + }; + in + testFlake.x86_64-linux.test.test; + } + { + name = "load file"; + type = "script"; + script = '' + ${ntlib.helpers.path [pkgs.gnugrep pkgs.coreutils pkgs.nix]} + ${ntlib.helpers.scriptHelpers} + + mkdir -p "cells/testcell" + echo '{ hello = "world"; }' > "cells/testcell/packages.nix" + + cat > "flake.nix" << 'EOF' + { + outputs = inputs: let + rensa = import ${../lib} { lib = import "${pkgs.path}/lib"; }; + in rensa.build { + inputs = {}; + cellsFrom = ./cells; + cellBlocks = with rensa.blocks; [ (simple "packages") ]; + systems = [ "x86_64-linux" ]; + }; + } + EOF + + result=$(nix eval --impure .#x86_64-linux.testcell.packages.hello) + + assert "$result == \"world\"" "should equal to world" + ''; + } + ]; + }; +} diff --git a/tests/select_test.nix b/tests/select_test.nix new file mode 100644 index 0000000..823e101 --- /dev/null +++ b/tests/select_test.nix @@ -0,0 +1,49 @@ +{rensa, ...}: { + suites."Select" = { + pos = __curPos; + tests = [ + { + name = "single block"; + expected = { + x86_64-linux = {value = "test-value";}; + }; + actual = let + testFlake = { + __ren = { + cells = ["repo"]; + }; + x86_64-linux = { + repo = { + docs = {value = "test-value";}; + ci = {packages = {value = "ci-packages";};}; + }; + }; + }; + in + rensa.select testFlake [["repo" "docs"]]; + } + { + name = "multiple blocks"; + expected = { + x86_64-linux = {value = "ci-packages";}; + }; + actual = let + testFlake = { + __ren = { + cells = ["repo"]; + }; + x86_64-linux = { + repo = { + ci = {packages = {value = "ci-packages";};}; + other = {value = "ignored";}; + }; + }; + }; + in + rensa.select testFlake [ + ["repo" "ci" "packages"] + ]; + } + ]; + }; +}