139 lines
4.6 KiB
TypeScript
139 lines
4.6 KiB
TypeScript
import { PrismaClient } from '@prisma/client'
|
|
import { SubscriptionService } from '../src/lib/subscription-service'
|
|
import { isPlanPro, isPlanFree, getPlanTier } from '../src/lib/subscription-utils'
|
|
|
|
const prisma = new PrismaClient()
|
|
|
|
async function testSubscriptionSystem() {
|
|
console.log('🧪 Testing subscription system...')
|
|
|
|
try {
|
|
// 1. 测试获取套餐
|
|
console.log('\n1. Testing plan retrieval...')
|
|
const plans = await SubscriptionService.getAvailablePlans()
|
|
console.log(`✅ Found ${plans.length} plans:`)
|
|
plans.forEach(plan => {
|
|
const limits = plan.limits as any
|
|
const isPro = isPlanPro(plan)
|
|
const tier = getPlanTier(plan)
|
|
console.log(` - ${plan.displayName}: ${limits.promptLimit} prompts, ${limits.maxVersionLimit} versions (${tier}, isPro: ${isPro})`)
|
|
})
|
|
|
|
// 2. 测试获取特定套餐
|
|
console.log('\n2. Testing specific plan retrieval...')
|
|
const freePlan = await SubscriptionService.getPlanById('free')
|
|
const proPlan = await SubscriptionService.getPlanById('pro')
|
|
|
|
if (freePlan) {
|
|
console.log(`✅ Free plan found: ${freePlan.displayName}`)
|
|
} else {
|
|
console.log('❌ Free plan not found')
|
|
}
|
|
|
|
if (proPlan) {
|
|
console.log(`✅ Pro plan found: ${proPlan.displayName}`)
|
|
} else {
|
|
console.log('❌ Pro plan not found')
|
|
}
|
|
|
|
// 3. 测试用户权限(需要一个测试用户)
|
|
console.log('\n3. Testing user permissions...')
|
|
|
|
// 查找第一个用户进行测试
|
|
const testUser = await prisma.user.findFirst({
|
|
select: { id: true, email: true, subscriptionPlanId: true }
|
|
})
|
|
|
|
if (testUser) {
|
|
console.log(`📝 Testing with user: ${testUser.email} (plan: ${testUser.subscriptionPlanId})`)
|
|
|
|
try {
|
|
const permissions = await SubscriptionService.getUserPermissions(testUser.id)
|
|
console.log(`✅ User permissions:`)
|
|
console.log(` - Prompt limit: ${permissions.promptLimit}`)
|
|
console.log(` - Max version limit: ${permissions.maxVersionLimit}`)
|
|
console.log(` - Can create prompt: ${permissions.canCreatePrompt}`)
|
|
console.log(` - Features: ${permissions.features.join(', ')}`)
|
|
|
|
// 测试订阅状态
|
|
const subscriptionStatus = await SubscriptionService.getUserSubscriptionStatus(testUser.id)
|
|
console.log(`✅ Subscription status:`)
|
|
console.log(` - Active: ${subscriptionStatus.isActive}`)
|
|
console.log(` - Plan ID: ${subscriptionStatus.planId}`)
|
|
if (subscriptionStatus.stripeSubscriptionId) {
|
|
console.log(` - Stripe subscription: ${subscriptionStatus.stripeSubscriptionId}`)
|
|
}
|
|
|
|
} catch (error) {
|
|
console.log(`❌ Error getting user permissions: ${error}`)
|
|
}
|
|
} else {
|
|
console.log('⚠️ No users found for testing')
|
|
}
|
|
|
|
// 4. 验证数据完整性
|
|
console.log('\n4. Validating data integrity...')
|
|
|
|
const userCount = await prisma.user.count()
|
|
const usersWithPlans = await prisma.user.count({
|
|
where: {
|
|
subscriptionPlanId: {
|
|
not: ''
|
|
}
|
|
}
|
|
})
|
|
|
|
console.log(`📊 Data integrity:`)
|
|
console.log(` - Total users: ${userCount}`)
|
|
console.log(` - Users with valid plans: ${usersWithPlans}`)
|
|
|
|
if (userCount === usersWithPlans) {
|
|
console.log(`✅ All users have valid subscription plans`)
|
|
} else {
|
|
console.log(`⚠️ ${userCount - usersWithPlans} users don't have valid subscription plans`)
|
|
}
|
|
|
|
// 5. 测试 Pro 判定逻辑
|
|
console.log('\n5. Testing Pro plan detection logic...')
|
|
|
|
// 测试不同价格的套餐判定
|
|
const testPlans = [
|
|
{ price: 0, name: 'Free' },
|
|
{ price: 9.99, name: 'Basic' },
|
|
{ price: 19.99, name: 'Pro' },
|
|
{ price: 29.99, name: 'Premium' },
|
|
{ price: 99.99, name: 'Enterprise' }
|
|
]
|
|
|
|
testPlans.forEach(testPlan => {
|
|
const isPro = isPlanPro(testPlan)
|
|
const isFree = isPlanFree(testPlan)
|
|
const tier = getPlanTier(testPlan)
|
|
console.log(` - ${testPlan.name} ($${testPlan.price}): isPro=${isPro}, isFree=${isFree}, tier=${tier}`)
|
|
})
|
|
|
|
console.log('\n🎉 Subscription system test completed successfully!')
|
|
|
|
} catch (error) {
|
|
console.error('❌ Test failed:', error)
|
|
throw error
|
|
} finally {
|
|
await prisma.$disconnect()
|
|
}
|
|
}
|
|
|
|
// 运行测试
|
|
if (require.main === module) {
|
|
testSubscriptionSystem()
|
|
.then(() => {
|
|
console.log('✅ All tests passed!')
|
|
process.exit(0)
|
|
})
|
|
.catch((error) => {
|
|
console.error('❌ Tests failed:', error)
|
|
process.exit(1)
|
|
})
|
|
}
|
|
|
|
export { testSubscriptionSystem }
|