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 root/atb-54-add-lightdark-mode-toggle 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"