Skip to content

Commit 2a8b83a

Browse files
AchoArnoldCopilot
andcommitted
test(services): add unit tests for getSendDelay rate-based logic
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 8fb277f commit 2a8b83a

1 file changed

Lines changed: 105 additions & 0 deletions

File tree

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package services
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
"github.com/NdoleStudio/httpsms/pkg/events"
8+
"github.com/NdoleStudio/httpsms/pkg/telemetry"
9+
"github.com/google/uuid"
10+
"github.com/stretchr/testify/assert"
11+
"go.opentelemetry.io/otel/trace"
12+
)
13+
14+
func TestGetSendDelay_WithSendAt_ReturnsTimeUntil(t *testing.T) {
15+
service := &MessageService{}
16+
logger := &noopLogger{}
17+
18+
sendAt := time.Now().UTC().Add(5 * time.Minute)
19+
params := MessageSendParams{SendAt: &sendAt}
20+
payload := events.MessageAPISentPayload{MessageID: uuid.New()}
21+
22+
delay := service.getSendDelay(logger, payload, params, 10)
23+
24+
// Should be approximately 5 minutes (within 2 seconds tolerance)
25+
assert.InDelta(t, float64(5*time.Minute), float64(delay), float64(2*time.Second))
26+
}
27+
28+
func TestGetSendDelay_WithSendAtInPast_ReturnsZero(t *testing.T) {
29+
service := &MessageService{}
30+
logger := &noopLogger{}
31+
32+
sendAt := time.Now().UTC().Add(-5 * time.Minute)
33+
params := MessageSendParams{SendAt: &sendAt}
34+
payload := events.MessageAPISentPayload{MessageID: uuid.New()}
35+
36+
delay := service.getSendDelay(logger, payload, params, 10)
37+
38+
assert.Equal(t, time.Duration(0), delay)
39+
}
40+
41+
func TestGetSendDelay_BulkIndex_RateBasedDelay(t *testing.T) {
42+
service := &MessageService{}
43+
logger := &noopLogger{}
44+
45+
params := MessageSendParams{Index: 3}
46+
payload := events.MessageAPISentPayload{MessageID: uuid.New()}
47+
48+
// 10 messages per minute = 6 seconds interval
49+
delay := service.getSendDelay(logger, payload, params, 10)
50+
51+
expected := time.Duration(3) * (time.Minute / time.Duration(10))
52+
assert.Equal(t, expected, delay)
53+
}
54+
55+
func TestGetSendDelay_BulkIndex_ZeroRate_ReturnsZero(t *testing.T) {
56+
service := &MessageService{}
57+
logger := &noopLogger{}
58+
59+
params := MessageSendParams{Index: 5}
60+
payload := events.MessageAPISentPayload{MessageID: uuid.New()}
61+
62+
delay := service.getSendDelay(logger, payload, params, 0)
63+
64+
assert.Equal(t, time.Duration(0), delay)
65+
}
66+
67+
func TestGetSendDelay_IndexZero_ReturnsZero(t *testing.T) {
68+
service := &MessageService{}
69+
logger := &noopLogger{}
70+
71+
params := MessageSendParams{Index: 0}
72+
payload := events.MessageAPISentPayload{MessageID: uuid.New()}
73+
74+
delay := service.getSendDelay(logger, payload, params, 10)
75+
76+
assert.Equal(t, time.Duration(0), delay)
77+
}
78+
79+
func TestGetSendDelay_NoSendAtNoIndex_ReturnsZero(t *testing.T) {
80+
service := &MessageService{}
81+
logger := &noopLogger{}
82+
83+
params := MessageSendParams{}
84+
payload := events.MessageAPISentPayload{MessageID: uuid.New()}
85+
86+
delay := service.getSendDelay(logger, payload, params, 10)
87+
88+
assert.Equal(t, time.Duration(0), delay)
89+
}
90+
91+
// noopLogger implements telemetry.Logger for testing
92+
type noopLogger struct{}
93+
94+
var _ telemetry.Logger = (*noopLogger)(nil)
95+
96+
func (l *noopLogger) Error(_ error) {}
97+
func (l *noopLogger) WithService(_ string) telemetry.Logger { return l }
98+
func (l *noopLogger) WithString(_, _ string) telemetry.Logger { return l }
99+
func (l *noopLogger) WithSpan(_ trace.SpanContext) telemetry.Logger { return l }
100+
func (l *noopLogger) Trace(_ string) {}
101+
func (l *noopLogger) Info(_ string) {}
102+
func (l *noopLogger) Warn(_ error) {}
103+
func (l *noopLogger) Debug(_ string) {}
104+
func (l *noopLogger) Fatal(_ error) {}
105+
func (l *noopLogger) Printf(_ string, _ ...interface{}) {}

0 commit comments

Comments
 (0)