Add comprehensive OTP testing guide
- Step-by-step frontend testing instructions - Console log examples for each step - Network tab debugging guide - Database verification queries - Common issues and solutions - Environment variables checklist
This commit is contained in:
341
otp-testing-guide.md
Normal file
341
otp-testing-guide.md
Normal file
@@ -0,0 +1,341 @@
|
|||||||
|
# OTP Email Verification Testing Guide
|
||||||
|
|
||||||
|
## Current Status
|
||||||
|
✅ **Backend Working**: Edge functions tested with curl and working
|
||||||
|
✅ **Database Setup**: Migrations applied, tables created
|
||||||
|
⚠️ **Frontend Integration**: Need to test and debug
|
||||||
|
|
||||||
|
## What Should Happen
|
||||||
|
|
||||||
|
### Registration Flow
|
||||||
|
1. User fills registration form (name, email, password)
|
||||||
|
2. Clicks "Daftar" (Register) button
|
||||||
|
3. Supabase Auth creates user account
|
||||||
|
4. Frontend calls `send-auth-otp` edge function
|
||||||
|
5. Edge function:
|
||||||
|
- Generates 6-digit OTP
|
||||||
|
- Stores in `auth_otps` table (15 min expiry)
|
||||||
|
- Fetches email template from `notification_templates`
|
||||||
|
- Sends email via Mailketing API
|
||||||
|
6. Frontend shows OTP input form
|
||||||
|
7. User receives email with 6-digit code
|
||||||
|
8. User enters OTP code
|
||||||
|
9. Frontend calls `verify-auth-otp` edge function
|
||||||
|
10. Edge function:
|
||||||
|
- Validates OTP (not expired, not used)
|
||||||
|
- Marks OTP as used
|
||||||
|
- Confirms email in Supabase Auth
|
||||||
|
11. User can now login
|
||||||
|
|
||||||
|
## Testing Checklist
|
||||||
|
|
||||||
|
### 1. Backend Verification (Already Done ✅)
|
||||||
|
|
||||||
|
Test edge function with curl:
|
||||||
|
```bash
|
||||||
|
curl -X POST https://lovable.backoffice.biz.id/functions/v1/send-auth-otp \
|
||||||
|
-H "Authorization: Bearer YOUR_SERVICE_ROLE_KEY" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"user_id":"USER_UUID","email":"test@example.com"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected: `{"success":true,"message":"OTP sent successfully"}`
|
||||||
|
|
||||||
|
### 2. Frontend Testing (Do This Now)
|
||||||
|
|
||||||
|
#### Step 1: Open Browser DevTools
|
||||||
|
1. Open your browser
|
||||||
|
2. Press F12 (or Cmd+Option+I on Mac)
|
||||||
|
3. Go to **Console** tab
|
||||||
|
4. Go to **Network** tab
|
||||||
|
|
||||||
|
#### Step 2: Attempt Registration
|
||||||
|
1. Navigate to `/auth` page
|
||||||
|
2. Click "Belum punya akun? Daftar" (switch to registration)
|
||||||
|
3. Fill in:
|
||||||
|
- Nama: Test User
|
||||||
|
- Email: Your real email address
|
||||||
|
- Password: Any password (6+ characters)
|
||||||
|
4. Click "Daftar" button
|
||||||
|
|
||||||
|
#### Step 3: Check Console Logs
|
||||||
|
You should see these logs in order:
|
||||||
|
|
||||||
|
**Log 1:**
|
||||||
|
```
|
||||||
|
SignUp result: {
|
||||||
|
error: null,
|
||||||
|
data: { user: {...}, session: null },
|
||||||
|
hasUser: true,
|
||||||
|
hasSession: false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
If you see this → User creation succeeded ✅
|
||||||
|
|
||||||
|
**Log 2:**
|
||||||
|
```
|
||||||
|
User created successfully: {
|
||||||
|
userId: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
|
||||||
|
email: "your@email.com",
|
||||||
|
session: null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
If you see this → Proceeding to OTP sending ✅
|
||||||
|
|
||||||
|
**Log 3:**
|
||||||
|
```
|
||||||
|
Sending OTP request: {
|
||||||
|
userId: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
|
||||||
|
email: "your@email.com",
|
||||||
|
hasSession: false
|
||||||
|
}
|
||||||
|
```
|
||||||
|
If you see this → OTP function is being called ✅
|
||||||
|
|
||||||
|
**Log 4:**
|
||||||
|
```
|
||||||
|
OTP response status: 200
|
||||||
|
```
|
||||||
|
If you see this → Edge function responded successfully ✅
|
||||||
|
|
||||||
|
**Log 5:**
|
||||||
|
```
|
||||||
|
OTP send result: { success: true, message: "OTP sent successfully" }
|
||||||
|
```
|
||||||
|
If you see this → Everything worked! 🎉
|
||||||
|
|
||||||
|
#### Step 4: Check Network Tab
|
||||||
|
1. In DevTools Network tab
|
||||||
|
2. Look for request to `/functions/v1/send-auth-otp`
|
||||||
|
3. Click on it
|
||||||
|
4. Check:
|
||||||
|
- **Status**: Should be 200
|
||||||
|
- **Payload**: Should contain `{"user_id":"...", "email":"..."}`
|
||||||
|
- **Response**: Should be `{"success":true,"message":"OTP sent successfully"}`
|
||||||
|
|
||||||
|
### 3. Database Verification
|
||||||
|
|
||||||
|
After registration, check the database:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Check if OTP was created
|
||||||
|
SELECT * FROM auth_otps ORDER BY created_at DESC LIMIT 1;
|
||||||
|
|
||||||
|
-- Check if user was created
|
||||||
|
SELECT id, email, email_confirmed_at, created_at
|
||||||
|
FROM auth.users
|
||||||
|
WHERE email = 'your@email.com';
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
- `auth_otps` table has 1 new row with your email
|
||||||
|
- `auth.users` table has your user with `email_confirmed_at = NULL`
|
||||||
|
|
||||||
|
### 4. Email Verification
|
||||||
|
|
||||||
|
1. Check your email inbox (and spam folder)
|
||||||
|
2. Look for email with subject like "Kode Verifikasi Email Anda"
|
||||||
|
3. Open email and find 6-digit code (e.g., "123456")
|
||||||
|
4. Go back to browser
|
||||||
|
5. Enter the 6-digit code in OTP form
|
||||||
|
6. Click "Verifikasi" button
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
- Toast notification: "Verifikasi Berhasil - Email Anda telah terverifikasi"
|
||||||
|
- Form switches back to login mode
|
||||||
|
|
||||||
|
## Debugging Common Issues
|
||||||
|
|
||||||
|
### Issue 1: No Console Logs Appear
|
||||||
|
|
||||||
|
**Symptoms**: Submit form but nothing shows in console
|
||||||
|
|
||||||
|
**Possible Causes**:
|
||||||
|
1. Dev server not running → Run `npm run dev`
|
||||||
|
2. Code not reloaded → Refresh browser (Cmd+R / F5)
|
||||||
|
3. JavaScript error → Check Console for red error messages
|
||||||
|
|
||||||
|
**Solution**:
|
||||||
|
```bash
|
||||||
|
# Stop dev server (Cmd+C)
|
||||||
|
# Then restart
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Issue 2: Console Shows "SignUp result: hasUser: false"
|
||||||
|
|
||||||
|
**Symptoms**: User creation fails
|
||||||
|
|
||||||
|
**Possible Causes**:
|
||||||
|
1. Email already registered
|
||||||
|
2. Supabase Auth configuration issue
|
||||||
|
3. Network error
|
||||||
|
|
||||||
|
**Solution**:
|
||||||
|
```sql
|
||||||
|
-- Check if user exists
|
||||||
|
SELECT id, email FROM auth.users WHERE email = 'your@email.com';
|
||||||
|
|
||||||
|
-- If exists, delete and try again
|
||||||
|
DELETE FROM auth.users WHERE email = 'your@email.com';
|
||||||
|
```
|
||||||
|
|
||||||
|
### Issue 3: Log 3 Appears But No Log 4
|
||||||
|
|
||||||
|
**Symptoms**: OTP request sent but no response
|
||||||
|
|
||||||
|
**Possible Causes**:
|
||||||
|
1. CORS error
|
||||||
|
2. Edge function not deployed
|
||||||
|
3. Wrong Supabase URL in env variables
|
||||||
|
|
||||||
|
**Solution**:
|
||||||
|
```bash
|
||||||
|
# Check env variables
|
||||||
|
cat .env
|
||||||
|
# Should have VITE_SUPABASE_URL=https://lovable.backoffice.biz.id
|
||||||
|
```
|
||||||
|
|
||||||
|
Check Console for CORS errors (red text like "Access-Control-Allow-Origin")
|
||||||
|
|
||||||
|
### Issue 4: Log 4 Shows Status != 200
|
||||||
|
|
||||||
|
**Symptoms**: Edge function returns error
|
||||||
|
|
||||||
|
**Solution**: Check the error message in Log 4 or Console
|
||||||
|
|
||||||
|
Common errors:
|
||||||
|
- `401 Unauthorized`: Check authorization token
|
||||||
|
- `404 Not Found`: Edge function not deployed
|
||||||
|
- `500 Server Error`: Check edge function logs
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Check edge function logs
|
||||||
|
supabase functions logs send-auth-otp --tail
|
||||||
|
```
|
||||||
|
|
||||||
|
### Issue 5: OTP Created But No Email Received
|
||||||
|
|
||||||
|
**Symptoms**:
|
||||||
|
- `auth_otps` table has new row
|
||||||
|
- Network request shows 200 OK
|
||||||
|
- But no email in inbox
|
||||||
|
|
||||||
|
**Possible Causes**:
|
||||||
|
1. Mailketing API issue
|
||||||
|
2. Wrong API token
|
||||||
|
3. Email in spam folder
|
||||||
|
4. Template not active
|
||||||
|
|
||||||
|
**Solution**:
|
||||||
|
```sql
|
||||||
|
-- Check notification_logs table
|
||||||
|
SELECT * FROM notification_logs
|
||||||
|
ORDER BY created_at DESC
|
||||||
|
LIMIT 1;
|
||||||
|
|
||||||
|
-- Check if template is active
|
||||||
|
SELECT * FROM notification_templates
|
||||||
|
WHERE key = 'auth_email_verification';
|
||||||
|
```
|
||||||
|
|
||||||
|
If `status = 'failed'`, check `error_message` column.
|
||||||
|
|
||||||
|
### Issue 6: Email Received But Wrong Code
|
||||||
|
|
||||||
|
**Symptoms**: Enter code from email but verification fails
|
||||||
|
|
||||||
|
**Solution**:
|
||||||
|
```sql
|
||||||
|
-- Check OTP in database
|
||||||
|
SELECT otp_code, expires_at, used_at
|
||||||
|
FROM auth_otps
|
||||||
|
WHERE email = 'your@email.com'
|
||||||
|
ORDER BY created_at DESC
|
||||||
|
LIMIT 1;
|
||||||
|
```
|
||||||
|
|
||||||
|
Compare `otp_code` in database with code in email. They should match.
|
||||||
|
|
||||||
|
## Environment Variables Checklist
|
||||||
|
|
||||||
|
Make sure these are set in `.env`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
VITE_SUPABASE_URL=https://lovable.backoffice.biz.id
|
||||||
|
VITE_SUPABASE_ANON_KEY=your_anon_key_here
|
||||||
|
```
|
||||||
|
|
||||||
|
Check:
|
||||||
|
```bash
|
||||||
|
# View env vars (without showing secrets)
|
||||||
|
grep VITE_SUPABASE .env
|
||||||
|
```
|
||||||
|
|
||||||
|
## Edge Functions Deployment Status
|
||||||
|
|
||||||
|
Check if functions are deployed:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
supabase functions list
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected output:
|
||||||
|
```
|
||||||
|
send-auth-otp ...
|
||||||
|
verify-auth-otp ...
|
||||||
|
send-email-v2 ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Quick Test Script
|
||||||
|
|
||||||
|
Save this as `test-otp.sh`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
echo "📧 OTP Email Verification Test Script"
|
||||||
|
echo "======================================"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "1. Checking environment variables..."
|
||||||
|
if [ -z "$VITE_SUPABASE_URL" ]; then
|
||||||
|
echo "❌ VITE_SUPABASE_URL not set"
|
||||||
|
else
|
||||||
|
echo "✅ VITE_SUPABASE_URL=$VITE_SUPABASE_URL"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "2. Checking database connection..."
|
||||||
|
# Add your DB check here
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "3. Checking edge functions..."
|
||||||
|
supabase functions list
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "4. Next steps:"
|
||||||
|
echo " - Open browser to http://localhost:5173/auth"
|
||||||
|
echo " - Open DevTools (F12) → Console tab"
|
||||||
|
echo " - Try to register"
|
||||||
|
echo " - Check console logs"
|
||||||
|
echo " - Check email inbox"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Success Criteria
|
||||||
|
|
||||||
|
✅ All 5 console logs appear in order
|
||||||
|
✅ Network request shows 200 OK
|
||||||
|
✅ `auth_otps` table has new row
|
||||||
|
✅ Email received with 6-digit code
|
||||||
|
✅ OTP code verifies successfully
|
||||||
|
✅ User email confirmed in `auth.users`
|
||||||
|
|
||||||
|
## Need Help?
|
||||||
|
|
||||||
|
If you're still stuck, please provide:
|
||||||
|
1. Screenshot of Console tab (all logs)
|
||||||
|
2. Screenshot of Network tab (send-auth-otp request)
|
||||||
|
3. Output of: `SELECT * FROM auth_otps ORDER BY created_at DESC LIMIT 1;`
|
||||||
|
4. Output of: `SELECT * FROM notification_logs ORDER BY created_at DESC LIMIT 1;`
|
||||||
|
5. Any error messages shown in red in Console
|
||||||
Reference in New Issue
Block a user