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/intake" { 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", }, }, } if err := conn.handleDeliver(deliverPacketFromCMPP2(&cmpp.Cmpp2DeliverReqPkt{ SeqId: 7, MsgId: 999, RegisterDelivery: 1, MsgContent: string(payload), })); err != nil { t.Fatalf("handle receipt: %v", err) } 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) } if event.ConnectionID != "channel-1-0" { t.Fatalf("ConnectionID = %q, want channel-1-0", event.ConnectionID) } case <-time.After(time.Second): t.Fatal("timed out waiting for receipt event") } } func TestReceiptStatusTreatsNonDeliveredFinalStatesAsUndelivered(t *testing.T) { for _, stat := range []string{"UNKNOWN", "UNDELIV", "EXPIRED", "DELETED", "REJECTD"} { if got := receiptStatus(stat); got != "undelivered" { t.Fatalf("receiptStatus(%q) = %q, want undelivered", stat, got) } } if got := receiptStatus(""); got != "unknown" { t.Fatalf("receiptStatus(empty) = %q, want unknown", got) } }