@@ -81,7 +81,7 @@ func TestPolicyServer_HandleRequest_SkipNonEndOfMessage(t *testing.T) {
8181 rateLimiter := & RateLimiter {
8282 counters : make (map [string ]* senderCounter ),
8383 }
84- server := NewPolicyServer (mockClient , rateLimiter , zap .NewNop ())
84+ server := NewPolicyServer (mockClient , rateLimiter , "Rate limit exceeded, please try again later" , zap .NewNop ())
8585
8686 req := & PolicyRequest {
8787 ProtocolState : "RCPT" ,
@@ -103,7 +103,7 @@ func TestPolicyServer_HandleRequest_NoSender(t *testing.T) {
103103 rateLimiter := & RateLimiter {
104104 counters : make (map [string ]* senderCounter ),
105105 }
106- server := NewPolicyServer (mockClient , rateLimiter , zap .NewNop ())
106+ server := NewPolicyServer (mockClient , rateLimiter , "Rate limit exceeded, please try again later" , zap .NewNop ())
107107
108108 req := & PolicyRequest {
109109 ProtocolState : "END-OF-MESSAGE" ,
@@ -125,7 +125,7 @@ func TestPolicyServer_HandleRequest_APIError(t *testing.T) {
125125 rateLimiter := & RateLimiter {
126126 counters : make (map [string ]* senderCounter ),
127127 }
128- server := NewPolicyServer (mockClient , rateLimiter , zap .NewNop ())
128+ server := NewPolicyServer (mockClient , rateLimiter , "Rate limit exceeded, please try again later" , zap .NewNop ())
129129
130130 req := & PolicyRequest {
131131 ProtocolState : "END-OF-MESSAGE" ,
@@ -148,7 +148,7 @@ func TestPolicyServer_HandleRequest_NoLimits(t *testing.T) {
148148 rateLimiter := & RateLimiter {
149149 counters : make (map [string ]* senderCounter ),
150150 }
151- server := NewPolicyServer (mockClient , rateLimiter , zap .NewNop ())
151+ server := NewPolicyServer (mockClient , rateLimiter , "Rate limit exceeded, please try again later" , zap .NewNop ())
152152
153153 req := & PolicyRequest {
154154 ProtocolState : "END-OF-MESSAGE" ,
@@ -170,7 +170,7 @@ func TestPolicyServer_HandleRequest_AllowedMessage(t *testing.T) {
170170 rateLimiter := & RateLimiter {
171171 counters : make (map [string ]* senderCounter ),
172172 }
173- server := NewPolicyServer (mockClient , rateLimiter , zap .NewNop ())
173+ server := NewPolicyServer (mockClient , rateLimiter , "Rate limit exceeded, please try again later" , zap .NewNop ())
174174
175175 req := & PolicyRequest {
176176 ProtocolState : "END-OF-MESSAGE" ,
@@ -192,7 +192,7 @@ func TestPolicyServer_HandleRequest_RateLimited(t *testing.T) {
192192 rateLimiter := & RateLimiter {
193193 counters : make (map [string ]* senderCounter ),
194194 }
195- server := NewPolicyServer (mockClient , rateLimiter , zap .NewNop ())
195+ server := NewPolicyServer (mockClient , rateLimiter , "Rate limit exceeded, please try again later" , zap .NewNop ())
196196
197197 req := & PolicyRequest {
198198 ProtocolState : "END-OF-MESSAGE" ,
@@ -218,14 +218,39 @@ func TestPolicyServer_HandleRequest_RateLimited(t *testing.T) {
218218 }
219219}
220220
221+ func TestPolicyServer_HandleRequest_CustomRateLimitMessage (t * testing.T ) {
222+ mockClient := & MockUserliServiceForPolicy {
223+ quota : & Quota {PerHour : 1 , PerDay : 100 },
224+ }
225+ rateLimiter := & RateLimiter {
226+ counters : make (map [string ]* senderCounter ),
227+ }
228+ server := NewPolicyServer (mockClient , rateLimiter , "Too many emails" , zap .NewNop ())
229+
230+ req := & PolicyRequest {
231+ ProtocolState : "END-OF-MESSAGE" ,
232+ Sender : "user@example.org" ,
233+ SaslUsername : "user@example.org" ,
234+ }
235+
236+ // First message passes
237+ server .handleRequest (context .Background (), req )
238+
239+ // Second message should be rejected with custom message
240+ response := server .handleRequest (context .Background (), req )
241+ if response != "REJECT Too many emails" {
242+ t .Errorf ("Expected 'REJECT Too many emails', got %s" , response )
243+ }
244+ }
245+
221246func TestPolicyServer_HandleRequest_UsesSaslUsername (t * testing.T ) {
222247 mockClient := & MockUserliServiceForPolicy {
223248 quota : & Quota {PerHour : 1 , PerDay : 100 },
224249 }
225250 rateLimiter := & RateLimiter {
226251 counters : make (map [string ]* senderCounter ),
227252 }
228- server := NewPolicyServer (mockClient , rateLimiter , zap .NewNop ())
253+ server := NewPolicyServer (mockClient , rateLimiter , "Rate limit exceeded, please try again later" , zap .NewNop ())
229254
230255 // First request uses sasl_username
231256 req1 := & PolicyRequest {
@@ -255,7 +280,7 @@ func TestPolicyServer_Integration(t *testing.T) {
255280 rateLimiter := & RateLimiter {
256281 counters : make (map [string ]* senderCounter ),
257282 }
258- server := NewPolicyServer (mockClient , rateLimiter , zap .NewNop ())
283+ server := NewPolicyServer (mockClient , rateLimiter , "Rate limit exceeded, please try again later" , zap .NewNop ())
259284
260285 // Start server on random port
261286 listener , err := net .Listen ("tcp" , "127.0.0.1:0" )
@@ -317,7 +342,7 @@ func TestPolicyServer_HandleConnection(t *testing.T) {
317342 rateLimiter := & RateLimiter {
318343 counters : make (map [string ]* senderCounter ),
319344 }
320- server := NewPolicyServer (mockClient , rateLimiter , zap .NewNop ())
345+ server := NewPolicyServer (mockClient , rateLimiter , "Rate limit exceeded, please try again later" , zap .NewNop ())
321346
322347 serverConn , clientConn := net .Pipe ()
323348 defer serverConn .Close ()
@@ -367,7 +392,7 @@ func TestPolicyServer_HandleConnection_MultipleRequests(t *testing.T) {
367392 rateLimiter := & RateLimiter {
368393 counters : make (map [string ]* senderCounter ),
369394 }
370- server := NewPolicyServer (mockClient , rateLimiter , zap .NewNop ())
395+ server := NewPolicyServer (mockClient , rateLimiter , "Rate limit exceeded, please try again later" , zap .NewNop ())
371396
372397 serverConn , clientConn := net .Pipe ()
373398 defer serverConn .Close ()
@@ -412,7 +437,7 @@ func TestPolicyServer_StartPolicyServer(t *testing.T) {
412437 rateLimiter := & RateLimiter {
413438 counters : make (map [string ]* senderCounter ),
414439 }
415- server := NewPolicyServer (mockClient , rateLimiter , zap .NewNop ())
440+ server := NewPolicyServer (mockClient , rateLimiter , "Rate limit exceeded, please try again later" , zap .NewNop ())
416441
417442 ctx , cancel := context .WithCancel (context .Background ())
418443 var wg sync.WaitGroup
0 commit comments