Files
ai-customer-service/internal/platformadapter/sub2api_adapter_test.go
2026-05-06 10:45:51 +08:00

65 lines
2.6 KiB
Go

package platformadapter
import (
"net/http/httptest"
"strings"
"testing"
"time"
)
func TestSub2APIAdapter_ShouldMapMinimalPayload(t *testing.T) {
adapter := NewSub2APIAdapter()
body := `{"message_id":"m1","channel":"sub2api","open_id":"u1","content":"我要退款"}`
req := httptest.NewRequest("POST", "/api/v1/customer-service/platforms/sub2api/webhook", strings.NewReader(body))
msg, meta, err := adapter.ParseInbound(req, []byte(body), IngressContext{Platform: "sub2api", ReceivedAt: time.Unix(100, 0)})
if err != nil {
t.Fatalf("ParseInbound() error = %v", err)
}
if msg.Channel != "sub2api" || msg.OpenID != "u1" || msg.Content != "我要退款" {
t.Fatalf("unexpected unified message: %+v", msg)
}
if meta == nil || meta.SourceMessageID != "m1" || meta.Platform != "sub2api" {
t.Fatalf("unexpected meta: %+v", meta)
}
}
func TestSub2APIAdapter_ShouldRejectUnknownEnvelopeFields(t *testing.T) {
adapter := NewSub2APIAdapter()
body := `{"message_id":"m1","channel":"sub2api","open_id":"u1","content":"hi","unknown":1}`
req := httptest.NewRequest("POST", "/api/v1/customer-service/platforms/sub2api/webhook", strings.NewReader(body))
_, _, err := adapter.ParseInbound(req, []byte(body), IngressContext{Platform: "sub2api", ReceivedAt: time.Now()})
if err == nil {
t.Fatal("expected error for unknown fields")
}
}
func TestSub2APIAdapter_ShouldUseChannelOverrideWhenPresent(t *testing.T) {
adapter := NewSub2APIAdapter()
body := `{"message_id":"m1","channel":"body-channel","open_id":"u1","content":"hi"}`
req := httptest.NewRequest("POST", "/api/v1/customer-service/platforms/sub2api/webhook/widget", strings.NewReader(body))
msg, _, err := adapter.ParseInbound(req, []byte(body), IngressContext{Platform: "sub2api", PathChannel: "widget", ReceivedAt: time.Now()})
if err != nil {
t.Fatalf("ParseInbound() error = %v", err)
}
if msg.Channel != "widget" {
t.Fatalf("msg.Channel = %q, want widget", msg.Channel)
}
}
func TestSub2APIAdapter_ShouldRequireOpenIDAndContent(t *testing.T) {
adapter := NewSub2APIAdapter()
body := `{"message_id":"m1","channel":"sub2api","open_id":"","content":""}`
req := httptest.NewRequest("POST", "/api/v1/customer-service/platforms/sub2api/webhook", strings.NewReader(body))
_, _, err := adapter.ParseInbound(req, []byte(body), IngressContext{Platform: "sub2api", ReceivedAt: time.Now()})
if err == nil {
t.Fatal("expected validation error")
}
reqErr, ok := err.(*RequestError)
if !ok {
t.Fatalf("error type = %T, want *RequestError", err)
}
if reqErr.Status != 400 {
t.Fatalf("reqErr.Status = %d, want 400", reqErr.Status)
}
}