package v1 import ( "encoding/json" "net/http" "net/http/httptest" "strings" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" "github.com/gochat/gochat/internal/service" ) func setupInboxMemberRouter(handler *InboxMemberHandler) *gin.Engine { gin.SetMode(gin.TestMode) router := gin.New() router.GET("/api/v1/accounts/:account_id/inboxes/:inbox_id/members", handler.ListMembers) router.POST("/api/v1/accounts/:account_id/inboxes/:inbox_id/members", handler.AddMember) router.PUT("/api/v1/accounts/:account_id/inboxes/:inbox_id/members/:user_id", handler.UpdateMember) router.DELETE("/api/v1/accounts/:account_id/inboxes/:inbox_id/members/:user_id", handler.RemoveMember) return router } func TestInboxMemberListBadInboxID(t *testing.T) { handler := NewInboxMemberHandler(&service.InboxMemberService{}) router := setupInboxMemberRouter(handler) w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/api/v1/accounts/1/inboxes/abc/members", nil) router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) var resp map[string]interface{} json.Unmarshal(w.Body.Bytes(), &resp) assert.Contains(t, resp, "error") } func TestInboxMemberAddBadInboxID(t *testing.T) { handler := NewInboxMemberHandler(&service.InboxMemberService{}) router := setupInboxMemberRouter(handler) body := `{"user_id": 1}` w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/accounts/1/inboxes/abc/members", strings.NewReader(body)) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestInboxMemberAddMissingUserID(t *testing.T) { handler := NewInboxMemberHandler(&service.InboxMemberService{}) router := setupInboxMemberRouter(handler) body := `{}` w := httptest.NewRecorder() req, _ := http.NewRequest("POST", "/api/v1/accounts/1/inboxes/1/members", strings.NewReader(body)) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req) // Should get a 400 for missing required user_id assert.Equal(t, http.StatusBadRequest, w.Code) } func TestInboxMemberUpdateBadInboxID(t *testing.T) { handler := NewInboxMemberHandler(&service.InboxMemberService{}) router := setupInboxMemberRouter(handler) body := `{"availability_status": "online"}` w := httptest.NewRecorder() req, _ := http.NewRequest("PUT", "/api/v1/accounts/1/inboxes/abc/members/1", strings.NewReader(body)) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestInboxMemberUpdateBadUserID(t *testing.T) { handler := NewInboxMemberHandler(&service.InboxMemberService{}) router := setupInboxMemberRouter(handler) body := `{"availability_status": "online"}` w := httptest.NewRecorder() req, _ := http.NewRequest("PUT", "/api/v1/accounts/1/inboxes/1/members/abc", strings.NewReader(body)) req.Header.Set("Content-Type", "application/json") router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestInboxMemberRemoveBadInboxID(t *testing.T) { handler := NewInboxMemberHandler(&service.InboxMemberService{}) router := setupInboxMemberRouter(handler) w := httptest.NewRecorder() req, _ := http.NewRequest("DELETE", "/api/v1/accounts/1/inboxes/abc/members/1", nil) router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) } func TestInboxMemberRemoveBadUserID(t *testing.T) { handler := NewInboxMemberHandler(&service.InboxMemberService{}) router := setupInboxMemberRouter(handler) w := httptest.NewRecorder() req, _ := http.NewRequest("DELETE", "/api/v1/accounts/1/inboxes/1/members/abc", nil) router.ServeHTTP(w, req) assert.Equal(t, http.StatusBadRequest, w.Code) }