🔨 Add some tests utilities of activity pub

This commit is contained in:
2025-12-28 18:26:23 +08:00
parent 2471fa2e75
commit 9f4a7a3fe8
13 changed files with 3477 additions and 0 deletions

303
setup-activitypub-test.sh Executable file
View File

@@ -0,0 +1,303 @@
#!/bin/bash
# Quick setup script for ActivityPub testing
set -e
echo "======================================"
echo "ActivityPub Testing Setup"
echo "======================================"
echo ""
# Colors
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# Configuration
SOLAR_DOMAIN="solar.local"
SOLAR_PORT="5000"
MASTODON_DOMAIN="mastodon.local"
MASTODON_PORT="3001"
echo -e "${YELLOW}1. Checking prerequisites...${NC}"
# Check if Docker is installed
if ! command -v docker &> /dev/null; then
echo -e "${RED}Error: Docker is not installed${NC}"
exit 1
fi
# Check if docker-compose is installed
if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then
echo -e "${RED}Error: docker-compose is not installed${NC}"
exit 1
fi
# Check if psql is installed
if ! command -v psql &> /dev/null; then
echo -e "${RED}Error: PostgreSQL client (psql) is not installed${NC}"
exit 1
fi
echo -e "${GREEN}✓ All prerequisites found${NC}"
echo ""
echo -e "${YELLOW}2. Updating /etc/hosts...${NC}"
# Backup hosts file
sudo cp /etc/hosts /etc/hosts.backup
# Check if entries already exist
if ! grep -q "$SOLAR_DOMAIN" /etc/hosts; then
echo "127.0.0.1 $SOLAR_DOMAIN" | sudo tee -a /etc/hosts > /dev/null
echo -e "${GREEN}✓ Added $SOLAR_DOMAIN to hosts${NC}"
else
echo -e "${YELLOW}$SOLAR_DOMAIN already in hosts${NC}"
fi
if ! grep -q "$MASTODON_DOMAIN" /etc/hosts; then
echo "127.0.0.1 $MASTODON_DOMAIN" | sudo tee -a /etc/hosts > /dev/null
echo -e "${GREEN}✓ Added $MASTODON_DOMAIN to hosts${NC}"
else
echo -e "${YELLOW}$MASTODON_DOMAIN already in hosts${NC}"
fi
echo ""
echo -e "${YELLOW}3. Generating secrets for Mastodon...${NC}"
SECRET_KEY_BASE=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-32)
OTP_SECRET=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-32)
cat > .env.mastodon <<EOF
# Federation
LOCAL_DOMAIN=$MASTODON_DOMAIN
LOCAL_HTTPS=false
# Database
DB_HOST=db
DB_PORT=5432
DB_USER=mastodon
DB_NAME=mastodon
DB_PASS=mastodon_password
# Redis
REDIS_HOST=redis
REDIS_PORT=6379
# Elasticsearch
ES_ENABLED=true
ES_HOST=es
ES_PORT=9200
# Secrets
SECRET_KEY_BASE=$SECRET_KEY_BASE
OTP_SECRET=$OTP_SECRET
# Defaults
SINGLE_USER_MODE=false
DEFAULT_LOCALE=en
EOF
echo -e "${GREEN}✓ Generated .env.mastodon${NC}"
echo ""
echo -e "${YELLOW}4. Creating Docker Compose for Mastodon...${NC}"
cat > docker-compose.mastodon-test.yml <<EOF
version: '3'
services:
db:
restart: always
image: postgres:14-alpine
shm_size: 256mb
networks:
- mastodon_network
environment:
POSTGRES_USER: mastodon
POSTGRES_PASSWORD: mastodon_password
POSTGRES_DB: mastodon
healthcheck:
test: ["CMD", "pg_isready", "-U", "mastodon"]
interval: 5s
retries: 5
redis:
restart: always
image: redis:7-alpine
networks:
- mastodon_network
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
retries: 5
es:
restart: always
image: docker.elastic.co/elasticsearch:8.10.2
environment:
- "discovery.type=single-node"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- "xpack.security.enabled=false"
networks:
- mastodon_network
healthcheck:
test: ["CMD-SHELL", "curl -silent http://localhost:9200/_cluster/health || exit 1"]
interval: 10s
retries: 10
web:
restart: always
image: tootsuite/mastodon:latest
env_file: .env.mastodon
command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000"
ports:
- "$MASTODON_PORT:3000"
depends_on:
- db
- redis
- es
networks:
- mastodon_network
volumes:
- ./mastodon-data/public:/mastodon/public/system
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:3000/health || exit 1"]
interval: 10s
retries: 5
streaming:
restart: always
image: tootsuite/mastodon:latest
env_file: .env.mastodon
command: node ./streaming
ports:
- "4000:4000"
depends_on:
- db
- redis
networks:
- mastodon_network
healthcheck:
test: ["CMD-SHELL", "fuser -s 4000/tcp || exit 1"]
interval: 10s
retries: 5
sidekiq:
restart: always
image: tootsuite/mastodon:latest
env_file: .env.mastodon
command: bundle exec sidekiq
depends_on:
- db
- redis
networks:
- mastodon_network
healthcheck:
test: ["CMD-SHELL", "ps aux | grep '[s]idekiq' || exit 1"]
interval: 10s
retries: 5
networks:
mastodon_network:
driver: bridge
EOF
echo -e "${GREEN}✓ Created docker-compose.mastodon-test.yml${NC}"
echo ""
echo -e "${YELLOW}5. Starting Mastodon...${NC}"
docker compose -f docker-compose.mastodon-test.yml up -d
echo -e "${GREEN}✓ Mastodon containers started${NC}"
echo ""
echo "Waiting for Mastodon to be ready (this may take 2-5 minutes)..."
# Wait for web service to be healthy
MAX_WAIT=300
WAIT_TIME=0
while [ $WAIT_TIME -lt $MAX_WAIT ]; do
if docker compose -f docker-compose.mastodon-test.yml ps web | grep -q "healthy"; then
echo -e "${GREEN}✓ Mastodon is ready!${NC}"
break
fi
echo -n "."
sleep 5
WAIT_TIME=$((WAIT_TIME + 5))
done
echo ""
if [ $WAIT_TIME -ge $MAX_WAIT ]; then
echo -e "${RED}✗ Mastodon failed to start within expected time${NC}"
echo "Check logs with: docker compose -f docker-compose.mastodon-test.yml logs"
fi
echo ""
echo -e "${YELLOW}6. Creating Mastodon admin account...${NC}"
docker compose -f docker-compose.mastodon-test.yml exec web \
bin/tootctl accounts create \
testuser \
testuser@$MASTODON_DOMAIN \
--email=test@example.com \
--confirmed \
--role=admin \
--approve || true
echo -e "${GREEN}✓ Created test user: testuser@$MASTODON_DOMAIN${NC}"
echo " Password: TestPassword123!"
echo ""
echo -e "${YELLOW}7. Applying Solar Network migrations...${NC}"
cd DysonNetwork.Sphere
dotnet ef database update
echo -e "${GREEN}✓ Migrations applied${NC}"
echo ""
echo ""
echo "======================================"
echo -e "${GREEN}Setup Complete!${NC}"
echo "======================================"
echo ""
echo "Test Instances:"
echo " Solar Network: http://$SOLAR_DOMAIN:$SOLAR_PORT"
echo " Mastodon: http://$MASTODON_DOMAIN:$MASTODON_PORT"
echo ""
echo "Test Accounts:"
echo " Solar Network: Create one in the UI or via API"
echo " Mastodon: testuser@$MASTODON_DOMAIN (Password: TestPassword123!)"
echo ""
echo "Next Steps:"
echo " 1. Start Solar Network: dotnet run --project DysonNetwork.Sphere"
echo " 2. Create a publisher in Solar Network"
echo " 3. Open Mastodon and search for @username@solar.local"
echo " 4. Test following and posting"
echo ""
echo "Testing Commands:"
echo " # Test WebFinger"
echo " curl \"http://$SOLAR_DOMAIN:$SOLAR_PORT/.well-known/webfinger?resource=acct:username@$SOLAR_DOMAIN\""
echo ""
echo " # Test Actor"
echo " curl -H \"Accept: application/activity+json\" \\"
echo " http://$SOLAR_DOMAIN:$SOLAR_PORT/activitypub/actors/username"
echo ""
echo " # Test Outbox"
echo " curl -H \"Accept: application/activity+json\" \\"
echo " http://$SOLAR_DOMAIN:$SOLAR_PORT/activitypub/actors/username/outbox"
echo ""
echo " # View logs"
echo " docker compose -f docker-compose.mastodon-test.yml logs -f"
echo ""
echo " # Stop Mastodon"
echo " docker compose -f docker-compose.mastodon-test.yml down"
echo ""
echo "For detailed testing guide, see: ACTIVITYPUB_TESTING_GUIDE.md"
echo "For quick reference, see: ACTIVITYPUB_TESTING_QUICKREF.md"
echo ""