package v1 import ( "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" "github.com/gochat/gochat/internal/service" ) func setupDraftSearchRouter(handler *DraftMessageHandler) *gin.Engine { gin.SetMode(gin.TestMode) r := gin.New() r.Use(gin.Recovery()) r.GET("/api/v1/accounts/:account_id/draft_messages/search", handler.Search) r.GET("/api/v1/accounts/:account_id/draft_messages/count", handler.Count) return r } // --- Search tests --- func TestDraftMessageHandler_Search_InvalidAccountID(t *testing.T) { handler := NewDraftMessageHandler(&service.DraftMessageService{}) router := setupDraftSearchRouter(handler) w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/api/v1/accounts/abc/draft_messages/search?q=test", nil) router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestDraftMessageHandler_Search_EmptyQuery(t *testing.T) { handler := NewDraftMessageHandler(&service.DraftMessageService{}) router := setupDraftSearchRouter(handler) w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/api/v1/accounts/1/draft_messages/search", nil) router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestDraftMessageHandler_Search_QueryMissing(t *testing.T) { handler := NewDraftMessageHandler(&service.DraftMessageService{}) router := setupDraftSearchRouter(handler) w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/api/v1/accounts/1/draft_messages/search?q=", nil) router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestDraftMessageHandler_Search_ValidQuery_ZeroService(t *testing.T) { handler := NewDraftMessageHandler(&service.DraftMessageService{}) router := setupDraftSearchRouter(handler) w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/api/v1/accounts/1/draft_messages/search?q=hello", nil) router.ServeHTTP(w, req) // Zero service will panic; Recovery middleware catches → 500 assert.True(t, w.Code == http.StatusUnprocessableEntity || w.Code == http.StatusOK) } // --- Count tests --- func TestDraftMessageHandler_Count_InvalidAccountID(t *testing.T) { handler := NewDraftMessageHandler(&service.DraftMessageService{}) router := setupDraftSearchRouter(handler) w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/api/v1/accounts/abc/draft_messages/count", nil) router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestDraftMessageHandler_Count_ValidAccountID_ZeroService(t *testing.T) { handler := NewDraftMessageHandler(&service.DraftMessageService{}) router := setupDraftSearchRouter(handler) w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/api/v1/accounts/1/draft_messages/count", nil) router.ServeHTTP(w, req) // Zero service will panic; Recovery middleware catches → 500 assert.True(t, w.Code == http.StatusUnprocessableEntity || w.Code == http.StatusOK) }