Improve version testing logic and add relevant tests

This commit is contained in:
fidgetingbits 2025-07-19 19:00:53 +08:00
parent add4b907c0
commit 445dc9ffc6
No known key found for this signature in database
14 changed files with 62 additions and 10 deletions

View file

@ -37,10 +37,10 @@ _nix() {
} }
_require_version() { _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 if ! printf "%s\n" "$required" "$version" | LC_ALL=C sort -c -V 2>/dev/null; then
_nix_direnv_error \ _nix_direnv_error \
"minimum required $(basename "$cmd") version is $required (installed: $version)" "minimum required $(basename "$cmd") version is $required (installed: $raw_version)"
return 1 return 1
fi fi
} }
@ -52,7 +52,7 @@ _require_cmd_version() {
return 1 return 1
fi fi
version=$($cmd --version) version=$($cmd --version)
[[ $version =~ ([0-9]+\.[0-9]+\.[0-9]+) ]] [[ $version =~ ([0-9]+\.[0-9]+(\.[0-9]+)?) ]]
_require_version "$cmd" "${BASH_REMATCH[1]}" "$required" _require_version "$cmd" "${BASH_REMATCH[1]}" "$required"
} }

View file

@ -34,11 +34,17 @@
... ...
}: }:
{ {
packages = { packages = rec {
nix-direnv = pkgs.callPackage ./default.nix { }; nix-direnv = pkgs.callPackage ./default.nix { };
default = config.packages.nix-direnv; default = config.packages.nix-direnv;
test-runner-stable = pkgs.callPackage ./test-runner.nix { nixVersion = "stable"; }; test-runner-stable = pkgs.callPackage ./test-runner.nix {
test-runner-latest = pkgs.callPackage ./test-runner.nix { nixVersion = "latest"; }; nixVersion = "stable";
inherit nix-direnv;
};
test-runner-latest = pkgs.callPackage ./test-runner.nix {
nixVersion = "latest";
inherit nix-direnv;
};
}; };
devShells.default = pkgs.callPackage ./shell.nix { devShells.default = pkgs.callPackage ./shell.nix {

View file

@ -5,9 +5,18 @@
lib, lib,
coreutils, coreutils,
gnugrep, gnugrep,
bats,
nixVersions, nixVersions,
nixVersion, 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}" '' writeShellScriptBin "test-runner-${nixVersion}" ''
set -e set -e
export PATH=${ export PATH=${
@ -18,7 +27,12 @@ writeShellScriptBin "test-runner-${nixVersion}" ''
gnugrep gnugrep
] ]
} }
export DIRENV_STDLIB=${direnv-stdlib}
export DIRENVRC="${nix-direnv}/share/nix-direnv/direnvrc"
echo run unittest echo run python unittest
${lib.getExe' python3.pkgs.pytest "pytest"} . ${lib.getExe' python3.pkgs.pytest "pytest"} tests/python/
echo run bash unittest
${lib.getExe' bats "bats"} -x --verbose-run tests/bash/
'' ''

View file

@ -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 ]
}

View file

@ -3,7 +3,7 @@ from pathlib import Path
import pytest import pytest
TEST_ROOT = Path(__file__).parent.resolve() TEST_ROOT = Path(__file__).parent.resolve()
PROJECT_ROOT = TEST_ROOT.parent PROJECT_ROOT = TEST_ROOT.parents[2]
@pytest.fixture @pytest.fixture
@ -17,6 +17,6 @@ def test_root() -> Path:
@pytest.fixture @pytest.fixture
def project_root() -> Path: def project_root() -> Path:
""" """
Root directory of the tests Root directory of the project
""" """
return PROJECT_ROOT return PROJECT_ROOT