WIP! A BB-style forum, on the ATmosphere! We're still working... we'll be back soon when we have something to show off!
node typescript hono htmx atproto
at main 238 lines 8.0 kB view raw
1#!/usr/bin/env bash 2# set -euo pipefail 3 4# ATB-15 Manual Testing Helper Script 5# Tests membership auto-creation during OAuth login 6 7SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 8PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" 9 10# Colors for output 11RED='\033[0;31m' 12GREEN='\033[0;32m' 13YELLOW='\033[1;33m' 14BLUE='\033[0;34m' 15NC='\033[0m' # No Color 16 17print_header() { 18 echo -e "\n${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" 19 echo -e "${BLUE}$1${NC}" 20 echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n" 21} 22 23print_success() { 24 echo -e "${GREEN}${NC} $1" 25} 26 27print_error() { 28 echo -e "${RED}${NC} $1" 29} 30 31print_info() { 32 echo -e "${YELLOW}${NC} $1" 33} 34 35print_step() { 36 echo -e "\n${YELLOW}Step $1:${NC} $2" 37} 38 39# Check if .env exists 40if [ ! -f "$PROJECT_ROOT/.env" ]; then 41 print_error ".env file not found. Please copy .env.example to .env and configure." 42 exit 1 43fi 44 45# Load environment variables 46set -a 47source "$PROJECT_ROOT/.env" 48set +a 49 50# Verify required variables 51REQUIRED_VARS=("DATABASE_URL" "FORUM_DID" "PDS_URL" "OAUTH_PUBLIC_URL") 52for var in "${REQUIRED_VARS[@]}"; do 53 if [ -z "${!var:-}" ]; then 54 print_error "Required environment variable $var is not set in .env" 55 exit 1 56 fi 57done 58 59print_header "ATB-15 Manual Testing: Membership Auto-Creation" 60 61echo "This script helps test that:" 62echo " 1. First-time login creates a membership record" 63echo " 2. Repeated login doesn't create duplicates" 64echo " 3. Login succeeds even if membership creation fails" 65echo "" 66echo "Prerequisites:" 67echo " • Dev servers running (pnpm dev)" 68echo " • Database migrations applied" 69echo " • Test user account on PDS" 70echo "" 71 72read -p "Continue with testing? [y/N] " -n 1 -r 73echo 74if [[ ! $REPLY =~ ^[Yy]$ ]]; then 75 echo "Exiting." 76 exit 0 77fi 78 79# Get test user DID 80print_step "1" "Enter test user information" 81read -p "Enter test user DID (e.g., did:plc:abc123): " TEST_DID 82read -p "Enter test user handle (e.g., test.bsky.social): " TEST_HANDLE 83 84if [ -z "$TEST_DID" ] || [ -z "$TEST_HANDLE" ]; then 85 print_error "DID and handle are required" 86 exit 1 87fi 88 89# Ensure forum record exists in database 90print_step "2" "Ensuring forum record exists" 91FORUM_URI="at://${FORUM_DID}/space.atbb.forum.forum/self" 92 93FORUM_COUNT=$(psql "$DATABASE_URL" -t -c \ 94 "SELECT COUNT(*) FROM forums WHERE did = '$FORUM_DID' AND rkey = 'self';" \ 95 2>/dev/null | tr -d ' ') 96 97if [ "$FORUM_COUNT" -eq 0 ]; then 98 print_info "No forum record found. Creating one for testing..." 99 psql "$DATABASE_URL" -c \ 100 "INSERT INTO forums (did, rkey, cid, name, description, indexed_at) 101 VALUES ('$FORUM_DID', 'self', 'bafytest123', 'Test Forum', 'Test forum for membership creation', NOW());" \ 102 2>/dev/null 103 print_success "Created forum record in database" 104else 105 print_success "Forum record already exists" 106fi 107 108# Check if membership already exists in database 109print_step "3" "Checking database for existing membership" 110 111MEMBERSHIP_COUNT=$(psql "$DATABASE_URL" -t -c \ 112 "SELECT COUNT(*) FROM memberships WHERE did = '$TEST_DID' AND forum_uri = '$FORUM_URI';" \ 113 2>/dev/null | tr -d ' ') 114 115if [ "$MEMBERSHIP_COUNT" -gt 0 ]; then 116 print_info "Found $MEMBERSHIP_COUNT existing membership(s) in database" 117 read -p "Delete existing membership to test first-time login? [y/N] " -n 1 -r 118 echo 119 if [[ $REPLY =~ ^[Yy]$ ]]; then 120 psql "$DATABASE_URL" -c \ 121 "DELETE FROM memberships WHERE did = '$TEST_DID' AND forum_uri = '$FORUM_URI';" 122 print_success "Deleted existing membership from database" 123 fi 124else 125 print_success "No existing membership in database (ready for first-time login test)" 126fi 127 128# Instructions for OAuth flow 129print_step "4" "OAuth Login Flow" 130echo "" 131 132# Construct OAuth login URL 133LOGIN_URL="${OAUTH_PUBLIC_URL}/api/auth/login?handle=${TEST_HANDLE}" 134 135echo "Open this URL in your browser to start OAuth login:" 136echo "" 137echo -e "${GREEN}${LOGIN_URL}${NC}" 138echo "" 139echo "What will happen:" 140echo " 1. Browser redirects to your PDS (${PDS_URL})" 141echo " 2. You approve the forum's access request" 142echo " 3. PDS redirects back to ${OAUTH_PUBLIC_URL}/api/auth/callback" 143echo " 4. Forum creates session and membership record" 144echo " 5. Browser redirects to homepage" 145echo "" 146print_info "Tip: Copy the URL above or use 'open \"$LOGIN_URL\"' on macOS" 147echo "" 148read -p "Press Enter after completing OAuth login..." 149 150# Check server logs for membership creation 151print_step "5" "Checking server logs" 152print_info "Check your dev server console for these log events..." 153 154echo "" 155echo "Expected log events (JSON formatted):" 156echo " • oauth.login.initiated - OAuth flow started" 157echo " • oauth.callback.success - User authenticated successfully" 158echo " • oauth.callback.membership.created - New membership record created (first login)" 159echo " • oauth.callback.membership.exists - Membership already exists (repeated login)" 160echo " • oauth.callback.membership.failed - Membership creation failed (error case)" 161echo "" 162print_info "The membership creation happens during the callback, so look for the membership event" 163 164# Query database for indexed membership 165print_step "6" "Checking database for indexed membership" 166sleep 2 # Give firehose a moment to index 167 168MEMBERSHIP_DATA=$(psql "$DATABASE_URL" -c \ 169 "SELECT did, rkey, forum_uri, joined_at, created_at, indexed_at 170 FROM memberships 171 WHERE did = '$TEST_DID' AND forum_uri = '$FORUM_URI';" \ 172 2>/dev/null) 173 174if echo "$MEMBERSHIP_DATA" | grep -q "$TEST_DID"; then 175 print_success "Membership found in database" 176 echo "$MEMBERSHIP_DATA" 177else 178 print_error "Membership not found in database yet" 179 print_info "Firehose may still be indexing. Wait 10-30 seconds and check again:" 180 echo " psql \"\$DATABASE_URL\" -c \"SELECT * FROM memberships WHERE did = '$TEST_DID';\"" 181fi 182 183# Test repeated login 184print_step "7" "Test repeated login (no duplicate)" 185echo "" 186 187# Construct logout and login URLs 188LOGOUT_URL="${OAUTH_PUBLIC_URL}/api/auth/logout" 189 190echo "First, logout to clear the current session:" 191echo "" 192echo -e "${GREEN}${LOGOUT_URL}${NC}" 193echo "" 194print_info "Tip: Open the URL or use 'open \"$LOGOUT_URL\"' on macOS" 195echo "" 196read -p "Press Enter after logging out..." 197echo "" 198echo "Now login again with the same account:" 199echo "" 200echo -e "${GREEN}${LOGIN_URL}${NC}" 201echo "" 202echo "Expected behavior:" 203echo " • Login should succeed normally" 204echo " • Server logs should show \"Membership already exists\" (not \"created\")" 205echo " • No duplicate membership record in database" 206echo "" 207read -p "Press Enter after completing repeated login..." 208 209# Verify no duplicate in database 210FINAL_COUNT=$(psql "$DATABASE_URL" -t -c \ 211 "SELECT COUNT(*) FROM memberships WHERE did = '$TEST_DID' AND forum_uri = '$FORUM_URI';" \ 212 2>/dev/null | tr -d ' ') 213 214if [ "$FINAL_COUNT" -eq 1 ]; then 215 print_success "Verified: Exactly 1 membership record (no duplicate created)" 216elif [ "$FINAL_COUNT" -gt 1 ]; then 217 print_error "FAIL: Found $FINAL_COUNT memberships (duplicates created!)" 218 psql "$DATABASE_URL" -c \ 219 "SELECT * FROM memberships WHERE did = '$TEST_DID' AND forum_uri = '$FORUM_URI';" 220 exit 1 221else 222 print_error "FAIL: No membership found in database" 223 exit 1 224fi 225 226# Summary 227print_header "Test Summary" 228print_success "Membership auto-creation appears to be working correctly" 229echo "" 230echo "Verified:" 231echo " ✓ Membership record created on first login" 232echo " ✓ No duplicate created on repeated login" 233echo " ✓ Login flow completed successfully" 234echo "" 235echo "Next steps:" 236echo " • Review server logs for proper log messages" 237echo " • Test error scenarios (PDS unreachable, database failure)" 238echo " • Create pull request for ATB-15"