Align GoChat with Chatwoot frontend contracts

This commit is contained in:
2026-06-13 22:13:32 +08:00
parent 71abf58636
commit d884fdda0a
162 changed files with 9825 additions and 528 deletions
@@ -4,6 +4,7 @@ import (
"bytes"
"context"
"encoding/json"
"errors"
"net/http"
"net/http/httptest"
"testing"
@@ -23,20 +24,32 @@ import (
)
type fakeFacebookCallbackProvider struct {
longToken string
pages []facebookchannel.FBPageInfo
instagramID string
longToken string
pages []facebookchannel.FBPageInfo
instagramID string
tokenErr error
pagesErr error
instagramErr error
}
func (f *fakeFacebookCallbackProvider) ExchangeLongLivedUserToken(context.Context, string) (string, error) {
if f.tokenErr != nil {
return "", f.tokenErr
}
return f.longToken, nil
}
func (f *fakeFacebookCallbackProvider) ListFacebookPages(context.Context, string) ([]facebookchannel.FBPageInfo, error) {
if f.pagesErr != nil {
return nil, f.pagesErr
}
return f.pages, nil
}
func (f *fakeFacebookCallbackProvider) FetchInstagramBusinessAccountID(context.Context, string) (string, error) {
if f.instagramErr != nil {
return "", f.instagramErr
}
return f.instagramID, nil
}
@@ -76,6 +89,9 @@ func TestFacebookCallbacks_RegisterFacebookPage(t *testing.T) {
assert.Equal(t, "Facebook", payload["name"])
assert.Equal(t, "facebook", payload["channel_type"])
assert.Equal(t, "page-1", payload["page_id"])
assert.Equal(t, false, payload["enable_auto_assignment"])
assert.NotContains(t, payload, "success")
assert.NotContains(t, payload, "data")
var channel channelmodel.ChannelFacebook
require.NoError(t, db.First(&channel).Error)
@@ -83,6 +99,17 @@ func TestFacebookCallbacks_RegisterFacebookPage(t *testing.T) {
assert.Equal(t, "user-token", channel.UserAccessToken)
assert.Equal(t, "page-token", channel.PageAccessToken)
assert.Equal(t, "ig-123", channel.InstagramBusinessAccountID)
var inbox model.Inbox
require.NoError(t, db.First(&inbox, uint(payload["id"].(float64))).Error)
assert.Equal(t, account.ID, inbox.AccountID)
assert.Equal(t, "Facebook", inbox.Name)
assert.Equal(t, "facebook", inbox.ChannelType)
assert.Equal(t, channel.ID, inbox.ChannelID)
var config map[string]any
require.NoError(t, json.Unmarshal([]byte(inbox.ChannelConfig), &config))
assert.Equal(t, "page-1", config["page_id"])
assert.Equal(t, "page-token", config["page_access_token"])
}
func TestFacebookCallbacks_FacebookPagesMarksExistingPages(t *testing.T) {
@@ -111,6 +138,20 @@ func TestFacebookCallbacks_FacebookPagesMarksExistingPages(t *testing.T) {
assert.False(t, payload.Data.PageDetails[1].Exists)
}
func TestFacebookCallbacks_FacebookPagesReturns422ProviderFailure(t *testing.T) {
provider := &fakeFacebookCallbackProvider{tokenErr: errors.New("facebook token exchange failed")}
router, db := setupFacebookCallbackTest(t, provider)
account := model.Account{Name: "Acme", Active: true}
require.NoError(t, db.Create(&account).Error)
rec := performFacebookCallbackRequest(t, router, http.MethodPost, "/api/v1/accounts/1/callbacks/facebook_pages.json", map[string]any{"omniauth_token": "bad-token"})
require.Equal(t, http.StatusUnprocessableEntity, rec.Code)
var payload map[string]any
require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &payload))
assert.Equal(t, "facebook token exchange failed", payload["error"])
}
func TestFacebookCallbacks_ReauthorizePageUpdatesMatchingPage(t *testing.T) {
provider := &fakeFacebookCallbackProvider{longToken: "long-user-token", instagramID: "ig-456", pages: []facebookchannel.FBPageInfo{{ID: "page-1", Name: "Renamed", AccessToken: "new-page-token"}}}
router, db := setupFacebookCallbackTest(t, provider)
@@ -138,6 +179,7 @@ func TestFacebookCallbacks_ReauthorizePageUpdatesMatchingPage(t *testing.T) {
var config map[string]any
require.NoError(t, json.Unmarshal([]byte(updatedInbox.ChannelConfig), &config))
assert.Equal(t, "new-page-token", config["page_access_token"])
assert.Equal(t, "Renamed", config["page_name"])
}
func TestFacebookCallbacks_ReauthorizePageReturns422WhenPageMissing(t *testing.T) {