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
+46 -1
View File
@@ -32,7 +32,7 @@ func (s *TeamHandlerTestSuite) SetupSuite() {
Logger: logger.Default.LogMode(logger.Silent),
})
s.Require().NoError(err)
s.Require().NoError(db.AutoMigrate(&model.Account{}, &model.Team{}, &model.TeamMember{}))
s.Require().NoError(db.AutoMigrate(&model.Account{}, &model.User{}, &model.AccountUser{}, &model.Team{}, &model.TeamMember{}))
s.db = db
teamRepo := repository.NewTeamRepo(db)
@@ -202,6 +202,51 @@ func (s *TeamHandlerTestSuite) TestDelete_Success() {
assert.Equal(s.T(), http.StatusOK, w.Code)
}
func (s *TeamHandlerTestSuite) TestTeamMembers_ChatwootPayloadAndDiffUpdate() {
team := &model.Team{AccountID: s.account.ID, Name: "members-test-team"}
s.Require().NoError(s.db.Create(team).Error)
agentOne := &model.User{AccountID: s.account.ID, Name: "Agent One", Email: "agent-one@example.test", Role: "agent"}
s.Require().NoError(s.db.Create(agentOne).Error)
s.Require().NoError(s.db.Create(&model.AccountUser{AccountID: s.account.ID, UserID: agentOne.ID, Role: "agent"}).Error)
agentTwo := &model.User{AccountID: s.account.ID, Name: "Agent Two", Email: "agent-two@example.test", Role: "agent"}
s.Require().NoError(s.db.Create(agentTwo).Error)
s.Require().NoError(s.db.Create(&model.AccountUser{AccountID: s.account.ID, UserID: agentTwo.ID, Role: "agent"}).Error)
s.Require().NoError(s.db.Create(&model.TeamMember{TeamID: team.ID, UserID: agentOne.ID, AvailabilityStatus: "online"}).Error)
r := gin.New()
r.GET("/api/v1/accounts/:account_id/teams/:team_id/team_members", func(c *gin.Context) {
s.authMiddleware(c)
s.handler.ListMembers(c)
})
r.PATCH("/api/v1/accounts/:account_id/teams/:team_id/team_members", func(c *gin.Context) {
s.authMiddleware(c)
s.handler.UpdateMembers(c)
})
listBefore := httptest.NewRecorder()
req, _ := http.NewRequest("GET", fmt.Sprintf("/api/v1/accounts/%d/teams/%d/team_members", s.account.ID, team.ID), nil)
r.ServeHTTP(listBefore, req)
assert.Equal(s.T(), http.StatusOK, listBefore.Code)
var before []map[string]any
s.Require().NoError(json.Unmarshal(listBefore.Body.Bytes(), &before))
s.Require().Len(before, 1)
assert.Equal(s.T(), "Agent One", before[0]["name"])
assert.Equal(s.T(), "online", before[0]["availability_status"])
body := fmt.Sprintf(`{"user_ids":[%d]}`, agentTwo.ID)
update := httptest.NewRecorder()
req, _ = http.NewRequest("PATCH", fmt.Sprintf("/api/v1/accounts/%d/teams/%d/team_members", s.account.ID, team.ID), bytes.NewBufferString(body))
req.Header.Set("Content-Type", "application/json")
r.ServeHTTP(update, req)
assert.Equal(s.T(), http.StatusOK, update.Code)
var after []map[string]any
s.Require().NoError(json.Unmarshal(update.Body.Bytes(), &after))
s.Require().Len(after, 1)
assert.Equal(s.T(), "Agent Two", after[0]["name"])
}
func (s *TeamHandlerTestSuite) TestGet_BadRequest_InvalidID() {
r := gin.New()
r.GET("/api/v1/accounts/:account_id/teams/:id", func(c *gin.Context) {