feat(webhook): align chatwoot ingress routes
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
package webhook
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/gochat/gochat/internal/model"
|
||||
channelmodel "github.com/gochat/gochat/internal/model/channel"
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func newWebhookLookupTestDB(t *testing.T) *gorm.DB {
|
||||
t.Helper()
|
||||
|
||||
db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
|
||||
if err != nil {
|
||||
t.Fatalf("open sqlite: %v", err)
|
||||
}
|
||||
if err := db.AutoMigrate(
|
||||
&model.Inbox{},
|
||||
&channelmodel.ChannelTelegram{},
|
||||
&channelmodel.ChannelLINE{},
|
||||
&channelmodel.ChannelTwilioSMS{},
|
||||
&channelmodel.ChannelTikTok{},
|
||||
); err != nil {
|
||||
t.Fatalf("migrate webhook lookup models: %v", err)
|
||||
}
|
||||
return db
|
||||
}
|
||||
|
||||
func seedWebhookInbox(t *testing.T, db *gorm.DB, channelType string) model.Inbox {
|
||||
t.Helper()
|
||||
|
||||
inbox := model.Inbox{
|
||||
AccountID: 1,
|
||||
Name: channelType + " inbox",
|
||||
ChannelType: channelType,
|
||||
ChannelID: 1,
|
||||
Enabled: true,
|
||||
}
|
||||
if err := db.Create(&inbox).Error; err != nil {
|
||||
t.Fatalf("create inbox: %v", err)
|
||||
}
|
||||
return inbox
|
||||
}
|
||||
|
||||
func TestTelegramWebhookLookupInboxByBotToken(t *testing.T) {
|
||||
db := newWebhookLookupTestDB(t)
|
||||
inbox := seedWebhookInbox(t, db, "telegram")
|
||||
channel := channelmodel.ChannelTelegram{
|
||||
AccountID: 1,
|
||||
InboxID: inbox.ID,
|
||||
BotToken: "123:secret-token",
|
||||
BotName: "support_bot",
|
||||
}
|
||||
if err := db.Create(&channel).Error; err != nil {
|
||||
t.Fatalf("create telegram channel: %v", err)
|
||||
}
|
||||
|
||||
h := NewTelegramWebhookHandler(nil, nil, db)
|
||||
found, err := h.lookupInbox("123:secret-token")
|
||||
if err != nil {
|
||||
t.Fatalf("lookup inbox: %v", err)
|
||||
}
|
||||
if found.ID != inbox.ID || found.ChannelType != "telegram" {
|
||||
t.Fatalf("unexpected inbox: id=%d type=%s", found.ID, found.ChannelType)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLineWebhookLookupInboxByLineChannelID(t *testing.T) {
|
||||
db := newWebhookLookupTestDB(t)
|
||||
inbox := seedWebhookInbox(t, db, "line")
|
||||
channel := channelmodel.ChannelLINE{
|
||||
AccountID: 1,
|
||||
InboxID: inbox.ID,
|
||||
ChannelID: "line-channel-1",
|
||||
Name: "LINE OA",
|
||||
}
|
||||
if err := db.Create(&channel).Error; err != nil {
|
||||
t.Fatalf("create line channel: %v", err)
|
||||
}
|
||||
|
||||
h := NewLineWebhookHandler(nil, nil, nil, db)
|
||||
found, err := h.lookupInboxByLineChannelID("line-channel-1")
|
||||
if err != nil {
|
||||
t.Fatalf("lookup inbox: %v", err)
|
||||
}
|
||||
if found.ID != inbox.ID || found.ChannelType != "line" {
|
||||
t.Fatalf("unexpected inbox: id=%d type=%s", found.ID, found.ChannelType)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTwilioWebhookLookupInboxByPhoneNumber(t *testing.T) {
|
||||
db := newWebhookLookupTestDB(t)
|
||||
inbox := seedWebhookInbox(t, db, "twilio_sms")
|
||||
channel := channelmodel.ChannelTwilioSMS{
|
||||
AccountID: 1,
|
||||
InboxID: inbox.ID,
|
||||
AccountSID: "AC123",
|
||||
PhoneNumber: "+15551234567",
|
||||
MessagingServiceSID: "MG123",
|
||||
}
|
||||
if err := db.Create(&channel).Error; err != nil {
|
||||
t.Fatalf("create twilio channel: %v", err)
|
||||
}
|
||||
|
||||
h := NewTwilioWebhookHandler(nil, db)
|
||||
found, err := h.lookupInboxByPhoneNumber("+15551234567")
|
||||
if err != nil {
|
||||
t.Fatalf("lookup inbox: %v", err)
|
||||
}
|
||||
if found.ID != inbox.ID || found.ChannelType != "twilio_sms" {
|
||||
t.Fatalf("unexpected inbox: id=%d type=%s", found.ID, found.ChannelType)
|
||||
}
|
||||
}
|
||||
|
||||
func TestTikTokWebhookLookupInboxByBusinessIDAndPayloadExtractor(t *testing.T) {
|
||||
db := newWebhookLookupTestDB(t)
|
||||
inbox := seedWebhookInbox(t, db, "tiktok")
|
||||
channel := channelmodel.ChannelTikTok{
|
||||
AccountID: 1,
|
||||
InboxID: inbox.ID,
|
||||
TikTokBusinessID: "biz-123",
|
||||
WebhookVerifyToken: "verify-token",
|
||||
}
|
||||
if err := db.Create(&channel).Error; err != nil {
|
||||
t.Fatalf("create tiktok channel: %v", err)
|
||||
}
|
||||
|
||||
h := NewTikTokWebhookHandler(nil, nil, db)
|
||||
found, err := h.lookupInboxByBusinessID("biz-123")
|
||||
if err != nil {
|
||||
t.Fatalf("lookup inbox: %v", err)
|
||||
}
|
||||
if found.ID != inbox.ID || found.ChannelType != "tiktok" {
|
||||
t.Fatalf("unexpected inbox: id=%d type=%s", found.ID, found.ChannelType)
|
||||
}
|
||||
|
||||
if got := extractTikTokBusinessID([]byte(`{"data":{"business_id":"biz-123"}}`)); got != "biz-123" {
|
||||
t.Fatalf("unexpected extracted business id: %s", got)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user