package middleware import ( "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" "github.com/gochat/gochat/internal/auth" ) func TestPolicyMiddleware_NoContext(t *testing.T) { gin.SetMode(gin.TestMode) r := gin.New() r.Use(PolicyMiddleware("conversation", "read")) r.GET("/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) }) w := httptest.NewRecorder() req := httptest.NewRequest(http.MethodGet, "/test", nil) r.ServeHTTP(w, req) assert.Equal(t, 403, w.Code) } func TestPolicyMiddleware_InvalidContextType(t *testing.T) { gin.SetMode(gin.TestMode) r := gin.New() r.Use(func(c *gin.Context) { c.Set("policy_context", "not-a-context"); c.Next() }) r.Use(PolicyMiddleware("conversation", "read")) r.GET("/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) }) w := httptest.NewRecorder() req := httptest.NewRequest(http.MethodGet, "/test", nil) r.ServeHTTP(w, req) assert.Equal(t, 403, w.Code) } func TestPolicyMiddleware_AdministratorCan(t *testing.T) { gin.SetMode(gin.TestMode) r := gin.New() r.Use(func(c *gin.Context) { c.Set("policy_context", auth.NewPolicyContext(1, 1, "administrator", 0, nil)); c.Next() }) r.Use(PolicyMiddleware("conversation", "read")) r.GET("/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) }) w := httptest.NewRecorder() req := httptest.NewRequest(http.MethodGet, "/test", nil) r.ServeHTTP(w, req) assert.Equal(t, 200, w.Code) } func TestPolicyMiddleware_AgentCannotDelete(t *testing.T) { gin.SetMode(gin.TestMode) r := gin.New() r.Use(func(c *gin.Context) { c.Set("policy_context", auth.NewPolicyContext(1, 1, "agent", 0, nil)); c.Next() }) r.Use(PolicyMiddleware("conversation", "delete")) r.GET("/test", func(c *gin.Context) { c.JSON(200, gin.H{"ok": true}) }) w := httptest.NewRecorder() req := httptest.NewRequest(http.MethodGet, "/test", nil) r.ServeHTTP(w, req) assert.Equal(t, 403, w.Code) }