package v1 import ( "bytes" "encoding/json" "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" "github.com/gochat/gochat/internal/service" ) func setupAgentBulkRouter(handler *AgentBulkHandler) *gin.Engine { gin.SetMode(gin.TestMode) r := gin.New() r.Use(gin.Recovery()) r.POST("/api/v1/accounts/:account_id/agents/bulk_assign", handler.BulkAssign) r.POST("/api/v1/accounts/:account_id/agents/bulk_unassign", handler.BulkUnassign) return r } func TestAgentBulkHandler_BulkAssign_BadJSON(t *testing.T) { handler := NewAgentBulkHandler(&service.ConversationService{}) router := setupAgentBulkRouter(handler) w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/accounts/1/agents/bulk_assign", bytes.NewReader([]byte("invalid json"))) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestAgentBulkHandler_BulkAssign_EmptyConversationIDs(t *testing.T) { handler := NewAgentBulkHandler(&service.ConversationService{}) router := setupAgentBulkRouter(handler) body := map[string]interface{}{ "conversation_ids": []uint{}, "agent_id": 10, } b, _ := json.Marshal(body) w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/accounts/1/agents/bulk_assign", bytes.NewReader(b)) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestAgentBulkHandler_BulkAssign_MissingAgentID(t *testing.T) { handler := NewAgentBulkHandler(&service.ConversationService{}) router := setupAgentBulkRouter(handler) body := map[string]interface{}{ "conversation_ids": []uint{1, 2, 3}, } b, _ := json.Marshal(body) w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/accounts/1/agents/bulk_assign", bytes.NewReader(b)) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestAgentBulkHandler_BulkAssign_InvalidAccountID(t *testing.T) { handler := NewAgentBulkHandler(&service.ConversationService{}) router := setupAgentBulkRouter(handler) body := map[string]interface{}{ "conversation_ids": []uint{1, 2}, "agent_id": 10, } b, _ := json.Marshal(body) w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/accounts/abc/agents/bulk_assign", bytes.NewReader(b)) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestAgentBulkHandler_BulkUnassign_BadJSON(t *testing.T) { handler := NewAgentBulkHandler(&service.ConversationService{}) router := setupAgentBulkRouter(handler) w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/accounts/1/agents/bulk_unassign", bytes.NewReader([]byte("invalid json"))) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestAgentBulkHandler_BulkUnassign_EmptyConversationIDs(t *testing.T) { handler := NewAgentBulkHandler(&service.ConversationService{}) router := setupAgentBulkRouter(handler) body := map[string]interface{}{ "conversation_ids": []uint{}, } b, _ := json.Marshal(body) w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/accounts/1/agents/bulk_unassign", bytes.NewReader(b)) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestAgentBulkHandler_BulkUnassign_InvalidAccountID(t *testing.T) { handler := NewAgentBulkHandler(&service.ConversationService{}) router := setupAgentBulkRouter(handler) body := map[string]interface{}{ "conversation_ids": []uint{1, 2}, } b, _ := json.Marshal(body) w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/accounts/abc/agents/bulk_unassign", bytes.NewReader(b)) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) }