From 445dc9ffc6adf156992b78a1a020ab14ef8ab00c Mon Sep 17 00:00:00 2001 From: fidgetingbits Date: Sat, 19 Jul 2025 19:00:53 +0800 Subject: [PATCH] Improve version testing logic and add relevant tests --- direnvrc | 6 ++-- flake.nix | 12 ++++++-- test-runner.nix | 18 ++++++++++-- tests/bash/test_versions.bats | 32 +++++++++++++++++++++ tests/{ => python/tests}/__init__.py | 0 tests/{ => python/tests}/conftest.py | 0 tests/{ => python/tests}/direnv_project.py | 0 tests/{ => python/tests}/procs.py | 0 tests/{ => python/tests}/root.py | 4 +-- tests/{ => python/tests}/test_gc.py | 0 tests/{ => python/tests}/test_use_nix.py | 0 tests/{ => python/tests}/testenv/flake.lock | 0 tests/{ => python/tests}/testenv/flake.nix | 0 tests/{ => python/tests}/testenv/shell.nix | 0 14 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 tests/bash/test_versions.bats rename tests/{ => python/tests}/__init__.py (100%) rename tests/{ => python/tests}/conftest.py (100%) rename tests/{ => python/tests}/direnv_project.py (100%) rename tests/{ => python/tests}/procs.py (100%) rename tests/{ => python/tests}/root.py (80%) rename tests/{ => python/tests}/test_gc.py (100%) rename tests/{ => python/tests}/test_use_nix.py (100%) rename tests/{ => python/tests}/testenv/flake.lock (100%) rename tests/{ => python/tests}/testenv/flake.nix (100%) rename tests/{ => python/tests}/testenv/shell.nix (100%) diff --git a/direnvrc b/direnvrc index 4dd7a32..cad58f7 100644 --- a/direnvrc +++ b/direnvrc @@ -37,10 +37,10 @@ _nix() { } _require_version() { - local cmd=$1 version=$2 required=$3 + local cmd=$1 raw_version=$2 version=${2%%[^0-9.]*} required=$3 if ! printf "%s\n" "$required" "$version" | LC_ALL=C sort -c -V 2>/dev/null; then _nix_direnv_error \ - "minimum required $(basename "$cmd") version is $required (installed: $version)" + "minimum required $(basename "$cmd") version is $required (installed: $raw_version)" return 1 fi } @@ -52,7 +52,7 @@ _require_cmd_version() { return 1 fi version=$($cmd --version) - [[ $version =~ ([0-9]+\.[0-9]+\.[0-9]+) ]] + [[ $version =~ ([0-9]+\.[0-9]+(\.[0-9]+)?) ]] _require_version "$cmd" "${BASH_REMATCH[1]}" "$required" } diff --git a/flake.nix b/flake.nix index 96f00b4..8e844d5 100644 --- a/flake.nix +++ b/flake.nix @@ -34,11 +34,17 @@ ... }: { - packages = { + packages = rec { nix-direnv = pkgs.callPackage ./default.nix { }; default = config.packages.nix-direnv; - test-runner-stable = pkgs.callPackage ./test-runner.nix { nixVersion = "stable"; }; - test-runner-latest = pkgs.callPackage ./test-runner.nix { nixVersion = "latest"; }; + test-runner-stable = pkgs.callPackage ./test-runner.nix { + nixVersion = "stable"; + inherit nix-direnv; + }; + test-runner-latest = pkgs.callPackage ./test-runner.nix { + nixVersion = "latest"; + inherit nix-direnv; + }; }; devShells.default = pkgs.callPackage ./shell.nix { diff --git a/test-runner.nix b/test-runner.nix index 5ff22da..8de1ab9 100644 --- a/test-runner.nix +++ b/test-runner.nix @@ -5,9 +5,18 @@ lib, coreutils, gnugrep, + bats, nixVersions, nixVersion, + nix-direnv, + fetchurl, }: +let + direnv-stdlib = fetchurl { + url = "https://raw.githubusercontent.com/direnv/direnv/refs/tags/v2.37.0/stdlib.sh"; + hash = "sha256-MMM04OXhqS/rRSuv8uh7CD70Z7CaGT63EtL/3LC08qM="; + }; +in writeShellScriptBin "test-runner-${nixVersion}" '' set -e export PATH=${ @@ -18,7 +27,12 @@ writeShellScriptBin "test-runner-${nixVersion}" '' gnugrep ] } + export DIRENV_STDLIB=${direnv-stdlib} + export DIRENVRC="${nix-direnv}/share/nix-direnv/direnvrc" - echo run unittest - ${lib.getExe' python3.pkgs.pytest "pytest"} . + echo run python unittest + ${lib.getExe' python3.pkgs.pytest "pytest"} tests/python/ + + echo run bash unittest + ${lib.getExe' bats "bats"} -x --verbose-run tests/bash/ '' diff --git a/tests/bash/test_versions.bats b/tests/bash/test_versions.bats new file mode 100644 index 0000000..f679479 --- /dev/null +++ b/tests/bash/test_versions.bats @@ -0,0 +1,32 @@ +load "$DIRENV_STDLIB" +load "$DIRENVRC" + +@test "test _require_version with valid versions" { + # args: cmd version minimum_required + run _require_version "test-cmd" "2.5" "2.4" + [ "$status" -eq 0 ] + run _require_version "test-cmd" "2.5" "2.4.1" + [ "$status" -eq 0 ] + run _require_version "test-cmd" "2.4.1" "2.4" + [ "$status" -eq 0 ] + run _require_version "test-cmd" "2.4" "2.4.1" + [ "$status" -eq 1 ] + run _require_version "test-cmd" "2.31pre20250712_b1245123" "2.4" + [ "$status" -eq 0 ] +} + + +test_cmd1() { + echo "1.2" +} + +test_cmd2() { + echo "1.2.3" +} + +@test "test _require_cmd_version with valid versions" { + run _require_cmd_version "test_cmd1" "1.1" + [ "$status" -eq 0 ] + run _require_cmd_version "test_cmd2" "1.1.1" + [ "$status" -eq 0 ] +} diff --git a/tests/__init__.py b/tests/python/tests/__init__.py similarity index 100% rename from tests/__init__.py rename to tests/python/tests/__init__.py diff --git a/tests/conftest.py b/tests/python/tests/conftest.py similarity index 100% rename from tests/conftest.py rename to tests/python/tests/conftest.py diff --git a/tests/direnv_project.py b/tests/python/tests/direnv_project.py similarity index 100% rename from tests/direnv_project.py rename to tests/python/tests/direnv_project.py diff --git a/tests/procs.py b/tests/python/tests/procs.py similarity index 100% rename from tests/procs.py rename to tests/python/tests/procs.py diff --git a/tests/root.py b/tests/python/tests/root.py similarity index 80% rename from tests/root.py rename to tests/python/tests/root.py index b3f0914..6c71e08 100644 --- a/tests/root.py +++ b/tests/python/tests/root.py @@ -3,7 +3,7 @@ from pathlib import Path import pytest TEST_ROOT = Path(__file__).parent.resolve() -PROJECT_ROOT = TEST_ROOT.parent +PROJECT_ROOT = TEST_ROOT.parents[2] @pytest.fixture @@ -17,6 +17,6 @@ def test_root() -> Path: @pytest.fixture def project_root() -> Path: """ - Root directory of the tests + Root directory of the project """ return PROJECT_ROOT diff --git a/tests/test_gc.py b/tests/python/tests/test_gc.py similarity index 100% rename from tests/test_gc.py rename to tests/python/tests/test_gc.py diff --git a/tests/test_use_nix.py b/tests/python/tests/test_use_nix.py similarity index 100% rename from tests/test_use_nix.py rename to tests/python/tests/test_use_nix.py diff --git a/tests/testenv/flake.lock b/tests/python/tests/testenv/flake.lock similarity index 100% rename from tests/testenv/flake.lock rename to tests/python/tests/testenv/flake.lock diff --git a/tests/testenv/flake.nix b/tests/python/tests/testenv/flake.nix similarity index 100% rename from tests/testenv/flake.nix rename to tests/python/tests/testenv/flake.nix diff --git a/tests/testenv/shell.nix b/tests/python/tests/testenv/shell.nix similarity index 100% rename from tests/testenv/shell.nix rename to tests/python/tests/testenv/shell.nix