fix: recover gateway callbacks and client send flows

This commit is contained in:
hectorzhao
2026-08-27 14:30:02 +08:00
parent a280b4bb22
commit d6edb88b76
10 changed files with 167 additions and 10 deletions
@@ -3,6 +3,7 @@ package resultoutbox
import (
"context"
"encoding/json"
"errors"
"net/http"
"net/http/httptest"
"sync/atomic"
@@ -33,6 +34,52 @@ func TestPublishSubmitSegmentIsIdempotent(t *testing.T) {
}
}
func TestUplinkWithoutPlatformMessageIDIsAValidOutboxEvent(t *testing.T) {
mr := miniredis.RunT(t)
client := redis.NewClient(&redis.Options{Addr: mr.Addr()})
outbox := New(client)
event := queue.UplinkEvent{
Envelope: queue.Envelope{
SchemaVersion: queue.SchemaVersion,
MessageType: queue.MessageTypeUplinkEvent,
ChannelID: "channel-1",
CreatedAt: time.Now().UTC(),
},
SequenceID: 1, PhoneNumber: "13800138000", DestID: "10690001",
Content: "UP", ReceivedAt: time.Now().UTC(),
}
if err := outbox.PublishUplink(context.Background(), event); err != nil {
t.Fatalf("publish uplink: %v", err)
}
streams, err := client.XRange(context.Background(), outbox.StreamName(), "-", "+").Result()
if err != nil || len(streams) != 1 {
t.Fatalf("read uplink stream: entries=%d err=%v", len(streams), err)
}
parsed, err := EventFromStreamValues(streams[0].Values)
if err != nil {
t.Fatalf("parse uplink without messageId: %v", err)
}
if parsed.EventType != "uplink" || parsed.MessageID != "" {
t.Fatalf("unexpected uplink envelope: %+v", parsed)
}
}
func TestRetryUntilCanceledRestartsAfterTransientFailure(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
calls := 0
err := retryUntilCanceled(ctx, time.Millisecond, func() error {
calls++
if calls == 1 {
return errors.New("transient Redis read timeout")
}
cancel()
return ctx.Err()
})
if !errors.Is(err, context.Canceled) || calls != 2 {
t.Fatalf("retry result err=%v calls=%d, want context canceled after 2 calls", err, calls)
}
}
func TestBatchCallbackSendsMultipleEventsInOneRequest(t *testing.T) {
mr := miniredis.RunT(t)
client := redis.NewClient(&redis.Options{Addr: mr.Addr()})