Files
super_ball_thrower/tests/test_thrower_info.sh
2025-12-17 09:43:21 -04:00

235 lines
6.9 KiB
Bash
Executable File

#!/bin/bash
# Test SUP-06: Thrower Information Publishing
# Tests: Kind 12222 thrower information events
set -e
TEST_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$TEST_DIR/helpers/timing_utils.sh"
source "$TEST_DIR/helpers/event_utils.sh"
# Load test configuration
KEYS_FILE="$TEST_DIR/fixtures/test_keys.json"
RELAYS_FILE="$TEST_DIR/fixtures/test_relays.json"
# Extract keys
THROWER_A_PUBKEY=$(jq -r '.thrower_a.pubkey' "$KEYS_FILE")
# Extract relays
THROWER_RELAY=$(jq -r '.test_scenarios.single_hop.thrower_relay' "$RELAYS_FILE")
echo "=== SUP-06: Thrower Information Test ==="
echo "Thrower A: $THROWER_A_PUBKEY"
echo "Monitoring relay: $THROWER_RELAY"
echo ""
echo "Step 1: Query for existing kind 12222 events from Thrower A"
echo "Searching for thrower information document..."
echo ""
# Query for kind 12222 events from this thrower
THROWER_INFO=$(nak req --relay "$THROWER_RELAY" -k 12222 -a "$THROWER_A_PUBKEY" --limit 1 --timeout 10 2>/dev/null | \
jq -s 'sort_by(.created_at) | reverse | .[0]' 2>/dev/null || echo "{}")
if [ "$(echo "$THROWER_INFO" | jq -r '.id')" = "null" ] || [ "$(echo "$THROWER_INFO" | jq -r '.id')" = "" ]; then
echo "⚠ No thrower information found"
echo "This could mean:"
echo " - Thrower A is not running"
echo " - Auto-publish hasn't triggered yet"
echo " - Thrower A hasn't published to this relay"
echo ""
echo "Waiting 10 seconds for auto-publish..."
sleep 10
# Try again
THROWER_INFO=$(nak req --relay "$THROWER_RELAY" -k 12222 -a "$THROWER_A_PUBKEY" --limit 1 --timeout 10 2>/dev/null | \
jq -s 'sort_by(.created_at) | reverse | .[0]' 2>/dev/null || echo "{}")
if [ "$(echo "$THROWER_INFO" | jq -r '.id')" = "null" ] || [ "$(echo "$THROWER_INFO" | jq -r '.id')" = "" ]; then
echo "✗ FAILED: No thrower information found after waiting"
echo "Please ensure Thrower A is running with auto-publish enabled"
exit 1
fi
fi
THROWER_INFO_ID=$(echo "$THROWER_INFO" | jq -r '.id')
echo "✓ Found thrower information: $THROWER_INFO_ID"
echo ""
echo "Step 2: Verify event structure"
echo ""
# Verify kind
KIND=$(echo "$THROWER_INFO" | jq -r '.kind')
if [ "$KIND" != "12222" ]; then
echo "✗ FAILED: Wrong event kind (expected 12222, got $KIND)"
exit 1
fi
echo "✓ Kind: 12222"
# Verify pubkey
PUBKEY=$(echo "$THROWER_INFO" | jq -r '.pubkey')
if [ "$PUBKEY" != "$THROWER_A_PUBKEY" ]; then
echo "✗ FAILED: Wrong pubkey"
exit 1
fi
echo "✓ Pubkey: $PUBKEY"
# Parse content (should be JSON)
CONTENT=$(echo "$THROWER_INFO" | jq -r '.content')
CONTENT_JSON=$(echo "$CONTENT" | jq '.' 2>/dev/null || echo "{}")
if [ "$(echo "$CONTENT_JSON" | jq -r 'type')" != "object" ]; then
echo "✗ FAILED: Content is not valid JSON"
exit 1
fi
echo "✓ Content is valid JSON"
echo ""
echo "Step 3: Verify required fields"
echo ""
# Check required fields
REQUIRED_FIELDS=("name" "description" "maxDelay" "refreshRate" "supportedSups" "software" "version" "relays")
MISSING_FIELDS=()
for field in "${REQUIRED_FIELDS[@]}"; do
if ! echo "$CONTENT_JSON" | jq -e ".$field" > /dev/null 2>&1; then
MISSING_FIELDS+=("$field")
fi
done
if [ ${#MISSING_FIELDS[@]} -gt 0 ]; then
echo "✗ FAILED: Missing required fields: ${MISSING_FIELDS[*]}"
exit 1
fi
echo "✓ All required fields present"
echo ""
echo "Step 4: Verify field values"
echo ""
# Extract and display fields
NAME=$(echo "$CONTENT_JSON" | jq -r '.name')
DESCRIPTION=$(echo "$CONTENT_JSON" | jq -r '.description')
MAX_DELAY=$(echo "$CONTENT_JSON" | jq -r '.maxDelay')
REFRESH_RATE=$(echo "$CONTENT_JSON" | jq -r '.refreshRate')
SUPPORTED_SUPS=$(echo "$CONTENT_JSON" | jq -r '.supportedSups')
SOFTWARE=$(echo "$CONTENT_JSON" | jq -r '.software')
VERSION=$(echo "$CONTENT_JSON" | jq -r '.version')
RELAYS=$(echo "$CONTENT_JSON" | jq -r '.relays')
echo "Name: $NAME"
echo "Description: $DESCRIPTION"
echo "Max Delay: ${MAX_DELAY}s"
echo "Refresh Rate: ${REFRESH_RATE}s"
echo "Supported SUPs: $SUPPORTED_SUPS"
echo "Software: $SOFTWARE"
echo "Version: $VERSION"
echo ""
# Verify maxDelay is a number
if ! [[ "$MAX_DELAY" =~ ^[0-9]+$ ]]; then
echo "✗ FAILED: maxDelay is not a number"
exit 1
fi
echo "✓ maxDelay is valid: ${MAX_DELAY}s"
# Verify refreshRate is a number
if ! [[ "$REFRESH_RATE" =~ ^[0-9]+$ ]]; then
echo "✗ FAILED: refreshRate is not a number"
exit 1
fi
echo "✓ refreshRate is valid: ${REFRESH_RATE}s"
# Verify supportedSups contains expected values
if ! echo "$SUPPORTED_SUPS" | grep -qE "[1-6]"; then
echo "✗ FAILED: supportedSups doesn't contain expected SUP numbers"
exit 1
fi
echo "✓ supportedSups is valid: $SUPPORTED_SUPS"
# Verify relays is an array
RELAY_COUNT=$(echo "$CONTENT_JSON" | jq '.relays | length')
if [ "$RELAY_COUNT" -eq 0 ]; then
echo "✗ FAILED: No relays configured"
exit 1
fi
echo "✓ Relays configured: $RELAY_COUNT relay(s)"
echo ""
echo "Step 5: Verify relay configurations"
echo ""
# Check each relay has required fields
for i in $(seq 0 $((RELAY_COUNT - 1))); do
RELAY_URL=$(echo "$CONTENT_JSON" | jq -r ".relays[$i].url")
RELAY_READ=$(echo "$CONTENT_JSON" | jq -r ".relays[$i].read")
RELAY_WRITE=$(echo "$CONTENT_JSON" | jq -r ".relays[$i].write")
if [ -z "$RELAY_URL" ] || [ "$RELAY_URL" = "null" ]; then
echo "✗ FAILED: Relay $i missing URL"
exit 1
fi
if [ "$RELAY_READ" != "true" ] && [ "$RELAY_READ" != "false" ]; then
echo "✗ FAILED: Relay $i has invalid read flag"
exit 1
fi
if [ "$RELAY_WRITE" != "true" ] && [ "$RELAY_WRITE" != "false" ]; then
echo "✗ FAILED: Relay $i has invalid write flag"
exit 1
fi
echo " Relay $((i+1)): $RELAY_URL (read: $RELAY_READ, write: $RELAY_WRITE)"
done
echo ""
echo "✓ All relay configurations valid"
echo ""
echo "Step 6: Verify event signature"
if ! verify_event_signature "$THROWER_INFO"; then
echo "✗ FAILED: Invalid event signature"
exit 1
fi
echo "✓ Event signature valid"
echo ""
echo "Step 7: Check event age (should be recent)"
CREATED_AT=$(echo "$THROWER_INFO" | jq -r '.created_at')
CURRENT_TIME=$(date +%s)
AGE=$((CURRENT_TIME - CREATED_AT))
echo "Event age: ${AGE}s"
if [ $AGE -gt 3600 ]; then
echo "⚠ WARNING: Event is older than 1 hour"
echo " This may indicate auto-publish is not working correctly"
else
echo "✓ Event is recent (< 1 hour old)"
fi
echo ""
echo "=== TEST PASSED ==="
echo "✓ Thrower information document found"
echo "✓ Event structure valid (kind 12222)"
echo "✓ All required fields present"
echo "✓ Field values valid"
echo "✓ Relay configurations valid"
echo "✓ Event signature valid"
echo ""
echo "Thrower Information Summary:"
echo " Name: $NAME"
echo " Supported SUPs: $SUPPORTED_SUPS"
echo " Max Delay: ${MAX_DELAY}s"
echo " Refresh Rate: ${REFRESH_RATE}s"
echo " Relays: $RELAY_COUNT"
echo " Version: $VERSION"
echo ""
exit 0