package ws import ( "net/http/httptest" "testing" "github.com/gin-gonic/gin" "github.com/gochat/gochat/internal/auth" "github.com/gochat/gochat/internal/config" "github.com/gochat/gochat/internal/model" "github.com/stretchr/testify/require" "gorm.io/driver/sqlite" "gorm.io/gorm" ) func TestWSAuthenticatorRejectsInactiveAndRevokedSessions(t *testing.T) { db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=private"), &gorm.Config{}) require.NoError(t, err) require.NoError(t, db.AutoMigrate(&model.User{}, &model.UserSession{})) user := &model.User{Name: "Agent", Email: "agent@example.com", Provider: "email", Active: true} require.NoError(t, db.Create(user).Error) require.NoError(t, db.Create(&model.UserSession{UserID: user.ID, ClientID: "browser"}).Error) jwtService := auth.NewJWTService(&config.JWTConfig{Secret: "ws-test", ExpiryHours: 1, RefreshExpiryHours: 24}) pair, err := jwtService.GenerateTokenPairForClient(user, 1, "agent", "browser") require.NoError(t, err) authenticator := NewWSAuthenticator(jwtService, nil, db) authenticate := func() error { c, _ := gin.CreateTestContext(httptest.NewRecorder()) c.Request = httptest.NewRequest("GET", "/ws?token="+pair.AccessToken, nil) _, err := authenticator.Authenticate(c) return err } require.NoError(t, authenticate()) require.NoError(t, db.Model(user).Update("active", false).Error) require.ErrorContains(t, authenticate(), "inactive") require.NoError(t, db.Model(user).Update("active", true).Error) require.NoError(t, db.Where("user_id = ?", user.ID).Delete(&model.UserSession{}).Error) require.ErrorContains(t, authenticate(), "session revoked") }