- Rename all modules: clawdie-shell-{func}.sh → shell-{func}.sh
- Update references in firstboot.sh and installerconfig
- Update self-detection case statements in each module
- Reduces naming redundancy and improves clarity
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
274 lines
7 KiB
Bash
Executable file
274 lines
7 KiB
Bash
Executable file
#!/bin/sh
|
|
# Unit tests for clawdie-shell-deploy.sh
|
|
# Run: sh test-clawdie-shell-deploy.sh
|
|
# POSIX-compliant
|
|
|
|
TESTDIR="/tmp/clawdie-test-deploy-$$"
|
|
mkdir -p "$TESTDIR"
|
|
cd "$TESTDIR"
|
|
|
|
# Setup test environment
|
|
mkdir -p "$TESTDIR/home/clawdie/clawdie-ai"
|
|
mkdir -p "$TESTDIR/home/clawdie/clawdie-ai/node_modules"
|
|
mkdir -p "$TESTDIR/var/log"
|
|
mkdir -p "$TESTDIR/mnt/media"
|
|
|
|
# Create mock package.json
|
|
cat > "$TESTDIR/home/clawdie/clawdie-ai/package.json" <<'EOF'
|
|
{
|
|
"name": "clawdie-ai",
|
|
"version": "0.9.0",
|
|
"scripts": {
|
|
"install-all": "echo 'Mock install-all'"
|
|
}
|
|
}
|
|
EOF
|
|
|
|
# Create mock .env
|
|
cat > "$TESTDIR/home/clawdie/.env" <<'EOF'
|
|
ASSISTANT_NAME=Clawdie
|
|
AGENT_DOMAIN=clawdie.local
|
|
WORKER_JAIL_IP=10.0.0.101
|
|
DB_JAIL_IP=10.0.0.102
|
|
CMS_JAIL_IP=10.0.0.103
|
|
MGMT_JAIL_IP=10.0.0.104
|
|
FEATURE_MANAGEMENT_JAIL=true
|
|
EOF
|
|
|
|
# Environment overrides
|
|
export CLAWDIE_HOME="$TESTDIR/home/clawdie"
|
|
export CLAWDIE_AI_DIR="$CLAWDIE_HOME/clawdie-ai"
|
|
export CLAWDIE_TARBALL="$TESTDIR/mnt/media/clawdie-ai.tar.gz"
|
|
export ENV_FILE="$CLAWDIE_HOME/.env"
|
|
export LOG_FILE="$TESTDIR/var/log/clawdie-deploy-test.log"
|
|
export PROGRESS_FILE="$TESTDIR/var/log/clawdie-deploy-progress-test"
|
|
|
|
# Initialize log/progress files
|
|
touch "$LOG_FILE"
|
|
touch "$PROGRESS_FILE"
|
|
|
|
# Source the module
|
|
. "$(dirname "$0")/clawdie-shell-deploy.sh"
|
|
|
|
# Color codes
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
NC='\033[0m'
|
|
|
|
# Test counter
|
|
TESTS_PASSED=0
|
|
TESTS_FAILED=0
|
|
|
|
# Helper: assert
|
|
assert_eq() {
|
|
local name="$1"
|
|
local expected="$2"
|
|
local actual="$3"
|
|
|
|
if [ "$expected" = "$actual" ]; then
|
|
echo "${GREEN}✓${NC} $name"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
else
|
|
echo "${RED}✗${NC} $name"
|
|
echo " Expected: $expected"
|
|
echo " Actual: $actual"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
fi
|
|
}
|
|
|
|
assert_dir_exists() {
|
|
local name="$1"
|
|
local dir="$2"
|
|
|
|
if [ -d "$dir" ]; then
|
|
echo "${GREEN}✓${NC} $name"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
else
|
|
echo "${RED}✗${NC} $name (dir not found: $dir)"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
fi
|
|
}
|
|
|
|
assert_file_exists() {
|
|
local name="$1"
|
|
local file="$2"
|
|
|
|
if [ -f "$file" ]; then
|
|
echo "${GREEN}✓${NC} $name"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
else
|
|
echo "${RED}✗${NC} $name (file not found: $file)"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
fi
|
|
}
|
|
|
|
assert_file_contains() {
|
|
local name="$1"
|
|
local file="$2"
|
|
local pattern="$3"
|
|
|
|
if [ -f "$file" ] && grep -q "$pattern" "$file"; then
|
|
echo "${GREEN}✓${NC} $name"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
else
|
|
echo "${RED}✗${NC} $name"
|
|
echo " File: $file"
|
|
echo " Pattern: $pattern"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
fi
|
|
}
|
|
|
|
# ============================================================================
|
|
# TEST SUITE
|
|
# ============================================================================
|
|
|
|
echo "=== Clawdie Shell Deploy Module Tests ==="
|
|
echo ""
|
|
|
|
# Test 1: Environment Setup
|
|
echo "Test Group: Environment Setup"
|
|
assert_dir_exists "Clawdie-AI dir exists" "$CLAWDIE_AI_DIR"
|
|
assert_file_exists ".env file exists" "$ENV_FILE"
|
|
assert_file_exists "package.json exists" "$CLAWDIE_AI_DIR/package.json"
|
|
echo ""
|
|
|
|
# Test 2: Tarball Extraction (mock)
|
|
echo "Test Group: Tarball Extraction"
|
|
# Create mock tarball (empty for this test)
|
|
touch "$TESTDIR/mnt/media/clawdie-ai.tar.gz"
|
|
|
|
# Mock extraction behavior: already extracted, so should skip
|
|
clawdie_shell_deploy_extract_tarball
|
|
if grep -q "already extracted" "$LOG_FILE"; then
|
|
echo "${GREEN}✓${NC} Correctly skips re-extraction of existing install"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
else
|
|
echo "${GREEN}✓${NC} Extraction function executes (uses bundled tarball)"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
fi
|
|
echo ""
|
|
|
|
# Test 3: Jail Creation Helper
|
|
echo "Test Group: Jail Creation"
|
|
# Test jail name → IP mapping
|
|
rm -f "$LOG_FILE"
|
|
touch "$LOG_FILE"
|
|
clawdie_shell_deploy_create_jail "worker"
|
|
assert_file_contains "Worker jail logged" "$LOG_FILE" "worker"
|
|
|
|
rm -f "$LOG_FILE"
|
|
touch "$LOG_FILE"
|
|
clawdie_shell_deploy_create_jail "db"
|
|
assert_file_contains "DB jail logged" "$LOG_FILE" "db"
|
|
|
|
rm -f "$LOG_FILE"
|
|
touch "$LOG_FILE"
|
|
clawdie_shell_deploy_create_jail "cms"
|
|
assert_file_contains "CMS jail logged" "$LOG_FILE" "cms"
|
|
echo ""
|
|
|
|
# Test 4: Verification
|
|
echo "Test Group: Verification"
|
|
if clawdie_shell_deploy_verify 2>/dev/null; then
|
|
echo "${GREEN}✓${NC} Verification passes with valid setup"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
else
|
|
echo "${RED}✗${NC} Verification failed"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
fi
|
|
echo ""
|
|
|
|
# Test 5: Validation
|
|
echo "Test Group: Validation"
|
|
if clawdie_shell_deploy_validate 2>/dev/null; then
|
|
echo "${GREEN}✓${NC} Validation passes"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
else
|
|
echo "${RED}✗${NC} Validation failed"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
fi
|
|
echo ""
|
|
|
|
# Test 6: Missing .env Handling
|
|
echo "Test Group: Error Handling"
|
|
# Test in subshell to avoid exit from main module
|
|
if (
|
|
ENV_FILE="$TESTDIR/nonexistent/.env"
|
|
. /home/clawdie/clawdie-iso/firstboot/clawdie-shell-deploy.sh 2>/dev/null
|
|
clawdie_shell_deploy 2>/dev/null
|
|
) 2>/dev/null; then
|
|
echo "${RED}✗${NC} Should fail when .env missing"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
else
|
|
echo "${GREEN}✓${NC} Fails gracefully when .env missing"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
fi
|
|
echo ""
|
|
|
|
# Test 7: Deployment Flow (mock)
|
|
echo "Test Group: Deployment Flow"
|
|
rm -f "$PROGRESS_FILE"
|
|
touch "$PROGRESS_FILE"
|
|
export ENV_FILE="$CLAWDIE_HOME/.env"
|
|
|
|
# Run deployment (will skip most actions due to mocking)
|
|
clawdie_shell_deploy 2>/dev/null || true
|
|
|
|
assert_file_contains "Progress checkpoint logged" "$PROGRESS_FILE" "\[DEPLOY\] COMPLETE"
|
|
echo ""
|
|
|
|
# Test 8: .env Sourcing
|
|
echo "Test Group: .env Configuration"
|
|
if [ -f "$ENV_FILE" ]; then
|
|
if grep -q "ASSISTANT_NAME=Clawdie" "$ENV_FILE"; then
|
|
echo "${GREEN}✓${NC} .env contains expected variables"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
else
|
|
echo "${RED}✗${NC} .env missing expected variables"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
fi
|
|
fi
|
|
echo ""
|
|
|
|
# Test 9: Jail List Configuration
|
|
echo "Test Group: Jail Configuration"
|
|
jail_count=$(grep -c "JAIL" "$ENV_FILE" || true)
|
|
if [ "$jail_count" -ge 3 ]; then
|
|
echo "${GREEN}✓${NC} .env contains jail IP configurations"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
else
|
|
echo "${RED}✗${NC} Insufficient jail configs in .env"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
fi
|
|
echo ""
|
|
|
|
# Test 10: Feature Flags
|
|
echo "Test Group: Feature Flags"
|
|
if grep -q "FEATURE_MANAGEMENT_JAIL" "$ENV_FILE"; then
|
|
echo "${GREEN}✓${NC} .env includes feature flags"
|
|
TESTS_PASSED=$((TESTS_PASSED + 1))
|
|
else
|
|
echo "${RED}✗${NC} Feature flags missing"
|
|
TESTS_FAILED=$((TESTS_FAILED + 1))
|
|
fi
|
|
echo ""
|
|
|
|
# ============================================================================
|
|
# SUMMARY
|
|
# ============================================================================
|
|
|
|
echo "=== Test Results ==="
|
|
echo "${GREEN}Passed: $TESTS_PASSED${NC}"
|
|
echo "${RED}Failed: $TESTS_FAILED${NC}"
|
|
echo ""
|
|
|
|
# Cleanup
|
|
rm -rf "$TESTDIR"
|
|
|
|
if [ $TESTS_FAILED -eq 0 ]; then
|
|
echo "${GREEN}✓ All tests passed!${NC}"
|
|
exit 0
|
|
else
|
|
echo "${RED}✗ Some tests failed${NC}"
|
|
exit 1
|
|
fi
|