wgctl/commands/test.command.sh
Nuno Duque Nunes 8bb1de4976 init feature
2026-05-19 15:26:31 +00:00

165 lines
No EOL
4.3 KiB
Bash

#!/usr/bin/env bash
# test.command.sh — wgctl test suite dispatcher
# Delegates to commands/test/{integration,unit,destructive,fn}.sh
# ============================================
# Lifecycle
# ============================================
function cmd::test::on_load() {
flag::register --destructive
flag::register --section
flag::register --fn
flag::register --function
flag::register --unit
flag::register --integration
flag::register --verbose
}
# ============================================
# Help
# ============================================
function cmd::test::help() {
cat <<EOF
Usage: wgctl test [options]
Run the wgctl test suite.
Options:
--unit Run unit tests (pure function tests, no side effects)
--integration Run integration tests against the live binary (default)
--destructive Include destructive tests (add/remove/block state changes)
--section <name> Run only a specific section
--fn <function> Run a specific function test block
--verbose Show command output on failure
Integration sections:
list, inspect, config, rules, groups, audit, logs, fw, net, subnet, identity
Unit sections:
subnet, identity, ip
Examples:
wgctl test
wgctl test --unit
wgctl test --unit --section subnet
wgctl test --integration --section rules
wgctl test --destructive
wgctl test --fn cmd::block::run
EOF
}
# ============================================
# Loader
# ============================================
function cmd::test::_load() {
local name="${1:-}"
local path
path="$(ctx::commands)/test/${name}.sh"
if [[ ! -f "$path" ]]; then
log::error "Test file not found: ${path}"
return 1
fi
source "$path"
}
# ============================================
# Run (entrypoint)
# ============================================
function cmd::test::run() {
local unit=false integration=false destructive=false
local section="" fn=""
while [[ $# -gt 0 ]]; do
case "$1" in
--unit) unit=true; shift ;;
--integration) integration=true; shift ;;
--destructive) destructive=true; shift ;;
--section) section="$2"; shift 2 ;;
--fn|--function) fn="$2"; shift 2 ;;
--verbose|-v) WGCTL_TEST_VERBOSE=true; shift ;;
--help) cmd::test::help; return ;;
*)
log::error "Unknown flag: $1"
return 1
;;
esac
done
# Function test — load fn.sh + integration.sh (needs run_cmd helpers)
if [[ -n "$fn" ]]; then
cmd::test::_load integration || return 1
cmd::test::_load fn || return 1
test::reset
log::section "Function Test: ${fn}"
cmd::test::_dispatch_fn "$fn"
test::summary
return
fi
# Unit tests
if $unit; then
cmd::test::_load unit || return 1
test::reset
log::section "wgctl Unit Tests"
cmd::test::_dispatch_unit "$section"
test::summary
return
fi
# Integration tests (default, also when --integration is explicit)
cmd::test::_load integration || return 1
cmd::test::_load destructive || return 1
test::reset
log::section "wgctl Test Suite"
cmd::test::_dispatch_integration "$section"
$destructive && cmd::test::section_destructive
test::summary
}
# ============================================
# Dispatch Helpers
# ============================================
function cmd::test::_dispatch_unit() {
local section="${1:-}"
if [[ -n "$section" ]]; then
local fn="cmd::test::unit_${section}"
if ! declare -f "$fn" > /dev/null 2>&1; then
log::error "No unit section: ${section}"
return 1
fi
"$fn"
else
cmd::test::run_all_unit_sections
fi
}
function cmd::test::_dispatch_integration() {
local section="${1:-}"
if [[ -n "$section" ]]; then
if [[ "$section" == "destructive" ]]; then
cmd::test::section_destructive
return
fi
local fn="cmd::test::section_${section}"
if ! declare -f "$fn" > /dev/null 2>&1; then
log::error "No integration section: ${section}"
return 1
fi
"$fn"
else
cmd::test::run_all_integration_sections
fi
}
function cmd::test::_dispatch_fn() {
local fn="${1:-}"
local namespace
namespace=$(echo "$fn" | cut -d':' -f3)
load_command "$namespace" 2>/dev/null || true
cmd::test::run_function "$fn"
}