feat(crm): align nested conversation payloads

This commit is contained in:
2026-06-05 04:05:01 +08:00
parent 9d0e8d40c0
commit fb775b76f6
6 changed files with 74 additions and 9 deletions
@@ -8,6 +8,7 @@ import (
"net/http"
"net/http/httptest"
"testing"
"time"
"github.com/gin-gonic/gin"
"github.com/stretchr/testify/assert"
@@ -60,6 +61,8 @@ func (s *CompanyHandlerTestSuite) SetupSuite() {
&model.Contact{},
&model.Inbox{},
&model.Conversation{},
&model.Message{},
&model.Attachment{},
))
s.db = db
@@ -129,6 +132,10 @@ func (s *CompanyHandlerTestSuite) TearDownSuite() {
func (s *CompanyHandlerTestSuite) SetupTest() {
// Clean company-related tables between tests
s.db.Exec("DELETE FROM attachments")
s.db.Exec("DELETE FROM messages")
s.db.Exec("DELETE FROM conversations")
s.db.Exec("DELETE FROM contacts")
s.db.Exec("DELETE FROM company_notes")
s.db.Exec("DELETE FROM company_contacts")
s.db.Exec("DELETE FROM companies")
@@ -379,9 +386,38 @@ func (s *CompanyHandlerTestSuite) TestListConversations_Success() {
companyRepo := repository.NewCompanyRepo(s.db)
company := &model.Company{AccountID: s.accountID, Name: "ConvsCorp"}
s.Require().NoError(companyRepo.Create(context.Background(), company))
contact := &model.Contact{AccountID: s.accountID, CompanyID: &company.ID, Name: "Company Contact", Email: "company-contact@example.com"}
s.Require().NoError(s.db.Create(contact).Error)
inbox := &model.Inbox{AccountID: s.accountID, Name: "Company Inbox", ChannelType: "web_widget", ChannelID: 1}
s.Require().NoError(s.db.Create(inbox).Error)
now := time.Now().Unix()
conversation := &model.Conversation{AccountID: s.accountID, InboxID: inbox.ID, ContactID: contact.ID, Status: "open", Priority: "urgent", ChannelType: "web_widget", Channel: "web_widget", LastActivityAt: &now}
s.Require().NoError(s.db.Create(conversation).Error)
senderID := contact.ID
s.Require().NoError(s.db.Create(&model.Message{AccountID: s.accountID, InboxID: inbox.ID, ConversationID: conversation.ID, SenderID: &senderID, SenderType: "contact", MessageType: "incoming", ContentType: "text", Status: "sent", Content: "Company scoped message"}).Error)
w := s.makeRequest("GET", fmt.Sprintf("/api/v1/accounts/%d/companies/%d/conversations", s.accountID, company.ID), nil)
assert.Equal(s.T(), http.StatusOK, w.Code)
var resp map[string]interface{}
s.Require().NoError(json.Unmarshal(w.Body.Bytes(), &resp))
payload := resp["payload"].([]interface{})
s.Require().Len(payload, 1)
first := payload[0].(map[string]interface{})
assert.Equal(s.T(), "urgent", first["priority"])
assert.Equal(s.T(), float64(conversation.ID), first["id"])
assert.Equal(s.T(), float64(s.accountID), first["account_id"])
assert.NotContains(s.T(), first, "contact_id")
meta := first["meta"].(map[string]interface{})
assert.Equal(s.T(), "web_widget", meta["channel"])
assert.Equal(s.T(), float64(contact.ID), meta["sender"].(map[string]interface{})["id"])
messages := first["messages"].([]interface{})
s.Require().Len(messages, 1)
message := messages[0].(map[string]interface{})
assert.Equal(s.T(), "Company scoped message", message["content"])
assert.Equal(s.T(), float64(0), message["message_type"])
}
// ========== ListNotes ==========