106 lines
4.1 KiB
Bash
106 lines
4.1 KiB
Bash
#!/usr/bin/env bats
|
|
# EGB-713 version-skew nudge: writer-version stamp, numeric comparator, skew
|
|
# warning, `which` surface. bash 3.2: every standalone [[ ]] ends with || false.
|
|
|
|
load test_helper
|
|
|
|
VERSION_FILE() { echo "$(cd "$(dirname "$SECRETS_BIN")" && pwd)/VERSION"; }
|
|
|
|
# ─── comparator contract ──────────────────────────────────────────────
|
|
|
|
@test "version comparator orders 0.7.0.0 < 0.10.0.0 numerically (not lexically)" {
|
|
run bash -c '
|
|
_version_gt() {
|
|
local a="$1" b="$2" i ai bi; local -a af bf
|
|
IFS=. read -r -a af <<< "$a"; IFS=. read -r -a bf <<< "$b"
|
|
for i in 0 1 2 3; do
|
|
ai=${af[$i]:-0}; ai=${ai//[!0-9]/}; [ -n "$ai" ] || ai=0
|
|
bi=${bf[$i]:-0}; bi=${bi//[!0-9]/}; [ -n "$bi" ] || bi=0
|
|
if [ "$((10#$ai))" -gt "$((10#$bi))" ]; then return 0; fi
|
|
if [ "$((10#$ai))" -lt "$((10#$bi))" ]; then return 1; fi
|
|
done; return 1
|
|
}
|
|
_version_gt 0.10.0.0 0.7.0.0 && echo "10gt7"
|
|
_version_gt 0.7.0.0 0.10.0.0 || echo "7not_gt_10"
|
|
_version_gt 0.7.0.0 0.7.0.0 || echo "equal_not_gt"
|
|
_version_gt 1.0.0.0 0.9.9.9 && echo "major_wins"
|
|
'
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"10gt7"* ]] || false
|
|
[[ "$output" == *"7not_gt_10"* ]] || false
|
|
[[ "$output" == *"equal_not_gt"* ]] || false
|
|
[[ "$output" == *"major_wins"* ]] || false
|
|
}
|
|
|
|
# ─── stamp on write ───────────────────────────────────────────────────
|
|
|
|
@test "push stamps the store writer-version with the client version" {
|
|
init_with_remote
|
|
create_project_dir wvstamp
|
|
"$SECRETS_BIN" push wvstamp >/dev/null 2>&1
|
|
[ -f "$SECRETS_DIR/.secrets-writer-version" ]
|
|
run cat "$SECRETS_DIR/.secrets-writer-version"
|
|
[ "$output" = "$(cat "$(VERSION_FILE)")" ]
|
|
}
|
|
|
|
@test "writer-version stamp is monotonic (a push never lowers a higher stamp)" {
|
|
init_with_remote
|
|
create_project_dir wvmono
|
|
printf '9.9.9.9\n' > "$SECRETS_DIR/.secrets-writer-version"
|
|
"$SECRETS_BIN" push wvmono >/dev/null 2>&1
|
|
run cat "$SECRETS_DIR/.secrets-writer-version"
|
|
[ "$output" = "9.9.9.9" ]
|
|
}
|
|
|
|
@test "writer-version stamp is committed, not gitignored" {
|
|
init_with_remote
|
|
create_project_dir wvcommit
|
|
"$SECRETS_BIN" push wvcommit >/dev/null 2>&1
|
|
run bash -c "git -C $SECRETS_DIR ls-files | grep -qx .secrets-writer-version"
|
|
[ "$status" -eq 0 ]
|
|
}
|
|
|
|
# ─── skew warning on command ──────────────────────────────────────────
|
|
|
|
@test "a store written by a newer version warns on a command (non-fatal)" {
|
|
init_with_remote
|
|
create_project_dir skewwarn
|
|
"$SECRETS_BIN" push skewwarn >/dev/null 2>&1
|
|
printf '99.0.0.0\n' > "$SECRETS_DIR/.secrets-writer-version"
|
|
run "$SECRETS_BIN" list
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"last written by secrets v99.0.0.0"* ]] || false
|
|
[[ "$output" == *"Update your secrets tool"* ]] || false
|
|
}
|
|
|
|
@test "a store at the same/older version is silent" {
|
|
init_with_remote
|
|
create_project_dir noskew
|
|
"$SECRETS_BIN" push noskew >/dev/null 2>&1
|
|
run "$SECRETS_BIN" list
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" != *"Update your secrets tool"* ]] || false
|
|
}
|
|
|
|
@test "a store with no writer-version marker is silent (legacy store)" {
|
|
init_with_remote
|
|
create_project_dir legacynostamp
|
|
"$SECRETS_BIN" push legacynostamp >/dev/null 2>&1
|
|
rm -f "$SECRETS_DIR/.secrets-writer-version"
|
|
run "$SECRETS_BIN" list
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" != *"Update your secrets tool"* ]] || false
|
|
}
|
|
|
|
# ─── which surface ────────────────────────────────────────────────────
|
|
|
|
@test "which prints the store writer-version and a behind note" {
|
|
init_with_remote
|
|
create_project_dir whichwv
|
|
"$SECRETS_BIN" push whichwv >/dev/null 2>&1
|
|
printf '99.0.0.0\n' > "$SECRETS_DIR/.secrets-writer-version"
|
|
run "$SECRETS_BIN" which
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" == *"written-by: v99.0.0.0"* ]] || false
|
|
[[ "$output" == *"behind"* ]] || false
|
|
}
|