bud02 completed
This commit is contained in:
252
tests/file_put.sh
Executable file
252
tests/file_put.sh
Executable file
@@ -0,0 +1,252 @@
|
||||
#!/bin/bash
|
||||
|
||||
# put_test.sh - Test script for Ginxsom Blossom server upload functionality
|
||||
# This script simulates a user uploading a blob to ginxsom using proper Blossom authentication
|
||||
|
||||
set -e # Exit on any error
|
||||
|
||||
# Configuration
|
||||
SERVER_URL="http://localhost:9001"
|
||||
UPLOAD_ENDPOINT="${SERVER_URL}/upload"
|
||||
TEST_FILE="test_blob_$(date +%s).txt"
|
||||
CLEANUP_FILES=()
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Cleanup function
|
||||
cleanup() {
|
||||
echo -e "${YELLOW}Cleaning up temporary files...${NC}"
|
||||
for file in "${CLEANUP_FILES[@]}"; do
|
||||
if [[ -f "$file" ]]; then
|
||||
rm -f "$file"
|
||||
echo "Removed: $file"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Set up cleanup on exit
|
||||
trap cleanup EXIT
|
||||
|
||||
# Helper functions
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
}
|
||||
|
||||
# Check prerequisites
|
||||
check_prerequisites() {
|
||||
log_info "Checking prerequisites..."
|
||||
|
||||
# Check if nak is installed
|
||||
if ! command -v nak &> /dev/null; then
|
||||
log_error "nak command not found. Please install nak first."
|
||||
log_info "Install with: go install github.com/fiatjaf/nak@latest"
|
||||
exit 1
|
||||
fi
|
||||
log_success "nak is installed"
|
||||
|
||||
# Check if curl is available
|
||||
if ! command -v curl &> /dev/null; then
|
||||
log_error "curl command not found. Please install curl."
|
||||
exit 1
|
||||
fi
|
||||
log_success "curl is available"
|
||||
|
||||
# Check if sha256sum is available
|
||||
if ! command -v sha256sum &> /dev/null; then
|
||||
log_error "sha256sum command not found."
|
||||
exit 1
|
||||
fi
|
||||
log_success "sha256sum is available"
|
||||
|
||||
# Check if base64 is available
|
||||
if ! command -v base64 &> /dev/null; then
|
||||
log_error "base64 command not found."
|
||||
exit 1
|
||||
fi
|
||||
log_success "base64 is available"
|
||||
}
|
||||
|
||||
# Check if server is running
|
||||
check_server() {
|
||||
log_info "Checking if server is running..."
|
||||
|
||||
if curl -s -f "${SERVER_URL}/health" > /dev/null 2>&1; then
|
||||
log_success "Server is running at ${SERVER_URL}"
|
||||
else
|
||||
log_error "Server is not responding at ${SERVER_URL}"
|
||||
log_info "Please start the server with: ./scripts/start-fcgi.sh && nginx -p . -c config/local-nginx.conf"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Create test file
|
||||
create_test_file() {
|
||||
log_info "Creating test file: ${TEST_FILE}"
|
||||
|
||||
# Create test content with timestamp and random data
|
||||
cat > "${TEST_FILE}" << EOF
|
||||
Test blob content for Ginxsom Blossom server
|
||||
Timestamp: $(date -Iseconds)
|
||||
Random data: $(openssl rand -hex 32)
|
||||
Test message: Hello from put_test.sh!
|
||||
|
||||
This file is used to test the upload functionality
|
||||
of the Ginxsom Blossom server implementation.
|
||||
EOF
|
||||
|
||||
CLEANUP_FILES+=("${TEST_FILE}")
|
||||
log_success "Created test file with $(wc -c < "${TEST_FILE}") bytes"
|
||||
}
|
||||
|
||||
# Calculate file hash
|
||||
calculate_hash() {
|
||||
log_info "Calculating SHA-256 hash..."
|
||||
|
||||
HASH=$(sha256sum "${TEST_FILE}" | cut -d' ' -f1)
|
||||
|
||||
log_success "Data to hash: ${TEST_FILE}"
|
||||
log_success "File hash: ${HASH}"
|
||||
}
|
||||
|
||||
# Generate nostr event
|
||||
generate_nostr_event() {
|
||||
log_info "Generating kind 24242 nostr event with nak..."
|
||||
|
||||
# Calculate expiration time (1 hour from now)
|
||||
EXPIRATION=$(date -d '+1 hour' +%s)
|
||||
|
||||
# Generate the event using nak
|
||||
EVENT_JSON=$(nak event -k 24242 -c "" \
|
||||
-t "t=upload" \
|
||||
-t "x=${HASH}" \
|
||||
-t "expiration=${EXPIRATION}")
|
||||
|
||||
if [[ -z "$EVENT_JSON" ]]; then
|
||||
log_error "Failed to generate nostr event"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log_success "Generated nostr event"
|
||||
echo "Event JSON: $EVENT_JSON"
|
||||
}
|
||||
|
||||
# Create authorization header
|
||||
create_auth_header() {
|
||||
log_info "Creating authorization header..."
|
||||
|
||||
# Base64 encode the event (without newlines)
|
||||
AUTH_B64=$(echo -n "$EVENT_JSON" | base64 -w 0)
|
||||
AUTH_HEADER="Nostr ${AUTH_B64}"
|
||||
|
||||
log_success "Created authorization header"
|
||||
echo "Auth header length: ${#AUTH_HEADER} characters"
|
||||
}
|
||||
|
||||
# Perform upload
|
||||
perform_upload() {
|
||||
log_info "Performing upload to ${UPLOAD_ENDPOINT}..."
|
||||
|
||||
# Create temporary file for response
|
||||
RESPONSE_FILE=$(mktemp)
|
||||
CLEANUP_FILES+=("${RESPONSE_FILE}")
|
||||
|
||||
# Perform the upload with verbose output
|
||||
HTTP_STATUS=$(curl -s -w "%{http_code}" \
|
||||
-X PUT \
|
||||
-H "Authorization: ${AUTH_HEADER}" \
|
||||
-H "Content-Type: text/plain" \
|
||||
-H "Content-Disposition: attachment; filename=\"${TEST_FILE}\"" \
|
||||
--data-binary "@${TEST_FILE}" \
|
||||
"${UPLOAD_ENDPOINT}" \
|
||||
-o "${RESPONSE_FILE}")
|
||||
|
||||
echo "HTTP Status: ${HTTP_STATUS}"
|
||||
echo "Response body:"
|
||||
cat "${RESPONSE_FILE}"
|
||||
echo
|
||||
|
||||
# Check response
|
||||
case "${HTTP_STATUS}" in
|
||||
200)
|
||||
log_success "Upload successful!"
|
||||
;;
|
||||
201)
|
||||
log_success "Upload successful (created)!"
|
||||
;;
|
||||
400)
|
||||
log_error "Bad request - check the event format"
|
||||
;;
|
||||
401)
|
||||
log_error "Unauthorized - authentication failed"
|
||||
;;
|
||||
405)
|
||||
log_error "Method not allowed - check nginx configuration"
|
||||
;;
|
||||
413)
|
||||
log_error "Payload too large"
|
||||
;;
|
||||
501)
|
||||
log_warning "Upload endpoint not yet implemented (expected for now)"
|
||||
;;
|
||||
*)
|
||||
log_error "Upload failed with HTTP status: ${HTTP_STATUS}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Test file retrieval
|
||||
test_retrieval() {
|
||||
log_info "Testing file retrieval..."
|
||||
|
||||
RETRIEVAL_URL="${SERVER_URL}/${HASH}"
|
||||
|
||||
if curl -s -f "${RETRIEVAL_URL}" > /dev/null 2>&1; then
|
||||
log_success "File can be retrieved at: ${RETRIEVAL_URL}"
|
||||
else
|
||||
log_warning "File not yet available for retrieval (expected if upload processing not implemented)"
|
||||
fi
|
||||
}
|
||||
|
||||
# Main execution
|
||||
main() {
|
||||
echo "=== Ginxsom Blossom Upload Test ==="
|
||||
echo "Timestamp: $(date -Iseconds)"
|
||||
echo
|
||||
|
||||
# check_prerequisites
|
||||
# check_server
|
||||
create_test_file
|
||||
calculate_hash
|
||||
generate_nostr_event
|
||||
create_auth_header
|
||||
perform_upload
|
||||
# test_retrieval
|
||||
|
||||
echo
|
||||
log_info "Test completed!"
|
||||
echo "Summary:"
|
||||
echo " Test file: ${TEST_FILE}"
|
||||
echo " File hash: ${HASH}"
|
||||
echo " Server: ${SERVER_URL}"
|
||||
echo " Upload endpoint: ${UPLOAD_ENDPOINT}"
|
||||
}
|
||||
|
||||
# Run main function
|
||||
main "$@"
|
||||
157
tests/list_test.sh
Executable file
157
tests/list_test.sh
Executable file
@@ -0,0 +1,157 @@
|
||||
#!/bin/bash
|
||||
|
||||
# list_test.sh - Test script for GET /list/<pubkey> endpoint
|
||||
# This script tests the blob listing functionality
|
||||
|
||||
BASE_URL="http://localhost:9001"
|
||||
NOSTR_PRIVKEY="0000000000000000000000000000000000000000000000000000000000000001"
|
||||
NOSTR_PUBKEY="79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798"
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
echo "=== Ginxsom List Blobs Tests ==="
|
||||
echo
|
||||
|
||||
# Function to generate a Nostr event for list authorization
|
||||
generate_list_auth() {
|
||||
local content="$1"
|
||||
local created_at=$(date +%s)
|
||||
local expiration=$((created_at + 3600)) # 1 hour from now
|
||||
|
||||
# Note: This is a placeholder - in real implementation, you'd use nostr tools
|
||||
# to generate properly signed events. For now, we'll create the structure.
|
||||
cat << EOF
|
||||
{
|
||||
"id": "placeholder_id",
|
||||
"pubkey": "$NOSTR_PUBKEY",
|
||||
"kind": 24242,
|
||||
"content": "$content",
|
||||
"created_at": $created_at,
|
||||
"tags": [
|
||||
["t", "list"],
|
||||
["expiration", "$expiration"]
|
||||
],
|
||||
"sig": "placeholder_signature"
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
# Test 1: List blobs without authorization (should work if optional auth)
|
||||
echo -e "${YELLOW}Test 1: GET /list/<pubkey> without authorization${NC}"
|
||||
RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" "$BASE_URL/list/$NOSTR_PUBKEY")
|
||||
HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS" | cut -d: -f2)
|
||||
BODY=$(echo "$RESPONSE" | sed '/HTTP_STATUS/d')
|
||||
|
||||
echo "HTTP Status: $HTTP_STATUS"
|
||||
echo "Response: $BODY"
|
||||
echo
|
||||
|
||||
# # Test 2: List blobs with authorization
|
||||
# echo -e "${YELLOW}Test 2: GET /list/<pubkey> with authorization${NC}"
|
||||
# LIST_AUTH=$(generate_list_auth "List Blobs")
|
||||
# AUTH_B64=$(echo "$LIST_AUTH" | base64 -w 0)
|
||||
# RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \
|
||||
# -H "Authorization: Nostr $AUTH_B64" \
|
||||
# "$BASE_URL/list/$NOSTR_PUBKEY")
|
||||
# HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS" | cut -d: -f2)
|
||||
# BODY=$(echo "$RESPONSE" | sed '/HTTP_STATUS/d')
|
||||
|
||||
# echo "HTTP Status: $HTTP_STATUS"
|
||||
# echo "Response: $BODY"
|
||||
# echo
|
||||
|
||||
# # Test 3: List blobs with since parameter
|
||||
# echo -e "${YELLOW}Test 3: GET /list/<pubkey> with since parameter${NC}"
|
||||
# SINCE_TIMESTAMP=$(($(date +%s) - 86400)) # 24 hours ago
|
||||
# RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \
|
||||
# "$BASE_URL/list/$NOSTR_PUBKEY?since=$SINCE_TIMESTAMP")
|
||||
# HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS" | cut -d: -f2)
|
||||
# BODY=$(echo "$RESPONSE" | sed '/HTTP_STATUS/d')
|
||||
|
||||
# echo "HTTP Status: $HTTP_STATUS"
|
||||
# echo "Response: $BODY"
|
||||
# echo
|
||||
|
||||
# # Test 4: List blobs with until parameter
|
||||
# echo -e "${YELLOW}Test 4: GET /list/<pubkey> with until parameter${NC}"
|
||||
# UNTIL_TIMESTAMP=$(date +%s) # now
|
||||
# RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \
|
||||
# "$BASE_URL/list/$NOSTR_PUBKEY?until=$UNTIL_TIMESTAMP")
|
||||
# HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS" | cut -d: -f2)
|
||||
# BODY=$(echo "$RESPONSE" | sed '/HTTP_STATUS/d')
|
||||
|
||||
# echo "HTTP Status: $HTTP_STATUS"
|
||||
# echo "Response: $BODY"
|
||||
# echo
|
||||
|
||||
# # Test 5: List blobs with both since and until parameters
|
||||
# echo -e "${YELLOW}Test 5: GET /list/<pubkey> with since and until parameters${NC}"
|
||||
# SINCE_TIMESTAMP=$(($(date +%s) - 86400)) # 24 hours ago
|
||||
# UNTIL_TIMESTAMP=$(date +%s) # now
|
||||
# RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \
|
||||
# "$BASE_URL/list/$NOSTR_PUBKEY?since=$SINCE_TIMESTAMP&until=$UNTIL_TIMESTAMP")
|
||||
# HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS" | cut -d: -f2)
|
||||
# BODY=$(echo "$RESPONSE" | sed '/HTTP_STATUS/d')
|
||||
|
||||
# echo "HTTP Status: $HTTP_STATUS"
|
||||
# echo "Response: $BODY"
|
||||
# echo
|
||||
|
||||
# # Test 6: List blobs for non-existent pubkey
|
||||
# echo -e "${YELLOW}Test 6: GET /list/<nonexistent_pubkey>${NC}"
|
||||
# FAKE_PUBKEY="1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"
|
||||
# RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" "$BASE_URL/list/$FAKE_PUBKEY")
|
||||
# HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS" | cut -d: -f2)
|
||||
# BODY=$(echo "$RESPONSE" | sed '/HTTP_STATUS/d')
|
||||
|
||||
# if [ "$HTTP_STATUS" = "200" ]; then
|
||||
# echo -e "${GREEN}✓ Correctly returned 200 with empty array${NC}"
|
||||
# else
|
||||
# echo "HTTP Status: $HTTP_STATUS"
|
||||
# fi
|
||||
# echo "Response: $BODY"
|
||||
# echo
|
||||
|
||||
# # Test 7: List blobs with invalid pubkey format
|
||||
# echo -e "${YELLOW}Test 7: GET /list/<invalid_pubkey_format>${NC}"
|
||||
# INVALID_PUBKEY="invalid_pubkey"
|
||||
# RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" "$BASE_URL/list/$INVALID_PUBKEY")
|
||||
# HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS" | cut -d: -f2)
|
||||
# BODY=$(echo "$RESPONSE" | sed '/HTTP_STATUS/d')
|
||||
|
||||
# if [ "$HTTP_STATUS" = "400" ]; then
|
||||
# echo -e "${GREEN}✓ Correctly returned 400 for invalid pubkey format${NC}"
|
||||
# else
|
||||
# echo "HTTP Status: $HTTP_STATUS"
|
||||
# fi
|
||||
# echo "Response: $BODY"
|
||||
# echo
|
||||
|
||||
# # Test 8: List blobs with invalid since/until parameters
|
||||
# echo -e "${YELLOW}Test 8: GET /list/<pubkey> with invalid timestamp parameters${NC}"
|
||||
# RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" \
|
||||
# "$BASE_URL/list/$NOSTR_PUBKEY?since=invalid&until=invalid")
|
||||
# HTTP_STATUS=$(echo "$RESPONSE" | grep "HTTP_STATUS" | cut -d: -f2)
|
||||
# BODY=$(echo "$RESPONSE" | sed '/HTTP_STATUS/d')
|
||||
|
||||
# echo "HTTP Status: $HTTP_STATUS"
|
||||
# echo "Response: $BODY"
|
||||
# echo
|
||||
|
||||
# echo "=== List Tests Complete ==="
|
||||
# echo
|
||||
# echo "Expected blob descriptor format:"
|
||||
# echo '{'
|
||||
# echo ' "url": "https://server.com/<sha256>.<ext>",'
|
||||
# echo ' "sha256": "<sha256>",'
|
||||
# echo ' "size": <bytes>,'
|
||||
# echo ' "type": "<mime_type>",'
|
||||
# echo ' "uploaded": <unix_timestamp>'
|
||||
# echo '}'
|
||||
# echo
|
||||
# echo "Note: These tests use placeholder Nostr events."
|
||||
# echo "For real testing, use proper Nostr signing tools to generate valid events."
|
||||
Reference in New Issue
Block a user