package email import ( "context" "sync" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) type recordingHook struct { mu sync.Mutex calls []hookCall } type hookCall struct { key string value string seconds int } func (h *recordingHook) SetexCtx(_ context.Context, key, value string, seconds int) error { h.mu.Lock() defer h.mu.Unlock() h.calls = append(h.calls, hookCall{key: key, value: value, seconds: seconds}) return nil } func TestMockSender_RedisHookWritesBodyPerRecipient(t *testing.T) { hook := &recordingHook{} s := NewMockSender(WithMockRedis(hook, 30)) _, err := s.Send(context.Background(), &Message{ From: "noreply@k6.local", To: []string{"alice@example.com", "bob@example.com"}, Subject: "code", Body: "code is 123456", }) require.NoError(t, err) hook.mu.Lock() defer hook.mu.Unlock() require.Len(t, hook.calls, 2) assert.Equal(t, MockEmailRedisKeyPrefix+"alice@example.com", hook.calls[0].key) assert.Equal(t, MockEmailRedisKeyPrefix+"bob@example.com", hook.calls[1].key) for _, c := range hook.calls { assert.Equal(t, "code is 123456", c.value) assert.Equal(t, 30, c.seconds) } } func TestMockSender_NoHookSkipsRedis(t *testing.T) { s := NewMockSender() _, err := s.Send(context.Background(), &Message{To: []string{"x@y"}, Body: "z"}) require.NoError(t, err) }