100 lines
2.7 KiB
Go
100 lines
2.7 KiB
Go
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")
|
|
}
|
|
}
|
|
|
|
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)
|
|
}
|
|
}
|