Restore to commit 74e578279624c6045ca440a3459ebfa1f8d54191

This commit is contained in:
southseact-3d
2026-02-07 20:32:41 +00:00
commit ed67b7741b
252 changed files with 99814 additions and 0 deletions

266
DODO_TESTING_CHECKLIST.md Normal file
View File

@@ -0,0 +1,266 @@
# Dodo Payments Testing Checklist
## Pre-Testing Setup
- [ ] Ensure `DODO_PAYMENTS_API_KEY` is set correctly (test mode for testing)
- [ ] Verify all subscription product IDs are configured in environment variables
- [ ] Confirm webhook endpoint is accessible and configured in Dodo dashboard
- [ ] Have test payment methods available in Dodo test mode
## Scenario 1: Upgrade Between Paid Plans
### Test: Starter → Professional
1. [ ] User starts with active Starter subscription
2. [ ] Navigate to Settings page
3. [ ] Change plan dropdown to "Professional"
4. [ ] Click "Save Changes"
5. [ ] Verify confirmation modal shows upgrade message with immediate charge explanation
6. [ ] Click "Confirm"
7. [ ] **Expected**:
- Status shows "Changing subscription plan..."
- API calls `POST /api/account` with new plan
- Server calls Dodo `POST /subscriptions/{id}/change-plan`
- User is charged the price difference
- Plan updates immediately to Professional
- Success message: "Subscription plan changed successfully!"
- Page shows updated plan without reload
### Test: Starter → Enterprise
1. [ ] Follow same steps as above but select "Enterprise"
2. [ ] Verify larger price difference is charged
3. [ ] Verify plan updates correctly
## Scenario 2: Downgrade Between Paid Plans
### Test: Professional → Starter
1. [ ] User starts with active Professional subscription
2. [ ] Navigate to Settings page
3. [ ] Change plan dropdown to "Starter"
4. [ ] Click "Save Changes"
5. [ ] Verify confirmation modal shows downgrade message with credit explanation
6. [ ] Click "Confirm"
7. [ ] **Expected**:
- Status shows "Changing subscription plan..."
- API calls Change Plan API with `difference_immediately` proration
- Credit applied to subscription for future renewals
- Plan updates immediately to Starter
- Success message shown
- Subscription continues without interruption
### Test: Enterprise → Professional
1. [ ] Follow same steps as above
2. [ ] Verify larger credit is applied
## Scenario 3: Downgrade to Free Plan
### Test: Any Paid Plan → Hobby
1. [ ] User starts with active paid subscription (Starter/Professional/Enterprise)
2. [ ] Navigate to Settings page
3. [ ] Change plan dropdown to "Hobby (free)"
4. [ ] Click "Save Changes"
5. [ ] Verify confirmation modal warns about feature loss
6. [ ] Click "Confirm"
7. [ ] **Expected**:
- Status shows "Cancelling subscription..."
- API calls `POST /api/account` with plan: hobby
- Server calls `cancelDodoSubscription()`
- Dodo subscription is cancelled (DELETE or PATCH with cancel_at_next_billing_date)
- User plan set to "hobby"
- Billing status set to "active" (for free plan)
- subscriptionRenewsAt, billingCycle, subscriptionCurrency cleared
- Success message: "Downgraded to free plan successfully"
### Verify in Dodo Dashboard
- [ ] Subscription shows as "cancelled" or "cancel_at_next_billing_date" set to true
- [ ] No future charges scheduled
## Scenario 4: Upgrade from Free to Paid
### Test: Hobby → Starter
1. [ ] User starts with free Hobby plan
2. [ ] Navigate to Settings page
3. [ ] Change plan dropdown to "Starter"
4. [ ] Click "Save Changes"
5. [ ] Verify confirmation modal indicates checkout required
6. [ ] Click "Confirm"
7. [ ] **Expected**:
- Status shows "Starting checkout..."
- API calls `POST /api/subscription/checkout`
- Inline checkout modal opens
- User completes payment in Dodo checkout
- After payment, redirected back to app
- Plan updates to Starter
## Scenario 5: Cancel Subscription Button
### Test: Cancel Active Subscription
1. [ ] User has active paid subscription
2. [ ] Navigate to Settings page
3. [ ] Click "Cancel Subscription" button
4. [ ] Verify confirmation modal warns about cancellation
5. [ ] Click "Confirm"
6. [ ] **Expected**:
- Status shows "Updating subscription..."
- API calls `POST /api/subscription/cancel`
- Server calls `cancelDodoSubscription()` with reason: 'subscription_cancel'
- Dodo subscription cancelled
- billingStatus set to "cancelled"
- Success message: "Subscription cancelled. Access will continue until end of billing period."
- Cancel button changes to "Resume" or subscription status shows cancelled
### Verify Access Continuation
- [ ] User retains access until current period ends
- [ ] No automatic charges after current period
## Scenario 6: Billing Cycle Change
### Test: Monthly → Yearly (Same Plan)
1. [ ] User has monthly Professional subscription
2. [ ] Navigate to Settings page
3. [ ] Change billing cycle to "Yearly"
4. [ ] Keep plan as "Professional"
5. [ ] Click "Save Changes"
6. [ ] **Expected**:
- This should likely redirect to checkout for the new billing cycle
- OR handle as a plan change (depending on implementation)
- Verify correct behavior based on business logic
## Scenario 7: Webhook Events
### After Upgrade (Starter → Professional)
- [ ] `subscription.plan_changed` webhook received
- [ ] Webhook handler updates user.plan in database
- [ ] Email sent to user confirming plan change
### After Downgrade (Professional → Starter)
- [ ] `subscription.plan_changed` webhook received
- [ ] User plan updated
- [ ] Email notification sent
### After Cancellation
- [ ] `subscription.canceled` webhook received
- [ ] User billing status updated
- [ ] Cancellation email sent
### If Payment Fails on Upgrade
- [ ] `subscription.on_hold` webhook received
- [ ] User notified to update payment method
- [ ] Plan change doesn't complete until payment succeeds
## Error Scenarios
### Test: Invalid Plan Change
1. [ ] User tries to change to invalid plan
2. [ ] **Expected**: Error message shown, no changes made
### Test: Network Failure During Plan Change
1. [ ] Simulate network error
2. [ ] **Expected**: Error message, user can retry
### Test: Insufficient Payment on Upgrade
1. [ ] Use test card with insufficient funds
2. [ ] **Expected**:
- Payment fails
- `subscription.on_hold` webhook
- User notified
- Plan doesn't change until payment succeeds
### Test: Change Plan Without Active Subscription
1. [ ] User on free plan tries paid-to-paid change
2. [ ] **Expected**: Error requiring checkout flow
## Database Verification
After each test, verify in database:
- [ ] `user.plan` updated correctly
- [ ] `user.billingCycle` matches subscription
- [ ] `user.subscriptionCurrency` correct
- [ ] `user.dodoSubscriptionId` maintained (or cleared for free)
- [ ] `user.billingStatus` appropriate ("active" or "cancelled")
- [ ] `user.subscriptionRenewsAt` updated (or null for free)
## Dodo Dashboard Verification
For each plan change:
- [ ] Subscription status updated in Dodo dashboard
- [ ] Correct product_id shown
- [ ] Next billing date accurate
- [ ] Payment method attached
- [ ] Cancellation status correct if applicable
## Logs Verification
Check server logs for:
- [ ] "Dodo subscription plan changed" with correct details
- [ ] "Dodo subscription cancelled" when cancelling
- [ ] No error messages in logs
- [ ] Proper userId, subscriptionId, and plan information logged
## User Experience
- [ ] All confirmation modals display appropriate messages
- [ ] Status messages are clear and accurate
- [ ] No UI glitches or broken states
- [ ] Loading states shown during API calls
- [ ] Success/error states properly displayed
- [ ] Page doesn't require manual refresh to show changes
## Edge Cases
- [ ] **Rapid Plan Changes**: User changes plan multiple times quickly
- [ ] **Concurrent Updates**: Two tabs open, changes made in both
- [ ] **Expired Session**: Session expires during plan change
- [ ] **Already Changed**: User tries to change to current plan
- [ ] **Pending Payment**: Change plan while previous payment pending
## Performance
- [ ] Plan change completes within 3 seconds
- [ ] No unnecessary API calls
- [ ] Proper error handling doesn't cause delays
- [ ] Webhook processing is fast
## Security
- [ ] CSRF token validated on all plan change requests
- [ ] User can only change their own plan
- [ ] Admin privileges not required for own plan changes
- [ ] Webhook signatures verified
- [ ] No sensitive data exposed in responses
## Documentation
- [ ] DODO_PLAN_CHANGE_FIX.md accurately describes implementation
- [ ] Code comments explain complex logic
- [ ] Error messages are helpful
- [ ] Logging provides adequate debugging information
## Post-Testing
- [ ] All test scenarios passed
- [ ] No errors in production logs
- [ ] Dodo dashboard shows correct subscription states
- [ ] Users receive appropriate email notifications
- [ ] Credits from downgrades apply correctly to future renewals
- [ ] Monitor for any user reports of issues
## Rollback Plan
If issues are discovered:
1. [ ] Revert server.js changes
2. [ ] Revert settings.html changes
3. [ ] Notify users of temporary checkout requirement for plan changes
4. [ ] Fix issues in development
5. [ ] Re-test thoroughly
6. [ ] Re-deploy
## Success Criteria
✅ All upgrade scenarios work correctly with immediate charging
✅ All downgrade scenarios apply credits properly
✅ Free plan downgrades cancel subscriptions at Dodo
✅ Webhook events update user plans automatically
✅ No service interruption during plan changes
✅ Clear user messaging throughout all flows
✅ Proper error handling and recovery
✅ Dodo dashboard reflects all changes accurately