@@ -11,17 +11,19 @@ import (
1111 "github.com/stretchr/testify/require"
1212)
1313
14- // resetQuotaUserSubRepoStub 支持 GetByID、ResetDailyUsage、ResetWeeklyUsage,
14+ // resetQuotaUserSubRepoStub 支持 GetByID、ResetDailyUsage、ResetWeeklyUsage、ResetMonthlyUsage ,
1515// 其余方法继承 userSubRepoNoop(panic)。
1616type resetQuotaUserSubRepoStub struct {
1717 userSubRepoNoop
1818
1919 sub * UserSubscription
2020
21- resetDailyCalled bool
22- resetWeeklyCalled bool
23- resetDailyErr error
24- resetWeeklyErr error
21+ resetDailyCalled bool
22+ resetWeeklyCalled bool
23+ resetMonthlyCalled bool
24+ resetDailyErr error
25+ resetWeeklyErr error
26+ resetMonthlyErr error
2527}
2628
2729func (r * resetQuotaUserSubRepoStub ) GetByID (_ context.Context , id int64 ) (* UserSubscription , error ) {
@@ -46,6 +48,11 @@ func (r *resetQuotaUserSubRepoStub) ResetWeeklyUsage(_ context.Context, _ int64,
4648 return r .resetWeeklyErr
4749}
4850
51+ func (r * resetQuotaUserSubRepoStub ) ResetMonthlyUsage (_ context.Context , _ int64 , _ time.Time ) error {
52+ r .resetMonthlyCalled = true
53+ return r .resetMonthlyErr
54+ }
55+
4956func newResetQuotaSvc (stub * resetQuotaUserSubRepoStub ) * SubscriptionService {
5057 return NewSubscriptionService (groupRepoNoop {}, stub , nil , nil , nil )
5158}
@@ -56,12 +63,13 @@ func TestAdminResetQuota_ResetBoth(t *testing.T) {
5663 }
5764 svc := newResetQuotaSvc (stub )
5865
59- result , err := svc .AdminResetQuota (context .Background (), 1 , true , true )
66+ result , err := svc .AdminResetQuota (context .Background (), 1 , true , true , false )
6067
6168 require .NoError (t , err )
6269 require .NotNil (t , result )
6370 require .True (t , stub .resetDailyCalled , "应调用 ResetDailyUsage" )
6471 require .True (t , stub .resetWeeklyCalled , "应调用 ResetWeeklyUsage" )
72+ require .False (t , stub .resetMonthlyCalled , "不应调用 ResetMonthlyUsage" )
6573}
6674
6775func TestAdminResetQuota_ResetDailyOnly (t * testing.T ) {
@@ -70,12 +78,13 @@ func TestAdminResetQuota_ResetDailyOnly(t *testing.T) {
7078 }
7179 svc := newResetQuotaSvc (stub )
7280
73- result , err := svc .AdminResetQuota (context .Background (), 2 , true , false )
81+ result , err := svc .AdminResetQuota (context .Background (), 2 , true , false , false )
7482
7583 require .NoError (t , err )
7684 require .NotNil (t , result )
7785 require .True (t , stub .resetDailyCalled , "应调用 ResetDailyUsage" )
7886 require .False (t , stub .resetWeeklyCalled , "不应调用 ResetWeeklyUsage" )
87+ require .False (t , stub .resetMonthlyCalled , "不应调用 ResetMonthlyUsage" )
7988}
8089
8190func TestAdminResetQuota_ResetWeeklyOnly (t * testing.T ) {
@@ -84,12 +93,13 @@ func TestAdminResetQuota_ResetWeeklyOnly(t *testing.T) {
8493 }
8594 svc := newResetQuotaSvc (stub )
8695
87- result , err := svc .AdminResetQuota (context .Background (), 3 , false , true )
96+ result , err := svc .AdminResetQuota (context .Background (), 3 , false , true , false )
8897
8998 require .NoError (t , err )
9099 require .NotNil (t , result )
91100 require .False (t , stub .resetDailyCalled , "不应调用 ResetDailyUsage" )
92101 require .True (t , stub .resetWeeklyCalled , "应调用 ResetWeeklyUsage" )
102+ require .False (t , stub .resetMonthlyCalled , "不应调用 ResetMonthlyUsage" )
93103}
94104
95105func TestAdminResetQuota_BothFalseReturnsError (t * testing.T ) {
@@ -98,22 +108,24 @@ func TestAdminResetQuota_BothFalseReturnsError(t *testing.T) {
98108 }
99109 svc := newResetQuotaSvc (stub )
100110
101- _ , err := svc .AdminResetQuota (context .Background (), 7 , false , false )
111+ _ , err := svc .AdminResetQuota (context .Background (), 7 , false , false , false )
102112
103113 require .ErrorIs (t , err , ErrInvalidInput )
104114 require .False (t , stub .resetDailyCalled )
105115 require .False (t , stub .resetWeeklyCalled )
116+ require .False (t , stub .resetMonthlyCalled )
106117}
107118
108119func TestAdminResetQuota_SubscriptionNotFound (t * testing.T ) {
109120 stub := & resetQuotaUserSubRepoStub {sub : nil }
110121 svc := newResetQuotaSvc (stub )
111122
112- _ , err := svc .AdminResetQuota (context .Background (), 999 , true , true )
123+ _ , err := svc .AdminResetQuota (context .Background (), 999 , true , true , true )
113124
114125 require .ErrorIs (t , err , ErrSubscriptionNotFound )
115126 require .False (t , stub .resetDailyCalled )
116127 require .False (t , stub .resetWeeklyCalled )
128+ require .False (t , stub .resetMonthlyCalled )
117129}
118130
119131func TestAdminResetQuota_ResetDailyUsageError (t * testing.T ) {
@@ -124,7 +136,7 @@ func TestAdminResetQuota_ResetDailyUsageError(t *testing.T) {
124136 }
125137 svc := newResetQuotaSvc (stub )
126138
127- _ , err := svc .AdminResetQuota (context .Background (), 4 , true , true )
139+ _ , err := svc .AdminResetQuota (context .Background (), 4 , true , true , false )
128140
129141 require .ErrorIs (t , err , dbErr )
130142 require .True (t , stub .resetDailyCalled )
@@ -139,12 +151,41 @@ func TestAdminResetQuota_ResetWeeklyUsageError(t *testing.T) {
139151 }
140152 svc := newResetQuotaSvc (stub )
141153
142- _ , err := svc .AdminResetQuota (context .Background (), 5 , false , true )
154+ _ , err := svc .AdminResetQuota (context .Background (), 5 , false , true , false )
143155
144156 require .ErrorIs (t , err , dbErr )
145157 require .True (t , stub .resetWeeklyCalled )
146158}
147159
160+ func TestAdminResetQuota_ResetMonthlyOnly (t * testing.T ) {
161+ stub := & resetQuotaUserSubRepoStub {
162+ sub : & UserSubscription {ID : 8 , UserID : 10 , GroupID : 20 },
163+ }
164+ svc := newResetQuotaSvc (stub )
165+
166+ result , err := svc .AdminResetQuota (context .Background (), 8 , false , false , true )
167+
168+ require .NoError (t , err )
169+ require .NotNil (t , result )
170+ require .False (t , stub .resetDailyCalled , "不应调用 ResetDailyUsage" )
171+ require .False (t , stub .resetWeeklyCalled , "不应调用 ResetWeeklyUsage" )
172+ require .True (t , stub .resetMonthlyCalled , "应调用 ResetMonthlyUsage" )
173+ }
174+
175+ func TestAdminResetQuota_ResetMonthlyUsageError (t * testing.T ) {
176+ dbErr := errors .New ("db error" )
177+ stub := & resetQuotaUserSubRepoStub {
178+ sub : & UserSubscription {ID : 9 , UserID : 10 , GroupID : 20 },
179+ resetMonthlyErr : dbErr ,
180+ }
181+ svc := newResetQuotaSvc (stub )
182+
183+ _ , err := svc .AdminResetQuota (context .Background (), 9 , false , false , true )
184+
185+ require .ErrorIs (t , err , dbErr )
186+ require .True (t , stub .resetMonthlyCalled )
187+ }
188+
148189func TestAdminResetQuota_ReturnsRefreshedSub (t * testing.T ) {
149190 stub := & resetQuotaUserSubRepoStub {
150191 sub : & UserSubscription {
@@ -156,7 +197,7 @@ func TestAdminResetQuota_ReturnsRefreshedSub(t *testing.T) {
156197 }
157198
158199 svc := newResetQuotaSvc (stub )
159- result , err := svc .AdminResetQuota (context .Background (), 6 , true , false )
200+ result , err := svc .AdminResetQuota (context .Background (), 6 , true , false , false )
160201
161202 require .NoError (t , err )
162203 // ResetDailyUsage stub 会将 sub.DailyUsageUSD 归零,
0 commit comments