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
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"