Prmbr/scripts/test-pro-plan-detection.ts
2025-08-05 22:43:18 +08:00

114 lines
3.9 KiB
TypeScript

import { PrismaClient } from '@prisma/client'
import { SubscriptionService } from '../src/lib/subscription-service'
const prisma = new PrismaClient()
async function testProPlanDetection() {
console.log('🧪 Testing Pro plan detection and price ID retrieval...')
try {
// 1. 测试获取 Pro 套餐
console.log('\n1. Testing Pro plan retrieval...')
const proPlan = await SubscriptionService.getProPlan()
if (proPlan) {
console.log(`✅ Pro plan found:`)
console.log(` - ID: ${proPlan.id}`)
console.log(` - Name: ${proPlan.name}`)
console.log(` - Display Name: ${proPlan.displayName}`)
console.log(` - Price: $${proPlan.price}`)
console.log(` - Stripe Price ID: ${proPlan.stripePriceId || 'Not set'}`)
console.log(` - Active: ${proPlan.isActive}`)
} else {
console.log('❌ Pro plan not found')
}
// 2. 测试获取 Pro 价格 ID
console.log('\n2. Testing Pro price ID retrieval...')
const proPriceId = await SubscriptionService.getProPriceId()
if (proPriceId) {
console.log(`✅ Pro price ID found: ${proPriceId}`)
} else {
console.log('⚠️ Pro price ID not set (this is expected for new installations)')
}
// 3. 测试 Pro 判定逻辑
console.log('\n3. Testing Pro plan detection logic...')
if (proPlan) {
const isPro = SubscriptionService.isPlanPro(proPlan)
console.log(`✅ Pro plan detection: ${isPro} (expected: true for price > $19)`)
}
// 4. 验证数据库中的套餐配置
console.log('\n4. Validating database plan configuration...')
const allPlans = await SubscriptionService.getAvailablePlans()
console.log(`📊 Found ${allPlans.length} active plans:`)
allPlans.forEach(plan => {
const isPro = SubscriptionService.isPlanPro(plan)
console.log(` - ${plan.displayName} (${plan.name}): $${plan.price} - ${isPro ? 'Pro' : 'Free'} tier`)
})
// 5. 检查是否有名称为 "pro" 的套餐
console.log('\n5. Checking for plans with name "pro"...')
const proNamedPlans = allPlans.filter(plan => plan.name === 'pro')
if (proNamedPlans.length === 0) {
console.log('❌ No plans found with name "pro"')
console.log(' This will cause subscription creation to fail!')
} else if (proNamedPlans.length === 1) {
console.log(`✅ Found exactly one plan with name "pro": ${proNamedPlans[0].displayName}`)
} else {
console.log(`⚠️ Found ${proNamedPlans.length} plans with name "pro" - this may cause conflicts`)
proNamedPlans.forEach((plan, index) => {
console.log(` ${index + 1}. ${plan.displayName} (ID: ${plan.id})`)
})
}
// 6. 模拟 API 调用测试
console.log('\n6. Testing API endpoint simulation...')
try {
const testPriceId = await SubscriptionService.getProPriceId()
if (testPriceId) {
console.log(`✅ API would return price ID: ${testPriceId}`)
} else {
console.log('⚠️ API would return 404 - Pro plan not configured')
}
} catch (error) {
console.log(`❌ API would return 500 - Error: ${error}`)
}
console.log('\n🎉 Pro plan detection test completed!')
// 7. 提供配置建议
if (!proPriceId && proPlan) {
console.log('\n💡 Configuration needed:')
console.log(' To enable Pro subscriptions, set the stripePriceId for the Pro plan:')
console.log(` UPDATE subscription_plans SET "stripePriceId" = 'price_your_stripe_price_id' WHERE name = 'pro';`)
}
} catch (error) {
console.error('❌ Test failed:', error)
throw error
} finally {
await prisma.$disconnect()
}
}
// 运行测试
if (require.main === module) {
testProPlanDetection()
.then(() => {
console.log('✅ All tests completed!')
process.exit(0)
})
.catch((error) => {
console.error('❌ Tests failed:', error)
process.exit(1)
})
}
export { testProPlanDetection }