fix: handle cmpp2 deliver receipts

This commit is contained in:
hectorzhao
2026-07-09 16:14:11 +08:00
parent 20757203d9
commit dc7d015219
3 changed files with 146 additions and 18 deletions
+88
View File
@@ -0,0 +1,88 @@
package upstream
import (
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"time"
"cmpp-platform/gateway/internal/queue"
cmpp "github.com/bigwhite/gocmpp"
)
func TestHandleCMPP2DeliverReceiptPostsReceiptEvent(t *testing.T) {
events := make(chan queue.ReceiptEvent, 1)
api := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/gateway/events/receipt" {
t.Fatalf("unexpected path: %s", r.URL.Path)
}
var event queue.ReceiptEvent
if err := json.NewDecoder(r.Body).Decode(&event); err != nil {
t.Fatalf("decode receipt event: %v", err)
}
events <- event
w.WriteHeader(http.StatusOK)
}))
defer api.Close()
receipt := cmpp.CmppReceiptPkt{
MsgId: 8412634832294102675,
Stat: "DELIVRD",
SubmitTime: "2607091558",
DoneTime: "2607091559",
DestTerminalId: "18821203795",
SmscSequence: 1,
}
payload, err := receipt.Pack()
if err != nil {
t.Fatalf("pack receipt: %v", err)
}
conn := &connection{
channelID: "channel-1",
apiBaseURL: api.URL,
httpClient: api.Client(),
tracker: map[uint64]queue.SubmitCommand{
receipt.MsgId: {
Envelope: queue.Envelope{
SchemaVersion: queue.SchemaVersion,
MessageType: queue.MessageTypeSubmitCommand,
TraceID: "trace-1",
MessageID: "message-1",
ChannelID: "channel-1",
CreatedAt: time.Now(),
},
SubmitID: "submit-1",
},
},
}
conn.handleDeliver(deliverPacketFromCMPP2(&cmpp.Cmpp2DeliverReqPkt{
SeqId: 7,
MsgId: 999,
RegisterDelivery: 1,
MsgContent: string(payload),
}))
select {
case event := <-events:
if event.MessageID != "message-1" || event.ChannelID != "channel-1" || event.TraceID != "trace-1" {
t.Fatalf("unexpected envelope: %+v", event.Envelope)
}
if event.SequenceID != 7 {
t.Fatalf("SequenceID = %d, want 7", event.SequenceID)
}
if event.GatewayMessageID != "8412634832294102675" {
t.Fatalf("GatewayMessageID = %q", event.GatewayMessageID)
}
if event.PhoneNumber != "18821203795" {
t.Fatalf("PhoneNumber = %q", event.PhoneNumber)
}
if event.ReceiptStatus != "delivered" || event.RawStatus != "DELIVRD" {
t.Fatalf("unexpected receipt status: %+v", event)
}
case <-time.After(time.Second):
t.Fatal("timed out waiting for receipt event")
}
}