2026-01-06 01:46:25 -08:00
#!/usr/bin/env bash
# Comprehensive Link and Functionality Test for Blockscout Explorer
# Tests all navigation, API endpoints, contract addresses, and interactive elements
set -euo pipefail
2026-02-12 15:46:57 -08:00
# Load IP configuration
SCRIPT_DIR = " $( cd " $( dirname " ${ BASH_SOURCE [0] } " ) " && pwd ) "
PROJECT_ROOT = " $( cd " $SCRIPT_DIR /.. " && pwd ) "
source " ${ PROJECT_ROOT } /config/ip-addresses.conf " 2>/dev/null || true
IP = " ${ IP :- ${ IP_DEVICE_14 :- ${ IP_DEVICE_14 :- ${ IP_DEVICE_14 :- ${ IP_DEVICE_14 :- ${ IP_DEVICE_14 :- 192 .168.11.14 } } } } } 0 } "
2026-01-06 01:46:25 -08:00
DOMAIN = " ${ DOMAIN :- explorer .d-bis.org } "
PASSWORD = " ${ PASSWORD :- L @kers2010 } "
# Colors
RED = '\033[0;31m'
GREEN = '\033[0;32m'
YELLOW = '\033[1;33m'
BLUE = '\033[0;34m'
CYAN = '\033[0;36m'
NC = '\033[0m'
log_info( ) { echo -e " ${ BLUE } [INFO] ${ NC } $1 " ; }
log_success( ) { echo -e " ${ GREEN } [✓] ${ NC } $1 " ; }
log_warn( ) { echo -e " ${ YELLOW } [WARN] ${ NC } $1 " ; }
log_error( ) { echo -e " ${ RED } [ERROR] ${ NC } $1 " ; }
log_test( ) { echo -e " ${ CYAN } [TEST] ${ NC } $1 " ; }
echo "════════════════════════════════════════════════════════"
echo "Explorer Link and Functionality Test"
echo "════════════════════════════════════════════════════════"
echo ""
FAILED = 0
PASSED = 0
test_endpoint( ) {
local name = " $1 "
local url = " $2 "
log_test " Testing: $name "
if response = $( curl -k -sL " $url " 2>& 1) ; then
if echo " $response " | grep -qE "(error|Error|ERROR|404|500)" && ! echo " $response " | grep -qE '"status":"1"|"result":' ; then
log_error " Failed: $name "
( ( FAILED++) )
return 1
else
log_success " Passed: $name "
( ( PASSED++) )
return 0
fi
else
log_error " Failed: $name (connection error) "
( ( FAILED++) )
return 1
fi
}
test_api_endpoint( ) {
local name = " $1 "
local url = " $2 "
log_test " Testing API: $name "
if response = $( curl -k -sL " $url " 2>& 1) ; then
if echo " $response " | python3 -c "import sys, json; d=json.load(sys.stdin); sys.exit(0 if ('result' in d or 'status' in d or 'total_blocks' in d) else 1)" 2>/dev/null; then
log_success " Passed: $name "
( ( PASSED++) )
return 0
else
log_error " Failed: $name (invalid JSON or missing expected fields) "
( ( FAILED++) )
return 1
fi
else
log_error " Failed: $name (connection error) "
( ( FAILED++) )
return 1
fi
}
echo "════════════════════════════════════════════════════════"
echo "1. BASIC CONNECTIVITY TESTS"
echo "════════════════════════════════════════════════════════"
echo ""
test_endpoint "Home Page" "https://explorer.d-bis.org/"
test_endpoint "HTTPS Redirect" "http://explorer.d-bis.org/"
echo ""
echo "════════════════════════════════════════════════════════"
echo "2. API ENDPOINT TESTS"
echo "════════════════════════════════════════════════════════"
echo ""
# Get latest block number first
LATEST_BLOCK_HEX = $( curl -k -sL 'https://explorer.d-bis.org/api?module=block&action=eth_block_number' 2>& 1 | python3 -c "import sys, json; d=json.load(sys.stdin); print(d.get('result', '0x0'))" 2>/dev/null || echo "0x0" )
test_api_endpoint "Network Stats API" "https://explorer.d-bis.org/api/v2/stats"
test_api_endpoint "Block Number API" "https://explorer.d-bis.org/api?module=block&action=eth_block_number"
if [ " $LATEST_BLOCK_HEX " != "0x0" ] && [ -n " $LATEST_BLOCK_HEX " ] ; then
test_api_endpoint "Block Data API" " https://explorer.d-bis.org/api?module=block&action=eth_get_block_by_number&tag= $LATEST_BLOCK_HEX &boolean=false "
fi
echo ""
echo "════════════════════════════════════════════════════════"
echo "3. CONTRACT ADDRESS TESTS"
echo "════════════════════════════════════════════════════════"
echo ""
# Contract addresses
CONTRACTS = (
"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2:WETH9"
"0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f:WETH10"
"0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e:CCIP Router"
"0x105F8A15b819948a89153505762444Ee9f324684:CCIP Sender"
2026-02-12 15:46:57 -08:00
" ${ CCIPWETH9_BRIDGE_CHAIN138 :- 0x89dd12025bfCD38A168455A44B400e913ED33BE2 } :WETH9 Bridge "
2026-01-06 01:46:25 -08:00
"0xe0E93247376aa097dB308B92e6Ba36bA015535D0:WETH10 Bridge"
)
for contract_info in " ${ CONTRACTS [@] } " ; do
IFS = ':' read -r addr name <<< " $contract_info "
test_api_endpoint " $name Balance " " https://explorer.d-bis.org/api?module=account&action=eth_get_balance&address= $addr &tag=latest "
done
echo ""
echo "════════════════════════════════════════════════════════"
echo "4. EXTERNAL RESOURCE TESTS"
echo "════════════════════════════════════════════════════════"
echo ""
test_endpoint "Font Awesome CDN" "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"
test_endpoint "Ethers.js CDN" "https://cdn.ethers.io/lib/ethers-5.7.2.umd.min.js"
echo ""
echo "════════════════════════════════════════════════════════"
echo "5. NAVIGATION FUNCTION TESTS"
echo "════════════════════════════════════════════════════════"
echo ""
# Check if JavaScript functions exist in HTML
log_test "Checking JavaScript functions..."
FUNCTIONS = (
"showHome"
"showBlocks"
"showTransactions"
"showBridgeMonitoring"
"showWETHUtilities"
"connectMetaMask"
"wrapWETH9"
"unwrapWETH9"
"wrapWETH10"
"unwrapWETH10"
"refreshWETHBalances"
"handleSearch"
)
sshpass -p " $PASSWORD " ssh -o StrictHostKeyChecking = no root@" $IP " "cat /var/www/html/index.html" > /tmp/explorer-html.txt
for func in " ${ FUNCTIONS [@] } " ; do
if grep -q " function $func \| $func () " /tmp/explorer-html.txt; then
log_success " Function exists: $func "
( ( PASSED++) )
else
log_error " Function missing: $func "
( ( FAILED++) )
fi
done
echo ""
echo "════════════════════════════════════════════════════════"
echo "6. HTML STRUCTURE TESTS"
echo "════════════════════════════════════════════════════════"
echo ""
log_test "Checking HTML structure..."
ELEMENTS = (
"navbar"
"nav-links"
"searchInput"
"homeView"
"blocksView"
"transactionsView"
"bridgeView"
"wethView"
"metamaskStatus"
)
for element in " ${ ELEMENTS [@] } " ; do
if grep -q " id=\" $element \"\|class=\" $element \" " /tmp/explorer-html.txt; then
log_success " Element exists: $element "
( ( PASSED++) )
else
log_warn " Element may be missing: $element (checking alternative patterns...) "
if grep -qi " $element " /tmp/explorer-html.txt; then
log_success " Element found (alternative pattern): $element "
( ( PASSED++) )
else
log_error " Element missing: $element "
( ( FAILED++) )
fi
fi
done
echo ""
echo "════════════════════════════════════════════════════════"
echo "7. CONTRACT ADDRESS REFERENCES"
echo "════════════════════════════════════════════════════════"
echo ""
log_test "Checking contract address references..."
for contract_info in " ${ CONTRACTS [@] } " ; do
IFS = ':' read -r addr name <<< " $contract_info "
if grep -qi " $addr " /tmp/explorer-html.txt; then
log_success " Address referenced: $name ( $addr ) "
( ( PASSED++) )
else
log_warn " Address not found: $name ( $addr ) "
( ( FAILED++) )
fi
done
echo ""
echo "════════════════════════════════════════════════════════"
echo "8. SSL/TLS TESTS"
echo "════════════════════════════════════════════════════════"
echo ""
log_test "Testing SSL configuration..."
if curl -k -sI "https://explorer.d-bis.org/" 2>& 1 | grep -qi "HTTP/2\|200\|strict-transport-security" ; then
log_success "SSL/TLS working correctly"
( ( PASSED++) )
else
log_error "SSL/TLS issue detected"
( ( FAILED++) )
fi
# Test HSTS header
if curl -k -sI "https://explorer.d-bis.org/" 2>& 1 | grep -qi "strict-transport-security" ; then
log_success "HSTS header present"
( ( PASSED++) )
else
log_warn "HSTS header not found (may be in Cloudflare)"
( ( PASSED++) )
fi
echo ""
echo "════════════════════════════════════════════════════════"
echo "TEST SUMMARY"
echo "════════════════════════════════════════════════════════"
echo ""
TOTAL = $(( PASSED + FAILED))
PERCENTAGE = $(( PASSED * 100 / TOTAL))
echo " Tests Passed: $PASSED / $TOTAL "
echo " Tests Failed: $FAILED / $TOTAL "
echo " Success Rate: $PERCENTAGE % "
echo ""
if [ $FAILED -eq 0 ] ; then
log_success "All tests passed! ✅"
exit 0
elif [ $PERCENTAGE -ge 90 ] ; then
log_warn "Most tests passed, minor issues detected ⚠️"
exit 0
else
log_error "Multiple test failures detected ❌"
exit 1
fi