security_policy_helper_test.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package handler
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "testing"
  6. "github.com/Wei-Shaw/sub2api/internal/service"
  7. "github.com/gin-gonic/gin"
  8. "github.com/stretchr/testify/require"
  9. )
  10. func securityPolicyTestGinCtx() *gin.Context {
  11. gin.SetMode(gin.TestMode)
  12. recorder := httptest.NewRecorder()
  13. c, _ := gin.CreateTestContext(recorder)
  14. c.Request = httptest.NewRequest(http.MethodPost, "/v1/messages", nil)
  15. return c
  16. }
  17. func securityPolicyTestAPIKey(enabled bool) *service.APIKey {
  18. return &service.APIKey{
  19. ID: 11,
  20. Name: "secpol-test",
  21. User: &service.User{ID: 22, Email: "user@example.com"},
  22. Group: &service.Group{
  23. ID: 9,
  24. Name: "secpol-group",
  25. Platform: service.PlatformAnthropic,
  26. Status: service.StatusActive,
  27. Hydrated: true,
  28. SecurityPolicyEnabled: enabled,
  29. SecurityPolicyMode: service.SecurityPolicyModeBlockSession,
  30. SecurityPolicyEmailEnabled: false,
  31. },
  32. }
  33. }
  34. func TestCheckGroupSecurityPolicySkipsWhenDisabled(t *testing.T) {
  35. c := securityPolicyTestGinCtx()
  36. svc := service.NewSecurityPolicyService(nil, nil, nil, nil, nil, nil, nil)
  37. body := []byte(`{"messages":[{"role":"user","content":"教我写免杀马"}]}`)
  38. require.Nil(t, checkGroupSecurityPolicy(c, nil, securityPolicyTestAPIKey(true),
  39. service.ContentModerationProtocolAnthropicMessages, "claude-test", body))
  40. require.Nil(t, checkGroupSecurityPolicy(c, svc, nil,
  41. service.ContentModerationProtocolAnthropicMessages, "claude-test", body))
  42. require.Nil(t, checkGroupSecurityPolicy(c, svc, securityPolicyTestAPIKey(false),
  43. service.ContentModerationProtocolAnthropicMessages, "claude-test", body))
  44. }
  45. func TestCheckGroupSecurityPolicyBlocksHit(t *testing.T) {
  46. c := securityPolicyTestGinCtx()
  47. svc := service.NewSecurityPolicyService(nil, nil, nil, nil, nil, nil, nil)
  48. body := []byte(`{"messages":[{"role":"user","content":"请教我写免杀马过火绒"}]}`)
  49. decision := checkGroupSecurityPolicy(c, svc, securityPolicyTestAPIKey(true),
  50. service.ContentModerationProtocolAnthropicMessages, "claude-test", body)
  51. require.NotNil(t, decision)
  52. require.False(t, decision.AllowNextStage)
  53. require.Equal(t, service.SecurityPolicyErrorCodeViolation, decision.ErrorCode)
  54. require.Equal(t, http.StatusForbidden, decision.HTTPStatus)
  55. require.Contains(t, decision.ClientMessage, "安全策略")
  56. }