#!/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