Configuration en variables + tests unitaires BATS

- Conversion config hardcodée en variables (CLUSTER_NODES)
- Détection nœud distant data-driven (extensible à 3+ nœuds)
- Tests unitaires BATS avec mocks complets (32 tests)
- CI/CD Forgejo avec shellcheck et validation syntaxe
- Mode test pour sourcing sans exécution du main
This commit is contained in:
Tellsanguis 2025-12-29 12:29:46 +01:00
parent de4b630399
commit dfa5078b47
8 changed files with 908 additions and 15 deletions

170
tests/test_node_config.bats Normal file
View file

@ -0,0 +1,170 @@
#!/usr/bin/env bats
#
# Tests unitaires pour la configuration des nœuds
# Test de la logique de découverte du nœud distant
#
load test_helper
setup() {
setup_script_env
}
teardown() {
cleanup_script_env
}
# ============================================================================
# Tests: Configuration des nœuds avec CLUSTER_NODES
# ============================================================================
@test "CLUSTER_NODES: contient acemagician et elitedesk" {
# Vérifier que le tableau associatif est bien défini
[ -n "${CLUSTER_NODES[acemagician]}" ]
[ -n "${CLUSTER_NODES[elitedesk]}" ]
}
@test "CLUSTER_NODES: IPs correctes pour chaque nœud" {
[ "${CLUSTER_NODES[acemagician]}" = "192.168.100.10" ]
[ "${CLUSTER_NODES[elitedesk]}" = "192.168.100.20" ]
}
# ============================================================================
# Tests: Détection du nœud distant
# ============================================================================
@test "Nœud distant: elitedesk détecte acemagician" {
export TEST_HOSTNAME="elitedesk"
LOCAL_NODE=$(hostname)
# Trouver le nœud distant
REMOTE_NODE_NAME=""
REMOTE_NODE_IP=""
for node in "${!CLUSTER_NODES[@]}"; do
if [[ "$node" != "$LOCAL_NODE" ]]; then
REMOTE_NODE_NAME="$node"
REMOTE_NODE_IP="${CLUSTER_NODES[$node]}"
break
fi
done
[ "$REMOTE_NODE_NAME" = "acemagician" ]
[ "$REMOTE_NODE_IP" = "192.168.100.10" ]
}
@test "Nœud distant: acemagician détecte elitedesk" {
export TEST_HOSTNAME="acemagician"
LOCAL_NODE=$(hostname)
# Trouver le nœud distant
REMOTE_NODE_NAME=""
REMOTE_NODE_IP=""
for node in "${!CLUSTER_NODES[@]}"; do
if [[ "$node" != "$LOCAL_NODE" ]]; then
REMOTE_NODE_NAME="$node"
REMOTE_NODE_IP="${CLUSTER_NODES[$node]}"
break
fi
done
[ "$REMOTE_NODE_NAME" = "elitedesk" ]
[ "$REMOTE_NODE_IP" = "192.168.100.20" ]
}
@test "Nœud distant: erreur si nœud local inconnu" {
export TEST_HOSTNAME="unknown-node"
LOCAL_NODE=$(hostname)
# Vérifier que le nœud local n'est pas dans la config
if [[ ! -v "CLUSTER_NODES[$LOCAL_NODE]" ]]; then
# Comportement attendu : erreur
run echo "Node not found"
[ "$status" -eq 0 ]
else
# Ne devrait pas arriver ici
false
fi
}
@test "Nœud distant: erreur si cluster à 1 seul nœud" {
# Créer un cluster avec un seul nœud
declare -A TEST_CLUSTER=(
["lonely-node"]="192.168.100.99"
)
export TEST_HOSTNAME="lonely-node"
LOCAL_NODE=$(hostname)
# Chercher nœud distant
REMOTE_NODE_NAME=""
REMOTE_NODE_IP=""
for node in "${!TEST_CLUSTER[@]}"; do
if [[ "$node" != "$LOCAL_NODE" ]]; then
REMOTE_NODE_NAME="$node"
REMOTE_NODE_IP="${TEST_CLUSTER[$node]}"
break
fi
done
# Aucun nœud distant trouvé
[ -z "$REMOTE_NODE_NAME" ]
[ -z "$REMOTE_NODE_IP" ]
}
# ============================================================================
# Tests: Extension à 3+ nœuds
# ============================================================================
@test "Cluster 3 nœuds: détecte le premier nœud distant disponible" {
# Créer un cluster avec 3 nœuds
declare -A EXTENDED_CLUSTER=(
["node1"]="192.168.100.10"
["node2"]="192.168.100.20"
["node3"]="192.168.100.30"
)
export TEST_HOSTNAME="node1"
LOCAL_NODE=$(hostname)
# Trouver le premier nœud distant
REMOTE_NODE_NAME=""
REMOTE_NODE_IP=""
for node in "${!EXTENDED_CLUSTER[@]}"; do
if [[ "$node" != "$LOCAL_NODE" ]]; then
REMOTE_NODE_NAME="$node"
REMOTE_NODE_IP="${EXTENDED_CLUSTER[$node]}"
break
fi
done
# Un nœud distant doit être trouvé (node2 ou node3)
[ -n "$REMOTE_NODE_NAME" ]
[ -n "$REMOTE_NODE_IP" ]
[[ "$REMOTE_NODE_NAME" != "node1" ]]
}
# ============================================================================
# Tests: Validation des variables de configuration
# ============================================================================
@test "Variables de config: ZPOOLS est un tableau non vide" {
[ "${#ZPOOLS[@]}" -gt 0 ]
}
@test "Variables de config: CTID est défini" {
[ -n "$CTID" ]
[ "$CTID" -eq "$CTID" ] 2>/dev/null # Vérifier que c'est un nombre
}
@test "Variables de config: CONTAINER_NAME est défini" {
[ -n "$CONTAINER_NAME" ]
}
@test "Variables de config: HEALTH_CHECK_MIN_FREE_SPACE valide" {
[ "$HEALTH_CHECK_MIN_FREE_SPACE" -ge 0 ]
[ "$HEALTH_CHECK_MIN_FREE_SPACE" -le 100 ]
}
@test "Variables de config: HEALTH_CHECK_ERROR_COOLDOWN valide" {
[ "$HEALTH_CHECK_ERROR_COOLDOWN" -gt 0 ]
}