package service import ( "testing" "git.lzcwy.cn/zhengchiliu/zt-closet-backend/internal/mysqlmodel" ) // memberGrantFixture 构造会员包来源(source=1)额度凭证。 func memberGrantFixture(id, amount, used int64) mysqlmodel.QuotaGrant { return mysqlmodel.QuotaGrant{ID: id, Source: QuotaGrantSourceMember, Amount: amount, Used: used} } // otherGrantFixture 构造非会员包来源(加量包/广告/体验)额度凭证。 func otherGrantFixture(id int64, source int8, amount, used int64) mysqlmodel.QuotaGrant { return mysqlmodel.QuotaGrant{ID: id, Source: source, Amount: amount, Used: used} } func TestPickEffectiveMemberGrant(t *testing.T) { for _, tc := range []struct { name string grants []mysqlmodel.QuotaGrant wantID int64 // 0 表示期望无生效份(nil) }{ { name: "月度年度同额只取一份且保留正在使用的份", grants: []mysqlmodel.QuotaGrant{memberGrantFixture(1, 100, 30), memberGrantFixture(2, 100, 0)}, wantID: 1, }, { name: "额度不同时取额度最大的一份", grants: []mysqlmodel.QuotaGrant{memberGrantFixture(1, 100, 0), memberGrantFixture(2, 200, 0)}, wantID: 2, }, { name: "旧包用尽后顺延到新购的一份", grants: []mysqlmodel.QuotaGrant{memberGrantFixture(1, 100, 100), memberGrantFixture(2, 100, 0)}, wantID: 2, }, { name: "同额同用量时优先新购", grants: []mysqlmodel.QuotaGrant{memberGrantFixture(1, 100, 0), memberGrantFixture(2, 100, 0)}, wantID: 2, }, { name: "无会员包凭证时返回 nil", grants: []mysqlmodel.QuotaGrant{otherGrantFixture(1, QuotaGrantSourceAddon, 1000, 0), otherGrantFixture(2, QuotaGrantSourceTrial, 100, 0)}, wantID: 0, }, { name: "会员包全部用尽时返回 nil", grants: []mysqlmodel.QuotaGrant{memberGrantFixture(1, 100, 100), memberGrantFixture(2, 50, 50)}, wantID: 0, }, } { t.Run(tc.name, func(t *testing.T) { got := pickEffectiveMemberGrant(tc.grants) if tc.wantID == 0 { if got != nil { t.Fatalf("want nil, got id=%d", got.ID) } return } if got == nil || got.ID != tc.wantID { t.Fatalf("want id=%d, got %+v", tc.wantID, got) } }) } } func TestPickMemberGrantForRefund(t *testing.T) { for _, tc := range []struct { name string grants []mysqlmodel.QuotaGrant handled map[int64]bool wantID int64 }{ { name: "优先回退当前生效份", grants: []mysqlmodel.QuotaGrant{memberGrantFixture(1, 100, 40), memberGrantFixture(2, 100, 10)}, wantID: 1, }, { name: "生效份未消耗时复活刚被扣尽的份", grants: []mysqlmodel.QuotaGrant{memberGrantFixture(1, 100, 100), memberGrantFixture(2, 100, 0)}, wantID: 1, }, { name: "已处理的份不重复回退", grants: []mysqlmodel.QuotaGrant{memberGrantFixture(1, 100, 40), memberGrantFixture(2, 100, 10)}, handled: map[int64]bool{1: true}, wantID: 2, }, { name: "无可退额度时返回 nil", grants: []mysqlmodel.QuotaGrant{memberGrantFixture(1, 100, 0)}, wantID: 0, }, } { t.Run(tc.name, func(t *testing.T) { got := pickMemberGrantForRefund(tc.grants, tc.handled) if tc.wantID == 0 { if got != nil { t.Fatalf("want nil, got id=%d", got.ID) } return } if got == nil || got.ID != tc.wantID { t.Fatalf("want id=%d, got %+v", tc.wantID, got) } }) } }