From b732e118dfcd8b2f9b8b2302ee96ad0644f9923f Mon Sep 17 00:00:00 2001 From: technofab Date: Tue, 3 Jun 2025 21:45:50 +0200 Subject: [PATCH 01/21] chore: add LICENSE --- LICENSE.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..4e58a63 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2025 TECHNOFAB + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. From 6ee3811b568f6e840a964a8851719638234cd03c Mon Sep 17 00:00:00 2001 From: technofab Date: Sun, 8 Jun 2025 20:52:20 +0200 Subject: [PATCH 02/21] docs: add images & fix typo --- README.md | 4 ++++ docs/images/gitlab_junit_screenshot.png | Bin 0 -> 177182 bytes docs/images/summary_screenshot.png | Bin 0 -> 92412 bytes docs/index.md | 2 ++ docs/usage.md | 2 +- 5 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 docs/images/gitlab_junit_screenshot.png create mode 100644 docs/images/summary_screenshot.png diff --git a/README.md b/README.md index 657bbed..40bae3c 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,16 @@ Flexible test runner for testing Nix code, written in Go. +[![asciicast](https://asciinema.org/a/VS8uIiEQiPRtXbOreJqrxO7X6.svg)](https://asciinema.org/a/VS8uIiEQiPRtXbOreJqrxO7X6) + ## Features - Snapshot, Unit (equal checks) and Script-Tests (unit tests with assertions you could say) - Supports testing against raw Nix code or derivation output - Simple and easy to read summary of test results + ![screenshot](./docs/images/summary_screenshot.png) - Junit report support (eg. for displaying the results in GitLab etc.) + ![screenshot](./docs/images/gitlab_junit_screenshot.png) ## Usage diff --git a/docs/images/gitlab_junit_screenshot.png b/docs/images/gitlab_junit_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..03696afbd9fed66a069b7e5f2096877e15c7ef3e GIT binary patch literal 177182 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%0Do-I{+xf!tMcoyB;MG2kgk6wI^U<%sp1Y|f5v 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%0AKaRuav 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 literal 0 HcmV?d00001 diff --git a/docs/images/summary_screenshot.png b/docs/images/summary_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..af60a6db1ebb4cbfdff3ceb0502c234bd686ba93 GIT binary patch literal 92412 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

pu&|XLJ346<4j?@})w+ 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≧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 Oeq Date: Sun, 8 Jun 2025 20:55:36 +0200 Subject: [PATCH 03/21] docs: update cli help --- docs/cli.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/cli.md b/docs/cli.md index 9c69c9c..943939e 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -3,10 +3,11 @@ ```sh title="nix run .#nixtests:run -- --help" Usage of nixtest: --junit string Path to generate JUNIT report to, leave empty to disable + --no-color Disable coloring --pure Unset all env vars before running script tests - --skip string Regular expression to skip (e.g., 'test-.*|.*-b') + -s, --skip string Regular expression to skip tests (e.g., 'test-.*|.*-b') --snapshot-dir string Directory where snapshots are stored (default "./snapshots") - --tests string Path to JSON file containing tests - --update-snapshots Update all snapshots - --workers int Amount of tests to run in parallel (default 4) + -f, --tests string Path to JSON file containing tests (required) + -u, --update-snapshots Update all snapshots + -w, --workers int Amount of tests to run in parallel (default 4) ``` From 98141a1f5c0c1b48837cbc363cbb8ebf74b5d044 Mon Sep 17 00:00:00 2001 From: technofab Date: Thu, 12 Jun 2025 21:23:28 +0200 Subject: [PATCH 04/21] feat: switch to module system to evaluate suites & tests add autodiscovery feature --- flake.nix | 25 +++++- lib/default.nix | 94 +++++++++++----------- lib/flakeModule.nix | 52 ++---------- lib/lib_test.nix | 44 ++++++++++ lib/module.nix | 192 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 312 insertions(+), 95 deletions(-) create mode 100644 lib/lib_test.nix create mode 100644 lib/module.nix diff --git a/flake.nix b/flake.nix index bcc7b54..e12b9ae 100644 --- a/flake.nix +++ b/flake.nix @@ -236,7 +236,7 @@ ci = { stages = ["test" "build" "deploy"]; jobs = { - "test" = { + "test:flakeModule" = { stage = "test"; script = [ "nix run .#nixtests:run -- --junit=junit.xml" @@ -247,6 +247,17 @@ reports.junit = "junit.xml"; }; }; + "test:lib" = { + stage = "test"; + script = [ + "nix run .#lib-tests -- --junit=junit.xml" + ]; + allow_failure = true; + artifacts = { + when = "always"; + reports.junit = "junit.xml"; + }; + }; "test:go" = { stage = "test"; nix.deps = with pkgs; [go go-junit-report gocover-cobertura]; @@ -300,7 +311,17 @@ }; }; - packages.default = pkgs.callPackage ./package.nix {}; + packages = let + ntlib = import ./lib {inherit pkgs lib;}; + in { + default = pkgs.callPackage ./package.nix {}; + lib-tests = ntlib.mkNixtest { + modules = ntlib.autodiscover {dir = ./lib;}; + args = { + inherit pkgs; + }; + }; + }; }; }; diff --git a/lib/default.nix b/lib/default.nix index e8b7f97..011d50e 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -1,62 +1,64 @@ { pkgs, lib ? pkgs.lib, - self ? "", ... -}: { - mkTest = { - type ? "unit", - name, - description ? "", - format ? "json", - expected ? null, - actual ? null, - actualDrv ? null, - script ? null, - pos ? null, +}: let + inherit (lib) evalModules toList; +in rec { + mkBinary = { + nixtests, + extraParams, }: let - fileRelative = lib.removePrefix ((toString self) + "/") pos.file; - actual' = - if format == "json" - then actual - else lib.generators.toPretty {} actual; - expected' = - if format == "json" - then expected - else lib.generators.toPretty {} expected; + program = pkgs.callPackage ../package.nix {}; in - assert lib.assertMsg (!(type == "script" && script == null)) "test ${name} has type 'script' but no script was passed"; { - inherit type name description; - actual = actual'; - expected = expected'; - # discard string context, otherwise it's being built instantly which we don't want - actualDrv = builtins.unsafeDiscardStringContext (actualDrv.drvPath or ""); - script = - if script != null - then - builtins.unsafeDiscardStringContext - (pkgs.writeShellScript "nixtest-${name}" '' - # show which line failed the test - set -x - ${script} - '').drvPath - else null; - pos = - if pos == null - then "" - else "${fileRelative}:${toString pos.line}"; + (pkgs.writeShellScriptBin "nixtests:run" '' + ${program}/bin/nixtest --tests=${nixtests} ${extraParams} "$@" + '') + // { + tests = nixtests; }; - mkSuite = name: tests: { - inherit name tests; - }; + exportSuites = suites: let suitesList = if builtins.isList suites then suites else [suites]; - testsMapped = builtins.toJSON suitesList; + suitesMapped = builtins.toJSON suitesList; in pkgs.runCommand "tests.json" {} '' - echo '${testsMapped}' > $out + echo '${suitesMapped}' > $out ''; + + module = import ./module.nix {inherit lib pkgs;}; + + autodiscover = { + dir, + pattern ? ".*_test.nix", + }: let + files = builtins.readDir dir; + matchingFiles = builtins.filter (name: builtins.match pattern name != null) (builtins.attrNames files); + imports = map (file: /${dir}/${file}) matchingFiles; + in { + inherit imports; + # automatically set the base so test filepaths are easier to read + config.base = builtins.toString dir + "/"; + }; + + mkNixtestConfig = { + modules, + args, + ... + }: + (evalModules { + modules = + (toList modules) + ++ [ + module + { + _module.args = args; + } + ]; + }).config; + + mkNixtest = args: (mkNixtestConfig args).app; } diff --git a/lib/flakeModule.nix b/lib/flakeModule.nix index 6068aea..1d7e406 100644 --- a/lib/flakeModule.nix +++ b/lib/flakeModule.nix @@ -15,56 +15,14 @@ in { nixtests-lib = import ./. {inherit pkgs self;}; in { options.nixtest = mkOption { - type = types.submodule ({...}: { - options = { - skip = mkOption { - type = types.str; - default = ""; - description = "Which tests to skip (regex)"; - }; - suites = mkOption { - type = types.attrsOf (types.submodule { - options = { - tests = mkOption { - type = types.listOf types.attrs; - default = []; - }; - pos = mkOption { - type = types.nullOr types.attrs; - default = null; - }; - }; - }); - default = {}; - }; - }; - }); + type = types.submodule (nixtests-lib.module); default = {}; }; + config.nixtest.base = toString self + "/"; - config.legacyPackages = rec { - "nixtests" = let - suites = map (suiteName: let - suite = builtins.getAttr suiteName config.nixtest.suites; - in - nixtests-lib.mkSuite - suiteName - (map (test: - nixtests-lib.mkTest ({ - # default pos to suite's pos if given - pos = suite.pos; - } - // test)) - suite.tests)) - (builtins.attrNames config.nixtest.suites); - in - nixtests-lib.exportSuites suites; - "nixtests:run" = let - program = pkgs.callPackage ./../package.nix {}; - in - pkgs.writeShellScriptBin "nixtests:run" '' - ${program}/bin/nixtest --tests=${nixtests} --skip="${config.nixtest.skip}" "$@" - ''; + config.legacyPackages = { + "nixtests" = config.nixtest.finalConfigJson; + "nixtests:run" = config.nixtest.app; }; } ); diff --git a/lib/lib_test.nix b/lib/lib_test.nix new file mode 100644 index 0000000..6a47538 --- /dev/null +++ b/lib/lib_test.nix @@ -0,0 +1,44 @@ +{ + pkgs, + lib, + ... +}: let + ntlib = import ./. {inherit pkgs lib;}; +in { + suites."Lib Tests".tests = [ + { + name = "autodiscovery"; + type = "script"; + script = let + actual = builtins.toFile "actual" (builtins.toJSON (ntlib.autodiscover { + dir = ./.; + })); + in + # sh + '' + export PATH="${pkgs.gnugrep}/bin" + grep -q lib_test.nix ${actual} + grep -q "\"base\":\"/nix/store/.*-source/lib/" ${actual} + ''; + } + { + name = "binary"; + type = "script"; + script = let + binary = + (ntlib.mkBinary { + nixtests = "stub"; + extraParams = "--pure"; + }) + + "/bin/nixtests:run"; + in + # sh + '' + export PATH="${pkgs.gnugrep}/bin" + grep -q nixtest ${binary} + grep -q -- "--pure" ${binary} + grep -q -- "--tests=stub" ${binary} + ''; + } + ]; +} diff --git a/lib/module.nix b/lib/module.nix new file mode 100644 index 0000000..db5d5b9 --- /dev/null +++ b/lib/module.nix @@ -0,0 +1,192 @@ +{ + pkgs, + lib, + ... +}: let + inherit (lib) mkOptionType mkOption types; + + nixtest-lib = import ./default.nix {inherit pkgs lib;}; + + unsetType = mkOptionType { + name = "unset"; + description = "unset"; + descriptionClass = "noun"; + check = value: true; + }; + unset = { + _type = "unset"; + }; + isUnset = lib.isType "unset"; + + filterUnset = value: + if builtins.isAttrs value && !builtins.hasAttr "_type" value + then let + filteredAttrs = builtins.mapAttrs (n: v: filterUnset v) value; + in + lib.filterAttrs (name: value: (!isUnset value)) filteredAttrs + else if builtins.isList value + then builtins.filter (elem: !isUnset elem) (map filterUnset value) + else value; + + testsSubmodule = { + config, + testsBase, + pos, + ... + }: { + options = { + pos = mkOption { + type = types.either types.attrs unsetType; + default = pos; + apply = val: + if isUnset val + then val + else let + fileRelative = lib.removePrefix testsBase val.file; + in "${fileRelative}:${toString val.line}"; + }; + type = mkOption { + type = types.enum ["unit" "snapshot" "script"]; + default = "unit"; + apply = value: + assert lib.assertMsg (value != "script" || !isUnset config.script) + "test '${config.name}' as type 'script' requires 'script' to be set"; + assert lib.assertMsg (value != "unit" || !isUnset config.expected) + "test '${config.name}' as type 'unit' requires 'expected' to be set"; + assert lib.assertMsg ( + let + actualIsUnset = isUnset config.actual; + actualDrvIsUnset = isUnset config.actualDrv; + in + (value != "unit") + || (!actualIsUnset && actualDrvIsUnset) + || (actualIsUnset && !actualDrvIsUnset) + ) + "test '${config.name}' as type 'unit' requires only 'actual' OR 'actualDrv' to be set"; value; + }; + name = mkOption { + type = types.str; + }; + description = mkOption { + type = types.either types.str unsetType; + default = unset; + }; + format = mkOption { + type = types.enum ["json" "pretty"]; + default = "json"; + }; + expected = mkOption { + type = types.anything; + default = unset; + apply = val: + if isUnset val || config.format == "json" + then val + else lib.generators.toPretty {} val; + }; + actual = mkOption { + type = types.anything; + default = unset; + apply = val: + if isUnset val || config.format == "json" + then val + else lib.generators.toPretty {} val; + }; + actualDrv = mkOption { + type = types.either types.package unsetType; + default = unset; + apply = val: + # keep unset value + if isUnset val + then val + else builtins.unsafeDiscardStringContext (val.drvPath or ""); + }; + script = mkOption { + type = types.either types.str unsetType; + default = unset; + apply = val: + if isUnset val + then val + else + builtins.unsafeDiscardStringContext + (pkgs.writeShellScript "nixtest-${config.name}" '' + # show which line failed the test + set -x + ${val} + '').drvPath; + }; + }; + }; + + suitesSubmodule = { + name, + config, + testsBase, + ... + }: { + options = { + name = mkOption { + type = types.str; + default = name; + }; + pos = mkOption { + type = types.either types.attrs unsetType; + default = unset; + }; + tests = mkOption { + type = types.listOf (types.submoduleWith { + modules = [testsSubmodule]; + specialArgs = { + inherit (config) pos; + inherit testsBase; + }; + }); + default = []; + }; + }; + }; + + nixtestSubmodule = {config, ...}: { + options = { + base = mkOption { + description = "Base directory of the tests, will be removed from the test file path"; + type = types.str; + default = ""; + }; + skip = mkOption { + type = types.str; + default = ""; + }; + suites = mkOption { + type = types.attrsOf (types.submoduleWith { + modules = [suitesSubmodule]; + specialArgs = { + testsBase = config.base; + }; + }); + default = {}; + apply = suites: + map ( + n: filterUnset (builtins.removeAttrs suites.${n} ["pos"]) + ) + (builtins.attrNames suites); + }; + + finalConfigJson = mkOption { + internal = true; + type = types.package; + }; + app = mkOption { + internal = true; + type = types.package; + }; + }; + config = { + finalConfigJson = nixtest-lib.exportSuites config.suites; + app = nixtest-lib.mkBinary { + nixtests = config.finalConfigJson; + extraParams = ''--skip="${config.skip}"''; + }; + }; + }; +in + nixtestSubmodule From 4a8ccdf34cff2c91bab5fa906f6ed4e6b0e928de Mon Sep 17 00:00:00 2001 From: technofab Date: Fri, 13 Jun 2025 15:25:08 +0200 Subject: [PATCH 05/21] chore(cli): handle help command manually to exit 0 --- internal/config/config.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/internal/config/config.go b/internal/config/config.go index f0b41e6..9eef9bb 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -1,6 +1,9 @@ package config import ( + "fmt" + "os" + "github.com/jedib0t/go-pretty/v6/text" "github.com/rs/zerolog/log" flag "github.com/spf13/pflag" @@ -28,9 +31,16 @@ func Load() AppConfig { flag.StringVarP(&cfg.SkipPattern, "skip", "s", "", "Regular expression to skip tests (e.g., 'test-.*|.*-b')") flag.BoolVar(&cfg.PureEnv, "pure", false, "Unset all env vars before running script tests") flag.BoolVar(&cfg.NoColor, "no-color", false, "Disable coloring") + helpRequested := flag.BoolP("help", "h", false, "Show this menu") flag.Parse() + if *helpRequested { + fmt.Println("Usage of nixtest:") + flag.PrintDefaults() + os.Exit(0) + } + if cfg.TestsFile == "" { log.Panic().Msg("Tests file path (-f or --tests) is required.") } From 001b575f31f45409b953371a56509ed3f2035f08 Mon Sep 17 00:00:00 2001 From: technofab Date: Fri, 13 Jun 2025 15:43:21 +0200 Subject: [PATCH 06/21] chore(module): remove "set -x" addition in script tests --- lib/module.nix | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/module.nix b/lib/module.nix index db5d5b9..14746e4 100644 --- a/lib/module.nix +++ b/lib/module.nix @@ -108,11 +108,7 @@ then val else builtins.unsafeDiscardStringContext - (pkgs.writeShellScript "nixtest-${config.name}" '' - # show which line failed the test - set -x - ${val} - '').drvPath; + (pkgs.writeShellScript "nixtest-${config.name}" val).drvPath; }; }; }; From bed029f4a90b886bb85aef76264e5af40d0d3938 Mon Sep 17 00:00:00 2001 From: technofab Date: Fri, 13 Jun 2025 15:44:16 +0200 Subject: [PATCH 07/21] feat: add test helpers default args to {} --- lib/default.nix | 4 +++- lib/scriptHelpers.sh | 51 ++++++++++++++++++++++++++++++++++++++++++++ lib/testHelpers.nix | 5 +++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 lib/scriptHelpers.sh create mode 100644 lib/testHelpers.nix diff --git a/lib/default.nix b/lib/default.nix index 011d50e..2aa3683 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -5,6 +5,8 @@ }: let inherit (lib) evalModules toList; in rec { + helpers = import ./testHelpers.nix {inherit lib;}; + mkBinary = { nixtests, extraParams, @@ -46,7 +48,7 @@ in rec { mkNixtestConfig = { modules, - args, + args ? {}, ... }: (evalModules { diff --git a/lib/scriptHelpers.sh b/lib/scriptHelpers.sh new file mode 100644 index 0000000..0b59829 --- /dev/null +++ b/lib/scriptHelpers.sh @@ -0,0 +1,51 @@ +output= +exit_code= + +function assert() { + test $1 || { echo "Assertion '$1' failed: $2" >&2; exit 1; } +} +function assert_eq() { + assert "$1 -eq $2" "$3" +} +function assert_not_eq() { + assert "$1 -ne $2" "$3" +} +function assert_contains() { + echo "$1" | grep -q -- "$2" || { + echo "Assertion failed: $3. $1 does not contain $2" >&2; + exit 1; + } +} +function assert_not_contains() { + echo "$1" | grep -q -- "$2" && { + echo "Assertion failed: $3. $1 does contain $2" >&2; + exit 1; + } +} +function assert_file_contains() { + grep -q -- "$2" $1 || { + echo "Assertion failed: $3. $1 does not contain $2" >&2; + exit 1; + } +} +function assert_file_not_contains() { + grep -q -- "$2" $1 && { + echo "Assertion failed: $3. $1 does contain $2" >&2; + exit 1; + } +} + +function tmpdir() { + dir=$(mktemp -d) + trap "rm -rf $dir" EXIT + echo -n "$dir" +} +function tmpfile() { + file=$(mktemp) + trap "rm -f $file" EXIT + echo -n "$file" +} +function run() { + output=$($@ 2>&1) + exit_code=$? +} diff --git a/lib/testHelpers.nix b/lib/testHelpers.nix new file mode 100644 index 0000000..c29618d --- /dev/null +++ b/lib/testHelpers.nix @@ -0,0 +1,5 @@ +{lib, ...}: { + path = pkgs: "export PATH=${lib.makeBinPath pkgs}"; + pathAdd = pkgs: "export PATH=$PATH:${lib.makeBinPath pkgs}"; + scriptHelpers = builtins.readFile ./scriptHelpers.sh; +} From 006537e6abbcb6d6b78dd1c76e1c937b01378abd Mon Sep 17 00:00:00 2001 From: technofab Date: Fri, 13 Jun 2025 15:46:52 +0200 Subject: [PATCH 08/21] test: nest sample tests as fixtures in real tests also use new test helpers --- flake.nix | 101 +-------------------------------- lib/lib_test.nix | 44 -------------- tests/fixtures/sample_test.nix | 97 +++++++++++++++++++++++++++++++ tests/lib_test.nix | 86 ++++++++++++++++++++++++++++ 4 files changed, 186 insertions(+), 142 deletions(-) delete mode 100644 lib/lib_test.nix create mode 100644 tests/fixtures/sample_test.nix create mode 100644 tests/lib_test.nix diff --git a/flake.nix b/flake.nix index e12b9ae..da50a26 100644 --- a/flake.nix +++ b/flake.nix @@ -11,7 +11,6 @@ inputs.nix-gitlab-ci.flakeModule inputs.nix-devtools.flakeModule inputs.nix-mkdocs.flakeModule - ./lib/flakeModule.nix ]; systems = import systems; flake = {}; @@ -63,100 +62,6 @@ }; }; - nixtest = { - skip = "skip.*d"; - suites = { - "suite-one" = { - pos = __curPos; - tests = [ - { - name = "test-one"; - # required to figure out file and line, but optional - expected = 1; - actual = 1; - } - { - name = "fail"; - expected = 0; - actual = "meow"; - } - { - name = "snapshot-test"; - type = "snapshot"; - actual = "test"; - } - { - name = "test-snapshot-drv"; - type = "snapshot"; - actualDrv = pkgs.runCommand "test-snapshot" {} '' - echo '"snapshot drv"' > $out - ''; - } - { - name = "test-error-drv"; - expected = null; - actualDrv = pkgs.runCommand "test-error-drv" {} '' - echo "This works, but its better to just write 'fail' to \$out and expect 'success' or sth." - exit 1 - ''; - } - { - name = "test-script"; - type = "script"; - script = '' - echo Test something here - # required in pure mode: - export PATH="${lib.makeBinPath [pkgs.gnugrep]}" - grep -q "test" ${builtins.toFile "test" "test"} - ''; - } - ]; - }; - "other-suite".tests = [ - { - name = "obj-snapshot"; - type = "snapshot"; - pos = __curPos; - actual = {hello = "world";}; - } - { - name = "pretty-snapshot"; - type = "snapshot"; - format = "pretty"; - pos = __curPos; - actual = { - example = args: {}; - example2 = { - drv = pkgs.hello; - }; - }; - } - { - name = "pretty-unit"; - format = "pretty"; - pos = __curPos; - expected = pkgs.hello; - actual = pkgs.hello; - } - { - name = "test-drv"; - pos = __curPos; - expected = {a = "b";}; - actualDrv = pkgs.runCommand "test-something" {} '' - echo "Simulating taking some time" - sleep 1 - echo '{"a":"b"}' > $out - ''; - } - { - name = "skipped"; - expected = null; - actual = null; - } - ]; - }; - }; - doc = { path = ./docs; deps = pp: [ @@ -315,10 +220,10 @@ ntlib = import ./lib {inherit pkgs lib;}; in { default = pkgs.callPackage ./package.nix {}; - lib-tests = ntlib.mkNixtest { - modules = ntlib.autodiscover {dir = ./lib;}; + tests = ntlib.mkNixtest { + modules = ntlib.autodiscover {dir = ./tests;}; args = { - inherit pkgs; + inherit pkgs ntlib; }; }; }; diff --git a/lib/lib_test.nix b/lib/lib_test.nix deleted file mode 100644 index 6a47538..0000000 --- a/lib/lib_test.nix +++ /dev/null @@ -1,44 +0,0 @@ -{ - pkgs, - lib, - ... -}: let - ntlib = import ./. {inherit pkgs lib;}; -in { - suites."Lib Tests".tests = [ - { - name = "autodiscovery"; - type = "script"; - script = let - actual = builtins.toFile "actual" (builtins.toJSON (ntlib.autodiscover { - dir = ./.; - })); - in - # sh - '' - export PATH="${pkgs.gnugrep}/bin" - grep -q lib_test.nix ${actual} - grep -q "\"base\":\"/nix/store/.*-source/lib/" ${actual} - ''; - } - { - name = "binary"; - type = "script"; - script = let - binary = - (ntlib.mkBinary { - nixtests = "stub"; - extraParams = "--pure"; - }) - + "/bin/nixtests:run"; - in - # sh - '' - export PATH="${pkgs.gnugrep}/bin" - grep -q nixtest ${binary} - grep -q -- "--pure" ${binary} - grep -q -- "--tests=stub" ${binary} - ''; - } - ]; -} diff --git a/tests/fixtures/sample_test.nix b/tests/fixtures/sample_test.nix new file mode 100644 index 0000000..dcc2fb1 --- /dev/null +++ b/tests/fixtures/sample_test.nix @@ -0,0 +1,97 @@ +{ + lib, + pkgs, + ... +}: { + skip = "skip.*d"; + suites = { + "suite-one" = { + # required to figure out file and line, but optional + pos = __curPos; + tests = [ + { + name = "test-one"; + expected = 1; + actual = 1; + } + { + name = "fail"; + expected = 0; + actual = "meow"; + } + { + name = "snapshot-test"; + type = "snapshot"; + actual = "test"; + } + { + name = "test-snapshot-drv"; + type = "snapshot"; + actualDrv = pkgs.runCommand "test-snapshot" {} '' + echo '"snapshot drv"' > $out + ''; + } + { + name = "test-error-drv"; + expected = null; + actualDrv = pkgs.runCommand "test-error-drv" {} '' + echo "This works, but its better to just write 'fail' to \$out and expect 'success' or sth." + exit 1 + ''; + } + { + name = "test-script"; + type = "script"; + script = '' + echo Test something here + # required in pure mode: + export PATH="${lib.makeBinPath [pkgs.gnugrep]}" + grep -q "test" ${builtins.toFile "test" "test"} + ''; + } + ]; + }; + "other-suite".tests = [ + { + name = "obj-snapshot"; + type = "snapshot"; + pos = __curPos; + actual = {hello = "world";}; + } + { + name = "pretty-snapshot"; + type = "snapshot"; + format = "pretty"; + pos = __curPos; + actual = { + example = args: {}; + example2 = { + drv = pkgs.hello; + }; + }; + } + { + name = "pretty-unit"; + format = "pretty"; + pos = __curPos; + expected = pkgs.hello; + actual = pkgs.hello; + } + { + name = "test-drv"; + pos = __curPos; + expected = {a = "b";}; + actualDrv = pkgs.runCommand "test-something" {} '' + echo "Simulating taking some time" + sleep 1 + echo '{"a":"b"}' > $out + ''; + } + { + name = "skipped"; + expected = null; + actual = null; + } + ]; + }; +} diff --git a/tests/lib_test.nix b/tests/lib_test.nix new file mode 100644 index 0000000..bf21649 --- /dev/null +++ b/tests/lib_test.nix @@ -0,0 +1,86 @@ +{ + lib, + pkgs, + ntlib, + ... +}: { + suites."Lib Tests".tests = [ + { + name = "autodiscovery"; + type = "script"; + script = let + actual = builtins.toFile "actual" (builtins.toJSON (ntlib.autodiscover { + dir = ./fixtures; + })); + in + # sh + '' + ${ntlib.helpers.path [pkgs.gnugrep]} + ${ntlib.helpers.scriptHelpers} + assert_file_contains ${actual} "sample_test.nix" "should find sample_test.nix" + assert_file_contains ${actual} "\"base\":\"/nix/store/.*-source/tests/fixtures" "should set base to fixtures dir" + ''; + } + { + name = "binary"; + type = "script"; + script = let + binary = + (ntlib.mkBinary { + nixtests = "stub"; + extraParams = "--pure"; + }) + + "/bin/nixtests:run"; + in + # sh + '' + ${ntlib.helpers.path [pkgs.gnugrep]} + ${ntlib.helpers.scriptHelpers} + assert_file_contains ${binary} "nixtest" "should contain nixtest" + assert_file_contains ${binary} "--pure" "should contain --pure arg" + assert_file_contains ${binary} "--tests=stub" "should contain --tests arg" + + run "${binary} --help" + assert_eq $exit_code 0 "should exit 0" + assert_contains "$output" "Usage of nixtest" "should show help" + + run "${binary}" + assert_eq $exit_code 1 "should exit 1" + assert_contains "$output" "Tests file does not exist" + ''; + } + { + name = "full run with fixtures"; + type = "script"; + script = let + binary = + (ntlib.mkNixtest { + modules = ntlib.autodiscover {dir = ./fixtures;}; + args = {inherit pkgs;}; + }) + + "/bin/nixtests:run"; + in + # sh + '' + ${ntlib.helpers.path [pkgs.gnugrep pkgs.mktemp]} + ${ntlib.helpers.scriptHelpers} + + TMPDIR=$(tmpdir) + run "${binary} --pure --junit=$TMPDIR/junit.xml" + assert "$exit_code -eq 2" "should exit 2" + assert "-f $TMPDIR/junit.xml" "should create junit.xml" + assert_contains "$output" "executable file not found" "nix should not be found in pure mode" + + ${ntlib.helpers.pathAdd [pkgs.nix pkgs.coreutils]} + run "${binary} --pure --junit=$TMPDIR/junit2.xml" + assert "$exit_code -eq 2" "should exit 2" + assert "-f $TMPDIR/junit2.xml" "should create junit2.xml" + assert_not_contains "$output" "executable file not found" "nix should now exist" + assert_contains "$output" "suite-one" "should contain suite-one" + assert_contains "$output" "8/11 (1 SKIPPED)" "should be 8/11 total" + assert_contains "$output" "ERROR" "should contain an error" + assert_contains "$output" "SKIP" "should contain a skip" + ''; + } + ]; +} From 3f1b6317b4c43ab0e17c194f02c6a8ec138360fe Mon Sep 17 00:00:00 2001 From: technofab Date: Fri, 13 Jun 2025 15:48:19 +0200 Subject: [PATCH 09/21] ci: remove flakeModule test job --- flake.nix | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/flake.nix b/flake.nix index da50a26..f0a2570 100644 --- a/flake.nix +++ b/flake.nix @@ -141,21 +141,10 @@ ci = { stages = ["test" "build" "deploy"]; jobs = { - "test:flakeModule" = { - stage = "test"; - script = [ - "nix run .#nixtests:run -- --junit=junit.xml" - ]; - allow_failure = true; - artifacts = { - when = "always"; - reports.junit = "junit.xml"; - }; - }; "test:lib" = { stage = "test"; script = [ - "nix run .#lib-tests -- --junit=junit.xml" + "nix run .#tests -- --junit=junit.xml" ]; allow_failure = true; artifacts = { From 4a55db97979b8b06ebd68b4b0772fcb76d79d2fa Mon Sep 17 00:00:00 2001 From: technofab Date: Fri, 13 Jun 2025 20:47:26 +0200 Subject: [PATCH 10/21] chore: add more helpers & add pos to test suite --- lib/testHelpers.nix | 2 + tests/lib_test.nix | 156 +++++++++++++++++++++++--------------------- 2 files changed, 82 insertions(+), 76 deletions(-) diff --git a/lib/testHelpers.nix b/lib/testHelpers.nix index c29618d..0edb595 100644 --- a/lib/testHelpers.nix +++ b/lib/testHelpers.nix @@ -2,4 +2,6 @@ path = pkgs: "export PATH=${lib.makeBinPath pkgs}"; pathAdd = pkgs: "export PATH=$PATH:${lib.makeBinPath pkgs}"; scriptHelpers = builtins.readFile ./scriptHelpers.sh; + toJsonFile = any: builtins.toFile "actual" (builtins.toJSON any); + toPrettyFile = any: builtins.toFile "actual" (lib.generators.toPretty {} any); } diff --git a/tests/lib_test.nix b/tests/lib_test.nix index bf21649..4437cf3 100644 --- a/tests/lib_test.nix +++ b/tests/lib_test.nix @@ -1,86 +1,90 @@ { - lib, pkgs, ntlib, ... }: { - suites."Lib Tests".tests = [ - { - name = "autodiscovery"; - type = "script"; - script = let - actual = builtins.toFile "actual" (builtins.toJSON (ntlib.autodiscover { - dir = ./fixtures; - })); - in - # sh - '' - ${ntlib.helpers.path [pkgs.gnugrep]} - ${ntlib.helpers.scriptHelpers} - assert_file_contains ${actual} "sample_test.nix" "should find sample_test.nix" - assert_file_contains ${actual} "\"base\":\"/nix/store/.*-source/tests/fixtures" "should set base to fixtures dir" - ''; - } - { - name = "binary"; - type = "script"; - script = let - binary = - (ntlib.mkBinary { - nixtests = "stub"; - extraParams = "--pure"; - }) - + "/bin/nixtests:run"; - in - # sh - '' - ${ntlib.helpers.path [pkgs.gnugrep]} - ${ntlib.helpers.scriptHelpers} - assert_file_contains ${binary} "nixtest" "should contain nixtest" - assert_file_contains ${binary} "--pure" "should contain --pure arg" - assert_file_contains ${binary} "--tests=stub" "should contain --tests arg" + suites."Lib Tests" = { + pos = __curPos; + tests = [ + { + name = "autodiscovery"; + type = "script"; + script = let + actual = ntlib.helpers.toPrettyFile (ntlib.autodiscover { + dir = ./fixtures; + }); + in + # sh + '' + ${ntlib.helpers.path [pkgs.gnugrep]} + ${ntlib.helpers.scriptHelpers} + assert_file_contains ${actual} "sample_test.nix" "should find sample_test.nix" + assert_file_contains ${actual} "base = \"/nix/store/.*-source/tests/fixtures/\"" "should set base to fixtures dir" + ''; + } + { + name = "binary"; + type = "script"; + script = let + binary = + (ntlib.mkBinary { + nixtests = "stub"; + extraParams = "--pure"; + }) + + "/bin/nixtests:run"; + in + # sh + '' + ${ntlib.helpers.path [pkgs.gnugrep]} + ${ntlib.helpers.scriptHelpers} + assert_file_contains ${binary} "nixtest" "should contain nixtest" + assert_file_contains ${binary} "--pure" "should contain --pure arg" + assert_file_contains ${binary} "--tests=stub" "should contain --tests arg" - run "${binary} --help" - assert_eq $exit_code 0 "should exit 0" - assert_contains "$output" "Usage of nixtest" "should show help" + run "${binary} --help" + assert_eq $exit_code 0 "should exit 0" + assert_contains "$output" "Usage of nixtest" "should show help" - run "${binary}" - assert_eq $exit_code 1 "should exit 1" - assert_contains "$output" "Tests file does not exist" - ''; - } - { - name = "full run with fixtures"; - type = "script"; - script = let - binary = - (ntlib.mkNixtest { - modules = ntlib.autodiscover {dir = ./fixtures;}; - args = {inherit pkgs;}; - }) - + "/bin/nixtests:run"; - in - # sh - '' - ${ntlib.helpers.path [pkgs.gnugrep pkgs.mktemp]} - ${ntlib.helpers.scriptHelpers} + run "${binary}" + assert_eq $exit_code 1 "should exit 1" + assert_contains "$output" "Tests file does not exist" + ''; + } + { + name = "full run with fixtures"; + type = "script"; + script = let + binary = + (ntlib.mkNixtest { + modules = ntlib.autodiscover {dir = ./fixtures;}; + args = {inherit pkgs;}; + }) + + "/bin/nixtests:run"; + in + # sh + '' + ${ntlib.helpers.path [pkgs.gnugrep pkgs.mktemp]} + ${ntlib.helpers.scriptHelpers} - TMPDIR=$(tmpdir) - run "${binary} --pure --junit=$TMPDIR/junit.xml" - assert "$exit_code -eq 2" "should exit 2" - assert "-f $TMPDIR/junit.xml" "should create junit.xml" - assert_contains "$output" "executable file not found" "nix should not be found in pure mode" + TMPDIR=$(tmpdir) + # start without nix & env binaries to expect errors + run "${binary} --pure --junit=$TMPDIR/junit.xml" + assert "$exit_code -eq 2" "should exit 2" + assert "-f $TMPDIR/junit.xml" "should create junit.xml" + assert_contains "$output" "executable file not found" "nix should not be found in pure mode" - ${ntlib.helpers.pathAdd [pkgs.nix pkgs.coreutils]} - run "${binary} --pure --junit=$TMPDIR/junit2.xml" - assert "$exit_code -eq 2" "should exit 2" - assert "-f $TMPDIR/junit2.xml" "should create junit2.xml" - assert_not_contains "$output" "executable file not found" "nix should now exist" - assert_contains "$output" "suite-one" "should contain suite-one" - assert_contains "$output" "8/11 (1 SKIPPED)" "should be 8/11 total" - assert_contains "$output" "ERROR" "should contain an error" - assert_contains "$output" "SKIP" "should contain a skip" - ''; - } - ]; + # now add required deps + ${ntlib.helpers.pathAdd [pkgs.nix pkgs.coreutils]} + run "${binary} --pure --junit=$TMPDIR/junit2.xml" + assert "$exit_code -eq 2" "should exit 2" + assert "-f $TMPDIR/junit2.xml" "should create junit2.xml" + assert_not_contains "$output" "executable file not found" "nix should now exist" + assert_contains "$output" "suite-one" "should contain suite-one" + assert_contains "$output" "8/11 (1 SKIPPED)" "should be 8/11 total" + assert_contains "$output" "ERROR" "should contain an error" + assert_contains "$output" "SKIP" "should contain a skip" + ''; + } + ]; + }; } From 116f905b6c1df01f7c2dddef4f662abd0fcb5d42 Mon Sep 17 00:00:00 2001 From: technofab Date: Sat, 14 Jun 2025 15:16:25 +0200 Subject: [PATCH 11/21] chore(testHelpers): remove string context in toJsonFile --- lib/testHelpers.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/testHelpers.nix b/lib/testHelpers.nix index 0edb595..c86a6a8 100644 --- a/lib/testHelpers.nix +++ b/lib/testHelpers.nix @@ -2,6 +2,6 @@ path = pkgs: "export PATH=${lib.makeBinPath pkgs}"; pathAdd = pkgs: "export PATH=$PATH:${lib.makeBinPath pkgs}"; scriptHelpers = builtins.readFile ./scriptHelpers.sh; - toJsonFile = any: builtins.toFile "actual" (builtins.toJSON any); + toJsonFile = any: builtins.toFile "actual" (builtins.unsafeDiscardStringContext (builtins.toJSON any)); toPrettyFile = any: builtins.toFile "actual" (lib.generators.toPretty {} any); } From bc36c39b0929bdfaab0908d8bd852c2114e3383f Mon Sep 17 00:00:00 2001 From: technofab Date: Sat, 14 Jun 2025 17:23:24 +0200 Subject: [PATCH 12/21] docs: document new lib functions & usage --- docs/examples.md | 4 +++- docs/reference.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++ docs/usage.md | 40 ++++++++++++++++++++++++++++++----- flake.nix | 2 ++ 4 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 docs/reference.md diff --git a/docs/examples.md b/docs/examples.md index 4e3ad41..c61c754 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -1,4 +1,6 @@ # Example Configs +- [nixtest itself](https://gitlab.com/TECHNOFAB/nixtest) + see `flake.nix` and `tests/` - [TECHNOFAB/nix-gitlab-ci](https://gitlab.com/TECHNOFAB/nix-gitlab-ci) - see tests/ + see `tests/` diff --git a/docs/reference.md b/docs/reference.md new file mode 100644 index 0000000..fe9d7cb --- /dev/null +++ b/docs/reference.md @@ -0,0 +1,53 @@ +# Reference + +## `flakeModule` + +The `flakeModule` for [flake-parts](https://flake.parts). + +## `lib` + +### `module` + +The nix module for validation of inputs etc. +Used internally by `mkNixtestConfig`. + +### `autodiscover` + +```nix +autodiscover { + dir, + pattern ? ".*_test.nix", +} +``` + +Finds all test files in `dir` matching `pattern`. +Returns a list of modules (can be passed to `mkNixtest`'s `modules` arg). + +### `mkNixtestConfig` + +```nix +mkNixtestConfig { + modules, + args ? {}, +} +``` + +Evaluates the test `modules`. +`args` are passed to the modules using `_module.args = args`. + +**Noteworthy attributes**: + +- `app`: nixtest wrapper +- `finalConfigJson`: derivation containing the tests json file + +### `mkNixtest` + +```nix +mkNixtest { + modules, + args ? {}, +} +``` + +Creates the nixtest wrapper, using the tests in `modules`. +Basically `(mkNixtestConfig ).app`. diff --git a/docs/usage.md b/docs/usage.md index fbcccb3..a329017 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -2,6 +2,9 @@ ## Flake Module +The easiest way to use Nixtest is probably using the flakeModule. +Just import `nixtest.flakeModule`, then define suites and tests in `perSystem`: + ```nix { inputs.nixtest.url = "gitlab:TECHNOFAB/nixtest?dir=lib"; @@ -34,10 +37,25 @@ ## Library -You can also integrate nixtest in your own workflow by using the lib functions directly. -Check out `flakeModule.nix` to see how it's used there. +You can also use the lib directly, like this for example: - +```nix +packages.tests = ntlib.mkNixtest { + modules = ntlib.autodiscover {dir = ./tests;}; + args = { + inherit pkgs ntlib; + }; +}; +``` + +This will auto-discover all test files ending with `_test.nix`. +See [reference](reference.md) for all params to `autodiscover`. + +`ntlib` can be defined like this: + +```nix +ntlib = inputs.nixtests.lib {inherit pkgs;}; +``` ## Define Tests @@ -84,9 +102,17 @@ Examples: # to make it more reproducible and cleaner, use --pure to switch to pure # mode which will unset all env variables before running the test. That # requires you to set PATH yourself then: + # + # '' + # export PATH="${lib.makeBinPath [pkgs.gnugrep]}" + # grep -q "test" ${builtins.toFile "test" "test"} + # ''; + # + # you can also use the helpers to make it nicer to read: '' - export PATH="${lib.makeBinPath [pkgs.gnugrep]}" - grep -q "test" ${builtins.toFile "test" "test"} + ${ntlib.helpers.path [pkgs.gnugrep]} + ${ntlib.helpers.scriptHelpers} # this adds helpers like assert etc. + assert_file_contains ${builtins.toFile "test" "test"} "test" "file should contain 'test'" ''; } { @@ -102,3 +128,7 @@ Examples: } ] ``` + +!!! note + + for more examples see [examples](./examples.md) diff --git a/flake.nix b/flake.nix index f0a2570..72f86bd 100644 --- a/flake.nix +++ b/flake.nix @@ -106,11 +106,13 @@ nav = [ {"Introduction" = "index.md";} {"Usage" = "usage.md";} + {"Reference" = "reference.md";} {"CLI" = "cli.md";} {"Example Configs" = "examples.md";} ]; markdown_extensions = [ "pymdownx.superfences" + "admonition" ]; extra.analytics = { provider = "umami"; From d7e4902fede9e03073207a3f3f1ca34c9d0e1c70 Mon Sep 17 00:00:00 2001 From: technofab Date: Wed, 30 Jul 2025 21:29:16 +0200 Subject: [PATCH 13/21] fix(README): fix badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 40bae3c..f3c2b85 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![built with nix](https://img.shields.io/static/v1?logo=nixos&logoColor=white&label=&message=Built%20with%20Nix&color=41439a)](https://builtwithnix.org) [![pipeline status](https://gitlab.com/TECHNOFAB/nixtest/badges/main/pipeline.svg)](https://gitlab.com/TECHNOFAB/nixtest/-/commits/main) -![License: MIT](https://img.shields.io/gitlab/license/technofab/nix-gitlab-ci) +![License: MIT](https://img.shields.io/gitlab/license/technofab/nixtest) [![Latest Release](https://gitlab.com/TECHNOFAB/nixtest/-/badges/release.svg)](https://gitlab.com/TECHNOFAB/nixtest/-/releases) [![Support me](https://img.shields.io/badge/Support-me-green)](https://tec.tf/#support) [![Docs](https://img.shields.io/badge/Read-Docs-green)](https://nixtest.projects.tf) From 0272a8b0dc8f64c0b590f7007291b9010a0eef44 Mon Sep 17 00:00:00 2001 From: technofab Date: Wed, 30 Jul 2025 21:53:31 +0200 Subject: [PATCH 14/21] fix: support passing string as dir for autodiscovery --- lib/default.nix | 6 +++++- tests/lib_test.nix | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/default.nix b/lib/default.nix index 2aa3683..ec71f09 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -39,7 +39,11 @@ in rec { }: let files = builtins.readDir dir; matchingFiles = builtins.filter (name: builtins.match pattern name != null) (builtins.attrNames files); - imports = map (file: /${dir}/${file}) matchingFiles; + imports = map (file: + if builtins.isString dir + then (builtins.unsafeDiscardStringContext dir) + "/${file}" + else /${dir}/${file}) + matchingFiles; in { inherit imports; # automatically set the base so test filepaths are easier to read diff --git a/tests/lib_test.nix b/tests/lib_test.nix index 4437cf3..ae5b474 100644 --- a/tests/lib_test.nix +++ b/tests/lib_test.nix @@ -13,6 +13,10 @@ actual = ntlib.helpers.toPrettyFile (ntlib.autodiscover { dir = ./fixtures; }); + # tests if strings with store path context work + actualDirString = ntlib.helpers.toPrettyFile (ntlib.autodiscover { + dir = "${./fixtures}"; + }); in # sh '' @@ -20,6 +24,9 @@ ${ntlib.helpers.scriptHelpers} assert_file_contains ${actual} "sample_test.nix" "should find sample_test.nix" assert_file_contains ${actual} "base = \"/nix/store/.*-source/tests/fixtures/\"" "should set base to fixtures dir" + + assert_file_contains ${actualDirString} "sample_test.nix" "should find sample_test.nix" + assert_file_contains ${actualDirString} "base = \"/nix/store/.*-fixtures/\"" "should set base to fixtures dir" ''; } { From b2fb77ecc9d48556801d3bfba3b547b754f2aedc Mon Sep 17 00:00:00 2001 From: technofab Date: Wed, 30 Jul 2025 21:53:53 +0200 Subject: [PATCH 15/21] chore: clean up module a bit --- lib/module.nix | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/module.nix b/lib/module.nix index 14746e4..478584c 100644 --- a/lib/module.nix +++ b/lib/module.nix @@ -3,7 +3,17 @@ lib, ... }: let - inherit (lib) mkOptionType mkOption types; + inherit + (lib) + mkOptionType + mkOption + types + filterAttrs + isType + removePrefix + assertMsg + generators + ; nixtest-lib = import ./default.nix {inherit pkgs lib;}; @@ -16,14 +26,14 @@ unset = { _type = "unset"; }; - isUnset = lib.isType "unset"; + isUnset = isType "unset"; filterUnset = value: if builtins.isAttrs value && !builtins.hasAttr "_type" value then let filteredAttrs = builtins.mapAttrs (n: v: filterUnset v) value; in - lib.filterAttrs (name: value: (!isUnset value)) filteredAttrs + filterAttrs (name: value: (!isUnset value)) filteredAttrs else if builtins.isList value then builtins.filter (elem: !isUnset elem) (map filterUnset value) else value; @@ -42,18 +52,18 @@ if isUnset val then val else let - fileRelative = lib.removePrefix testsBase val.file; + fileRelative = removePrefix testsBase val.file; in "${fileRelative}:${toString val.line}"; }; type = mkOption { type = types.enum ["unit" "snapshot" "script"]; default = "unit"; apply = value: - assert lib.assertMsg (value != "script" || !isUnset config.script) + assert assertMsg (value != "script" || !isUnset config.script) "test '${config.name}' as type 'script' requires 'script' to be set"; - assert lib.assertMsg (value != "unit" || !isUnset config.expected) + assert assertMsg (value != "unit" || !isUnset config.expected) "test '${config.name}' as type 'unit' requires 'expected' to be set"; - assert lib.assertMsg ( + assert assertMsg ( let actualIsUnset = isUnset config.actual; actualDrvIsUnset = isUnset config.actualDrv; @@ -81,7 +91,7 @@ apply = val: if isUnset val || config.format == "json" then val - else lib.generators.toPretty {} val; + else generators.toPretty {} val; }; actual = mkOption { type = types.anything; @@ -89,7 +99,7 @@ apply = val: if isUnset val || config.format == "json" then val - else lib.generators.toPretty {} val; + else generators.toPretty {} val; }; actualDrv = mkOption { type = types.either types.package unsetType; From 22b43c9fe83be73c3f0648bbb54bc3c1cf7f96df Mon Sep 17 00:00:00 2001 From: technofab Date: Wed, 30 Jul 2025 21:54:13 +0200 Subject: [PATCH 16/21] chore(flake): enable go hardening workaround --- flake.nix | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index 72f86bd..9be0e25 100644 --- a/flake.nix +++ b/flake.nix @@ -36,9 +36,12 @@ }; devenv.shells.default = { containers = pkgs.lib.mkForce {}; - packages = with pkgs; [gopls gore go-junit-report]; + packages = with pkgs; [gore go-junit-report]; - languages.go.enable = true; + languages.go = { + enable = true; + enableHardeningWorkaround = true; + }; pre-commit.hooks = { treefmt = { From c9298b91f42a2f02842da6c41d34db342d4b3de6 Mon Sep 17 00:00:00 2001 From: technofab Date: Tue, 2 Sep 2025 13:06:52 +0200 Subject: [PATCH 17/21] chore!: default to pure mode, rename --pure flag to --impure for switching --- cmd/nixtest/main.go | 2 +- docs/cli.md | 2 +- docs/usage.md | 6 +++--- go.mod | 2 +- internal/config/config.go | 4 ++-- internal/config/config_test.go | 6 +++--- internal/nix/service.go | 10 +++++----- internal/nix/service_test.go | 6 +++--- internal/runner/runner.go | 4 ++-- internal/runner/runner_test.go | 8 ++++---- tests/lib_test.nix | 8 ++++---- 11 files changed, 29 insertions(+), 29 deletions(-) diff --git a/cmd/nixtest/main.go b/cmd/nixtest/main.go index 5f141c1..fef12b1 100644 --- a/cmd/nixtest/main.go +++ b/cmd/nixtest/main.go @@ -60,7 +60,7 @@ func main() { SnapshotDir: appCfg.SnapshotDir, UpdateSnapshots: appCfg.UpdateSnapshots, SkipPattern: appCfg.SkipPattern, - PureEnv: appCfg.PureEnv, + ImpureEnv: appCfg.ImpureEnv, } testRunner, err := runner.New(runnerCfg, nixService, snapshotService) if err != nil { diff --git a/docs/cli.md b/docs/cli.md index 943939e..fd882a7 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -4,7 +4,7 @@ Usage of nixtest: --junit string Path to generate JUNIT report to, leave empty to disable --no-color Disable coloring - --pure Unset all env vars before running script tests + --impure Don\'t unset all env vars before running script tests -s, --skip string Regular expression to skip tests (e.g., 'test-.*|.*-b') --snapshot-dir string Directory where snapshots are stored (default "./snapshots") -f, --tests string Path to JSON file containing tests (required) diff --git a/docs/usage.md b/docs/usage.md index a329017..ee7598c 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -96,10 +96,10 @@ Examples: name = "script-test"; type = "script"; script = - # there are two modes, "default"/"impure" and "pure" + # there are two modes, "default"/"pure" and "impure" # in impure mode all env variables etc. from your current session are kept - # and are available to the test - # to make it more reproducible and cleaner, use --pure to switch to pure + # and are available to the test (using --impure). + # to make it more reproducible and cleaner, the default is pure # mode which will unset all env variables before running the test. That # requires you to set PATH yourself then: # diff --git a/go.mod b/go.mod index 4cb8b73..bb9e578 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module gitlab.com/technofab/nixtest -go 1.24.2 +go 1.23.0 require ( github.com/akedrou/textdiff v0.1.0 diff --git a/internal/config/config.go b/internal/config/config.go index 9eef9bb..61427fb 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -16,7 +16,7 @@ type AppConfig struct { JunitPath string UpdateSnapshots bool SkipPattern string - PureEnv bool + ImpureEnv bool NoColor bool } @@ -29,7 +29,7 @@ func Load() AppConfig { flag.StringVar(&cfg.JunitPath, "junit", "", "Path to generate JUNIT report to, leave empty to disable") flag.BoolVarP(&cfg.UpdateSnapshots, "update-snapshots", "u", false, "Update all snapshots") flag.StringVarP(&cfg.SkipPattern, "skip", "s", "", "Regular expression to skip tests (e.g., 'test-.*|.*-b')") - flag.BoolVar(&cfg.PureEnv, "pure", false, "Unset all env vars before running script tests") + flag.BoolVar(&cfg.ImpureEnv, "impure", false, "Don't unset all env vars before running script tests") flag.BoolVar(&cfg.NoColor, "no-color", false, "Disable coloring") helpRequested := flag.BoolP("help", "h", false, "Show this menu") diff --git a/internal/config/config_test.go b/internal/config/config_test.go index c864d90..249dd60 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -64,7 +64,7 @@ func TestLoad_CustomValues(t *testing.T) { "--junit", "report.xml", "-u", "--skip", "specific-test", - "--pure", + "--impure", "--no-color", } pflag.CommandLine = pflag.NewFlagSet(os.Args[0], pflag.ExitOnError) // Reset flags @@ -83,7 +83,7 @@ func TestLoad_CustomValues(t *testing.T) { if cfg.SkipPattern != "specific-test" { t.Errorf("SkipPattern: got %s, want specific-test", cfg.SkipPattern) } - if !cfg.PureEnv { - t.Errorf("PureEnv: got %v, want true", cfg.PureEnv) + if !cfg.ImpureEnv { + t.Errorf("ImpureEnv: got %v, want true", cfg.ImpureEnv) } } diff --git a/internal/nix/service.go b/internal/nix/service.go index c0ec851..3c8effd 100644 --- a/internal/nix/service.go +++ b/internal/nix/service.go @@ -14,7 +14,7 @@ import ( type Service interface { BuildDerivation(derivation string) (string, error) BuildAndParseJSON(derivation string) (any, error) - BuildAndRunScript(derivation string, pureEnv bool) (exitCode int, stdout string, stderr string, err error) + BuildAndRunScript(derivation string, impureEnv bool) (exitCode int, stdout string, stderr string, err error) } type DefaultService struct { @@ -72,7 +72,7 @@ func (s *DefaultService) BuildAndParseJSON(derivation string) (any, error) { } // BuildAndRunScript builds a derivation and runs it as a script -func (s *DefaultService) BuildAndRunScript(derivation string, pureEnv bool) (exitCode int, stdout string, stderr string, err error) { +func (s *DefaultService) BuildAndRunScript(derivation string, impureEnv bool) (exitCode int, stdout string, stderr string, err error) { exitCode = -1 path, err := s.BuildDerivation(derivation) if err != nil { @@ -80,10 +80,10 @@ func (s *DefaultService) BuildAndRunScript(derivation string, pureEnv bool) (exi } var cmdArgs []string - if pureEnv { - cmdArgs = append([]string{"env", "-i"}, "bash", path) - } else { + if impureEnv { cmdArgs = []string{"bash", path} + } else { + cmdArgs = append([]string{"env", "-i"}, "bash", path) } cmd := s.commandExecutor(cmdArgs[0], cmdArgs[1:]...) diff --git a/internal/nix/service_test.go b/internal/nix/service_test.go index 3fee50a..0df0658 100644 --- a/internal/nix/service_test.go +++ b/internal/nix/service_test.go @@ -232,7 +232,7 @@ func TestDefaultService_BuildAndRunScript(t *testing.T) { tests := []struct { name string derivation string - pureEnv bool + impureEnv bool mockBuildDrvOutput string mockBuildDrvError string mockBuildDrvExitCode string @@ -252,7 +252,7 @@ func TestDefaultService_BuildAndRunScript(t *testing.T) { 0, "Hello", "ErrOut", false, nil, "", }, { - "Success pure", "script.drv#sh", true, mockScriptPath, "", "0", + "Success impure", "script.drv#sh", true, mockScriptPath, "", "0", "Hello", "ErrOut", "0", 0, "Hello", "ErrOut", false, nil, "", }, @@ -277,7 +277,7 @@ func TestDefaultService_BuildAndRunScript(t *testing.T) { os.Setenv("MOCK_SCRIPT_STDERR", tt.mockScriptStderr) os.Setenv("MOCK_SCRIPT_EXIT_CODE", tt.mockScriptExitCode) - exitCode, stdout, stderr, err := service.BuildAndRunScript(tt.derivation, tt.pureEnv) + exitCode, stdout, stderr, err := service.BuildAndRunScript(tt.derivation, tt.impureEnv) if (err != nil) != tt.wantErr { t.Fatalf("BuildAndRunScript() error = %v, wantErr %v", err, tt.wantErr) diff --git a/internal/runner/runner.go b/internal/runner/runner.go index 6f250d1..99783e9 100644 --- a/internal/runner/runner.go +++ b/internal/runner/runner.go @@ -32,7 +32,7 @@ type Config struct { SnapshotDir string UpdateSnapshots bool SkipPattern string - PureEnv bool + ImpureEnv bool } func New(cfg Config, nixService nix.Service, snapService snapshot.Service) (*Runner, error) { @@ -181,7 +181,7 @@ func (r *Runner) handleUnitTest(result *types.TestResult, spec types.TestSpec, a // handleScriptTest processes script type tests func (r *Runner) handleScriptTest(result *types.TestResult, spec types.TestSpec) { - exitCode, stdout, stderrStr, err := r.nixService.BuildAndRunScript(spec.Script, r.config.PureEnv) + exitCode, stdout, stderrStr, err := r.nixService.BuildAndRunScript(spec.Script, r.config.ImpureEnv) if err != nil { result.Status = types.StatusError result.ErrorMessage = fmt.Sprintf("[system] failed to run script derivation %s: %v", spec.Script, err) diff --git a/internal/runner/runner_test.go b/internal/runner/runner_test.go index 1415dd8..2bbffa6 100644 --- a/internal/runner/runner_test.go +++ b/internal/runner/runner_test.go @@ -18,7 +18,7 @@ import ( type mockNixService struct { BuildDerivationFunc func(derivation string) (string, error) BuildAndParseJSONFunc func(derivation string) (any, error) - BuildAndRunScriptFunc func(derivation string, pureEnv bool) (exitCode int, stdout string, stderr string, err error) + BuildAndRunScriptFunc func(derivation string, impureEnv bool) (exitCode int, stdout string, stderr string, err error) } func (m *mockNixService) BuildDerivation(d string) (string, error) { @@ -253,7 +253,7 @@ func TestRunner_executeTest(t *testing.T) { spec: types.TestSpec{Name: "ScriptSuccess", Type: types.TestTypeScript, Script: "script.sh"}, runnerConfig: Config{}, setupMockServices: func(t *testing.T, mNix *mockNixService, mSnap *mockSnapshotService, s types.TestSpec, c Config) { - mNix.BuildAndRunScriptFunc = func(derivation string, pureEnv bool) (int, string, string, error) { + mNix.BuildAndRunScriptFunc = func(derivation string, impureEnv bool) (int, string, string, error) { return 0, "stdout", "stderr", nil } }, @@ -264,7 +264,7 @@ func TestRunner_executeTest(t *testing.T) { spec: types.TestSpec{Name: "ScriptFail", Type: types.TestTypeScript, Script: "script.sh"}, runnerConfig: Config{}, setupMockServices: func(t *testing.T, mNix *mockNixService, mSnap *mockSnapshotService, s types.TestSpec, c Config) { - mNix.BuildAndRunScriptFunc = func(derivation string, pureEnv bool) (int, string, string, error) { + mNix.BuildAndRunScriptFunc = func(derivation string, impureEnv bool) (int, string, string, error) { return 1, "out on fail", "err on fail", nil } }, @@ -313,7 +313,7 @@ func TestRunner_RunTests(t *testing.T) { mockSnapSvc := &mockSnapshotService{} mockNixSvc.BuildAndParseJSONFunc = func(derivation string) (any, error) { return "parsed", nil } - mockNixSvc.BuildAndRunScriptFunc = func(derivation string, pureEnv bool) (int, string, string, error) { return 0, "", "", nil } + mockNixSvc.BuildAndRunScriptFunc = func(derivation string, impureEnv bool) (int, string, string, error) { return 0, "", "", nil } mockSnapSvc.StatFunc = func(name string) (os.FileInfo, error) { return mockFileInfo{}, nil } mockSnapSvc.LoadFileFunc = func(filePath string) (any, error) { return "snapshot", nil } mockSnapSvc.CreateFileFunc = func(filePath string, data any) error { return nil } diff --git a/tests/lib_test.nix b/tests/lib_test.nix index ae5b474..cdd8386 100644 --- a/tests/lib_test.nix +++ b/tests/lib_test.nix @@ -36,7 +36,7 @@ binary = (ntlib.mkBinary { nixtests = "stub"; - extraParams = "--pure"; + extraParams = "--impure"; }) + "/bin/nixtests:run"; in @@ -45,7 +45,7 @@ ${ntlib.helpers.path [pkgs.gnugrep]} ${ntlib.helpers.scriptHelpers} assert_file_contains ${binary} "nixtest" "should contain nixtest" - assert_file_contains ${binary} "--pure" "should contain --pure arg" + assert_file_contains ${binary} "--impure" "should contain --impure arg" assert_file_contains ${binary} "--tests=stub" "should contain --tests arg" run "${binary} --help" @@ -75,14 +75,14 @@ TMPDIR=$(tmpdir) # start without nix & env binaries to expect errors - run "${binary} --pure --junit=$TMPDIR/junit.xml" + run "${binary} --junit=$TMPDIR/junit.xml" assert "$exit_code -eq 2" "should exit 2" assert "-f $TMPDIR/junit.xml" "should create junit.xml" assert_contains "$output" "executable file not found" "nix should not be found in pure mode" # now add required deps ${ntlib.helpers.pathAdd [pkgs.nix pkgs.coreutils]} - run "${binary} --pure --junit=$TMPDIR/junit2.xml" + run "${binary} --junit=$TMPDIR/junit2.xml" assert "$exit_code -eq 2" "should exit 2" assert "-f $TMPDIR/junit2.xml" "should create junit2.xml" assert_not_contains "$output" "executable file not found" "nix should now exist" From 5741109cc9ec2b6d41b56abd3f5bc51ed7a9a228 Mon Sep 17 00:00:00 2001 From: technofab Date: Tue, 2 Sep 2025 13:22:28 +0200 Subject: [PATCH 18/21] feat: run script tests in temp dirs for slightly better sandboxing --- internal/nix/service.go | 9 +++++++++ lib/scriptHelpers.sh | 10 ---------- tests/lib_test.nix | 12 ++++++------ 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/internal/nix/service.go b/internal/nix/service.go index 3c8effd..40461f9 100644 --- a/internal/nix/service.go +++ b/internal/nix/service.go @@ -3,6 +3,7 @@ package nix import ( "bytes" "encoding/json" + "fmt" "os" "os/exec" "strings" @@ -79,6 +80,13 @@ func (s *DefaultService) BuildAndRunScript(derivation string, impureEnv bool) (e return exitCode, "", "", err } + // run scripts in a temporary directory + tempDir, err := os.MkdirTemp("", "nixtest-script-") + if err != nil { + return exitCode, "", "", &apperrors.ScriptExecutionError{Path: path, Err: fmt.Errorf("failed to create temporary directory: %w", err)} + } + defer os.RemoveAll(tempDir) + var cmdArgs []string if impureEnv { cmdArgs = []string{"bash", path} @@ -87,6 +95,7 @@ func (s *DefaultService) BuildAndRunScript(derivation string, impureEnv bool) (e } cmd := s.commandExecutor(cmdArgs[0], cmdArgs[1:]...) + cmd.Dir = tempDir var outBuf, errBuf bytes.Buffer cmd.Stdout = &outBuf cmd.Stderr = &errBuf diff --git a/lib/scriptHelpers.sh b/lib/scriptHelpers.sh index 0b59829..b1e3514 100644 --- a/lib/scriptHelpers.sh +++ b/lib/scriptHelpers.sh @@ -35,16 +35,6 @@ function assert_file_not_contains() { } } -function tmpdir() { - dir=$(mktemp -d) - trap "rm -rf $dir" EXIT - echo -n "$dir" -} -function tmpfile() { - file=$(mktemp) - trap "rm -f $file" EXIT - echo -n "$file" -} function run() { output=$($@ 2>&1) exit_code=$? diff --git a/tests/lib_test.nix b/tests/lib_test.nix index cdd8386..969e9a2 100644 --- a/tests/lib_test.nix +++ b/tests/lib_test.nix @@ -70,21 +70,21 @@ in # sh '' - ${ntlib.helpers.path [pkgs.gnugrep pkgs.mktemp]} + ${ntlib.helpers.path [pkgs.gnugrep pkgs.mktemp pkgs.coreutils]} ${ntlib.helpers.scriptHelpers} + cp -r ${./../snapshots} snapshots - TMPDIR=$(tmpdir) # start without nix & env binaries to expect errors - run "${binary} --junit=$TMPDIR/junit.xml" + run "${binary} --junit=junit.xml" assert "$exit_code -eq 2" "should exit 2" - assert "-f $TMPDIR/junit.xml" "should create junit.xml" + assert "-f junit.xml" "should create junit.xml" assert_contains "$output" "executable file not found" "nix should not be found in pure mode" # now add required deps ${ntlib.helpers.pathAdd [pkgs.nix pkgs.coreutils]} - run "${binary} --junit=$TMPDIR/junit2.xml" + run "${binary} --junit=junit2.xml" assert "$exit_code -eq 2" "should exit 2" - assert "-f $TMPDIR/junit2.xml" "should create junit2.xml" + assert "-f junit2.xml" "should create junit2.xml" assert_not_contains "$output" "executable file not found" "nix should now exist" assert_contains "$output" "suite-one" "should contain suite-one" assert_contains "$output" "8/11 (1 SKIPPED)" "should be 8/11 total" From c9618a4d9b03939ff2673e52aad97b57acd0f45a Mon Sep 17 00:00:00 2001 From: technofab Date: Wed, 1 Oct 2025 16:43:30 +0200 Subject: [PATCH 19/21] docs: update nixmkdocs, use svg for logo and favicon, add module docs --- docs/images/favicon.png | Bin 1449 -> 0 bytes docs/images/logo.png | Bin 3523 -> 0 bytes docs/images/logo.svg | 1 + docs/options.md | 3 ++ docs/style.css | 15 ++++++ flake.lock | 22 ++------- flake.nix | 102 +++++++++++++++++--------------------- lib/module.nix | 107 +++++++++++++++++++++++++++++++++------- 8 files changed, 154 insertions(+), 96 deletions(-) delete mode 100755 docs/images/favicon.png delete mode 100755 docs/images/logo.png create mode 100755 docs/images/logo.svg create mode 100644 docs/options.md create mode 100644 docs/style.css diff --git a/docs/images/favicon.png b/docs/images/favicon.png deleted file mode 100755 index 4203f2a5d2e6c0ae9ef11f74519df55ae5b305e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1449 zcmV;a1y=frP) zX>3$g6vuz(PU*s?wn`*mv9rFtu(F73s8SVq6f>goqd^2&07=!n9Ref*6(5 z4HT0mqUkWj1yYP{2NfbJ0#O9px|`?!(<- zn4a00JAg+44qLfX9Ab3RE|x0*K%T?f@o>Fs~4I+p^k z0{v}Wy;1$JPch*2)e3;986;wM03&QuNvO=@kK3=kX?UhFW+yN#VT&l>3Ff)C{c8dR zzDN;>$Dz6w7;e9}0$PDY_le&))S@PD-~e6Z_D7=*=TEc<*n-c zC?yH_^&oyAy&KYlfGJMJ?>`@}x%$ST-vMK7RSQZm4h~=`ml;<|6VTRe4CMRjT;~B# zDppKyKeoTM7O-qpe}pUI_S{Wg*YVp|Om4n&#dEne-qdbAAec1ZBOv5Z%0)xc$GBW( zuoy|TqE<`up|c~umlJIMwN3wNm2r#vYgYv z2TomJL*tbw6~I7SHS6udah1tD5vXoFVqecdU_?~U4pHIpI5-dk4)r<>msU3kN{It} zo2XQF_kA$Wy$5&`I26<9w68LXo=5;+EHPI1nt-CW+Aak+hq8E?cf{HA{8Jv&=#(!r zd{Y6x6C62OUUzr6YZe5;jfDs|*tzSJ34qIf4bzr^lsUi>2Y69dZQ&27 zd{*F#r@m|zm7oN|4Wkj+0i<;~%s+La6=j@V`MQvB<KQhdus?+^?>0a?I7vC^hx*3G@g-u$UhndglzC+}##$-vhFcZSM5yL#0P{p%ad zsMw=1AYN#Os%hVFJa^TnKryg5-?!zGPIuk~T;t&DfGW`5w_`CfX=rTBy3w)6o&;+C zA#rBI@!VCP0ILP&Cj?xlJkP8xtV7K!zyZtB(ok8B_PQGe!VTjP`4ZTAq~DJ-_qf)) z1x&Wh2gORCmRUPzyw$(0^2E&*^AqyCD5rh-4;p2jDybsGj7v@>DHJaRy(7QvwjBqm z8!Lc^1jg58EI5erk&^_F58P$vxyx=qOLE$m?~vrt?v(GrObF&>w|Co)QA!YgU6$wG z3vf$~_kIV7p+Lm`&)DF_Iql`W0gnMiPVl6qIOuinS4)@2*Y%UbE&Wc9e83SCsZQ{# zqBBZFT>}*s0-rm!I%>~`vlM0nGmM(e|7tAnm=Pi)1zCA!#J;(wuJ||}6BbZ>;Wx8i zuJ+&6;uzIOBWwo-0ID#vIM4llpNG&rY%1->nh z0NJ2bj-J0(kdzK0dPb#l^jlc(8vAUjod=NrB~ktc|2-VUh%R%J00000NkvXXu0mjf D^0>9~ diff --git a/docs/images/logo.png b/docs/images/logo.png deleted file mode 100755 index b8ff5f84d1da75f58cdcfd3dcce417eef1dfdc71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3523 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 \ No newline at end of file diff --git a/docs/options.md b/docs/options.md new file mode 100644 index 0000000..4ca74a4 --- /dev/null +++ b/docs/options.md @@ -0,0 +1,3 @@ +# Options + +{% include 'options.md' %} diff --git a/docs/style.css b/docs/style.css new file mode 100644 index 0000000..b2ae4ff --- /dev/null +++ b/docs/style.css @@ -0,0 +1,15 @@ +.md-header__button.md-logo { + margin: 0; + padding-top: .2rem; + padding-bottom: .2rem; +} + +[dir="ltr"] .md-header__title { + margin-left: 0; +} + +.md-header__button.md-logo img, +.md-header__button.md-logo svg { + height: 2rem; +} + diff --git a/flake.lock b/flake.lock index 09366e0..110c517 100644 --- a/flake.lock +++ b/flake.lock @@ -169,21 +169,6 @@ "type": "github" } }, - "mkdocs-material-umami": { - "locked": { - "lastModified": 1745840856, - "narHash": "sha256-1Ad1JTMQMP6YsoIKAA+SBCE15qWrYkGue9/lXOLnu9I=", - "owner": "technofab", - "repo": "mkdocs-material-umami", - "rev": "3ac9b194450f6b779c37b8d16fec640198e5cd0a", - "type": "gitlab" - }, - "original": { - "owner": "technofab", - "repo": "mkdocs-material-umami", - "type": "gitlab" - } - }, "nix": { "inputs": { "flake-compat": [ @@ -255,11 +240,11 @@ "nix-mkdocs": { "locked": { "dir": "lib", - "lastModified": 1745841841, - "narHash": "sha256-297zPQbUlc7ZAYDoaD6mCmQxCC3Tr4YOKekRF1ArZ7g=", + "lastModified": 1757055638, + "narHash": "sha256-KHYSkEreFe4meXzSdEbknC/HwaQSNClQkc8vzHlAsMM=", "owner": "technofab", "repo": "nixmkdocs", - "rev": "c7e3c3b13ded25818e9789938387bba6f2cde690", + "rev": "7840a5febdbeaf2da90babf6c94b3d0929d2bf74", "type": "gitlab" }, "original": { @@ -368,7 +353,6 @@ "inputs": { "devenv": "devenv", "flake-parts": "flake-parts_2", - "mkdocs-material-umami": "mkdocs-material-umami", "nix-devtools": "nix-devtools", "nix-gitlab-ci": "nix-gitlab-ci", "nix-mkdocs": "nix-mkdocs", diff --git a/flake.nix b/flake.nix index 9be0e25..72e77cc 100644 --- a/flake.nix +++ b/flake.nix @@ -17,6 +17,7 @@ perSystem = { lib, pkgs, + self', config, ... }: { @@ -65,81 +66,48 @@ }; }; - doc = { + docs."default".config = { path = ./docs; - deps = pp: [ - pp.mkdocs-material - (pp.callPackage inputs.mkdocs-material-umami {}) - ]; + material = { + enable = true; + colors = { + primary = "green"; + accent = "light green"; + }; + umami = { + enable = true; + src = "https://analytics.tf/umami"; + siteId = "716d1869-9342-4b62-a770-e15d2d5c807d"; + domains = ["nixtest.projects.tf"]; + }; + }; + macros = { + enable = true; + includeDir = toString self'.packages.optionsDocs; + }; config = { site_name = "Nixtest"; + site_url = "https://nixtest.projects.tf"; repo_name = "TECHNOFAB/nixtest"; repo_url = "https://gitlab.com/TECHNOFAB/nixtest"; - edit_uri = "edit/main/docs/"; + extra_css = ["style.css"]; theme = { - name = "material"; - features = ["content.code.copy" "content.action.edit"]; icon.repo = "simple/gitlab"; - logo = "images/logo.png"; - favicon = "images/favicon.png"; - palette = [ - { - scheme = "default"; - media = "(prefers-color-scheme: light)"; - primary = "green"; - accent = "light green"; - toggle = { - icon = "material/brightness-7"; - name = "Switch to dark mode"; - }; - } - { - scheme = "slate"; - media = "(prefers-color-scheme: dark)"; - primary = "green"; - accent = "light green"; - toggle = { - icon = "material/brightness-4"; - name = "Switch to light mode"; - }; - } - ]; + logo = "images/logo.svg"; + favicon = "images/logo.svg"; }; - plugins = ["search" "material-umami"]; nav = [ {"Introduction" = "index.md";} {"Usage" = "usage.md";} {"Reference" = "reference.md";} {"CLI" = "cli.md";} {"Example Configs" = "examples.md";} + {"Options" = "options.md";} ]; markdown_extensions = [ "pymdownx.superfences" "admonition" ]; - extra.analytics = { - provider = "umami"; - site_id = "716d1869-9342-4b62-a770-e15d2d5c807d"; - src = "https://analytics.tf/umami"; - domains = "nixtest.projects.tf"; - feedback = { - title = "Was this page helpful?"; - ratings = [ - { - icon = "material/thumb-up-outline"; - name = "This page is helpful"; - data = "good"; - note = "Thanks for your feedback!"; - } - { - icon = "material/thumb-down-outline"; - name = "This page could be improved"; - data = "bad"; - note = "Thanks for your feedback! Please leave feedback by creating an issue :)"; - } - ]; - }; - }; }; }; @@ -212,7 +180,8 @@ packages = let ntlib = import ./lib {inherit pkgs lib;}; - in { + doclib = inputs.nix-mkdocs.lib {inherit lib pkgs;}; + in rec { default = pkgs.callPackage ./package.nix {}; tests = ntlib.mkNixtest { modules = ntlib.autodiscover {dir = ./tests;}; @@ -220,6 +189,24 @@ inherit pkgs ntlib; }; }; + optionsDoc = doclib.mkOptionDocs { + module = { + _module.args.pkgs = pkgs; + imports = [ + ntlib.module + ]; + }; + roots = [ + { + url = "https://gitlab.com/TECHNOFAB/nixtest/-/blob/main/lib"; + path = toString ./lib; + } + ]; + }; + optionsDocs = pkgs.runCommand "options-docs" {} '' + mkdir -p $out + ln -s ${optionsDoc} $out/options.md + ''; }; }; }; @@ -235,7 +222,6 @@ nix-gitlab-ci.url = "gitlab:technofab/nix-gitlab-ci/2.0.1?dir=lib"; nix-devtools.url = "gitlab:technofab/nix-devtools?dir=lib"; nix-mkdocs.url = "gitlab:technofab/nixmkdocs?dir=lib"; - mkdocs-material-umami.url = "gitlab:technofab/mkdocs-material-umami"; }; nixConfig = { diff --git a/lib/module.nix b/lib/module.nix index 478584c..db05055 100644 --- a/lib/module.nix +++ b/lib/module.nix @@ -13,6 +13,7 @@ removePrefix assertMsg generators + literalExpression ; nixtest-lib = import ./default.nix {inherit pkgs lib;}; @@ -27,6 +28,18 @@ _type = "unset"; }; isUnset = isType "unset"; + unsetOr = typ: + (types.either unsetType typ) + // { + inherit (typ) description getSubOptions; + }; + mkUnsetOption = opts: + mkOption (opts + // { + type = unsetOr opts.type; + default = opts.default or unset; + defaultText = literalExpression "unset"; + }); filterUnset = value: if builtins.isAttrs value && !builtins.hasAttr "_type" value @@ -45,8 +58,11 @@ ... }: { options = { - pos = mkOption { - type = types.either types.attrs unsetType; + pos = mkUnsetOption { + type = types.attrs; + description = '' + Position of test, use `__curPos` for automatic insertion of current position. + ''; default = pos; apply = val: if isUnset val @@ -57,6 +73,9 @@ }; type = mkOption { type = types.enum ["unit" "snapshot" "script"]; + description = '' + Type of test, has to be one of "unit", "snapshot" or "script". + ''; default = "unit"; apply = value: assert assertMsg (value != "script" || !isUnset config.script) @@ -76,43 +95,66 @@ }; name = mkOption { type = types.str; + description = '' + Name of this test. + ''; }; - description = mkOption { - type = types.either types.str unsetType; - default = unset; + description = mkUnsetOption { + type = types.str; + description = '' + Short description of the test. + ''; }; format = mkOption { type = types.enum ["json" "pretty"]; + description = '' + Which format to use for serializing arbitrary values. + Required since this config is serialized to JSON for passing it to Nixtest, so no Nix-values can be used directly. + + - `json`: serializes the data to json using `builtins.toJSON` + - `pretty`: serializes the data to a "pretty" format using `lib.generators.toPretty` + ''; default = "json"; }; - expected = mkOption { + expected = mkUnsetOption { type = types.anything; - default = unset; + description = '' + Expected value of the test. Remember, the values are serialized (see [here](#suitesnametestsformat)). + ''; apply = val: if isUnset val || config.format == "json" then val else generators.toPretty {} val; }; - actual = mkOption { + actual = mkUnsetOption { type = types.anything; - default = unset; + description = '' + Actual value of the test. Remember, the values are serialized (see [here](#suitesnametestsformat)). + ''; apply = val: if isUnset val || config.format == "json" then val else generators.toPretty {} val; }; - actualDrv = mkOption { - type = types.either types.package unsetType; - default = unset; + actualDrv = mkUnsetOption { + type = types.package; + description = '' + Actual value of the test, but as a derivation. + Nixtest will build this derivation when running the test, then compare the contents of the + resulting file to the [`expected`](#suitesnametestsexpected) value. + ''; apply = val: # keep unset value if isUnset val then val else builtins.unsafeDiscardStringContext (val.drvPath or ""); }; - script = mkOption { - type = types.either types.str unsetType; - default = unset; + script = mkUnsetOption { + type = types.str; + description = '' + Script to run for the test. + Nixtest will run this, failing the test if it exits with a non-zero exit code. + ''; apply = val: if isUnset val then val @@ -132,11 +174,19 @@ options = { name = mkOption { type = types.str; + description = '' + Name of the suite, uses attrset name by default. + ''; default = name; + defaultText = literalExpression name; }; - pos = mkOption { - type = types.either types.attrs unsetType; - default = unset; + pos = mkUnsetOption { + type = types.attrs; + description = '' + Position for tests, use `__curPos` for automatic insertion of current position. + This will set `pos` for every test of this suite, useful if the suite's tests are all in a single file. + ''; + example = literalExpression "__curPos"; }; tests = mkOption { type = types.listOf (types.submoduleWith { @@ -146,6 +196,9 @@ inherit testsBase; }; }); + description = '' + Define tests of this suite here. + ''; default = []; }; }; @@ -154,12 +207,18 @@ nixtestSubmodule = {config, ...}: { options = { base = mkOption { - description = "Base directory of the tests, will be removed from the test file path"; type = types.str; + description = '' + Base directory of the tests, will be removed from the test file path. + This makes it possible to show the relative path from the git repo, instead of ugly Nix store paths. + ''; default = ""; }; skip = mkOption { type = types.str; + description = '' + Tests to skip, is passed to Nixtest's `--skip` param. + ''; default = ""; }; suites = mkOption { @@ -169,12 +228,22 @@ testsBase = config.base; }; }); + description = '' + Define your test suites here, every test belongs to a suite. + ''; default = {}; apply = suites: map ( n: filterUnset (builtins.removeAttrs suites.${n} ["pos"]) ) (builtins.attrNames suites); + example = { + "Suite A".tests = [ + { + name = "Some Test"; + } + ]; + }; }; finalConfigJson = mkOption { From 56d22f4aa1c3f281a0cd26acd7aa2ed426ef6fe5 Mon Sep 17 00:00:00 2001 From: technofab Date: Wed, 1 Oct 2025 17:08:49 +0200 Subject: [PATCH 20/21] test: set SSL_CERT_FILE and NIX_SSL_CERT_FILE so test works in pure mode --- tests/lib_test.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/lib_test.nix b/tests/lib_test.nix index 969e9a2..85a3c7a 100644 --- a/tests/lib_test.nix +++ b/tests/lib_test.nix @@ -72,6 +72,8 @@ '' ${ntlib.helpers.path [pkgs.gnugrep pkgs.mktemp pkgs.coreutils]} ${ntlib.helpers.scriptHelpers} + export SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt + export NIX_SSL_CERT_FILE=${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt cp -r ${./../snapshots} snapshots # start without nix & env binaries to expect errors From 5a7053afcbb211b9cf8fe87f7892bb9f6b76b678 Mon Sep 17 00:00:00 2001 From: technofab Date: Wed, 1 Oct 2025 19:42:30 +0200 Subject: [PATCH 21/21] docs: set _file so "declared in" works correctly --- lib/module.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/module.nix b/lib/module.nix index db05055..1600c50 100644 --- a/lib/module.nix +++ b/lib/module.nix @@ -205,6 +205,7 @@ }; nixtestSubmodule = {config, ...}: { + _file = ./module.nix; options = { base = mkOption { type = types.str;