identity_service_order_test.go 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package service
  2. import (
  3. "context"
  4. "strings"
  5. "testing"
  6. "github.com/stretchr/testify/require"
  7. )
  8. type identityCacheStub struct {
  9. maskedSessionID string
  10. }
  11. func (s *identityCacheStub) GetFingerprint(_ context.Context, _ int64) (*Fingerprint, error) {
  12. return nil, nil
  13. }
  14. func (s *identityCacheStub) SetFingerprint(_ context.Context, _ int64, _ *Fingerprint) error {
  15. return nil
  16. }
  17. func (s *identityCacheStub) GetMaskedSessionID(_ context.Context, _ int64) (string, error) {
  18. return s.maskedSessionID, nil
  19. }
  20. func (s *identityCacheStub) SetMaskedSessionID(_ context.Context, _ int64, sessionID string) error {
  21. s.maskedSessionID = sessionID
  22. return nil
  23. }
  24. func TestIdentityService_RewriteUserID_PreservesTopLevelFieldOrder(t *testing.T) {
  25. cache := &identityCacheStub{}
  26. svc := NewIdentityService(cache)
  27. originalUserID := FormatMetadataUserID(
  28. "d61f76d0730d2b920763648949bad5c79742155c27037fc77ac3f9805cb90169",
  29. "",
  30. "7578cf37-aaca-46e4-a45c-71285d9dbb83",
  31. "2.1.78",
  32. )
  33. body := []byte(`{"alpha":1,"messages":[],"metadata":{"user_id":` + strconvQuote(originalUserID) + `},"max_tokens":64000,"thinking":{"type":"adaptive"},"output_config":{"effort":"high"},"stream":true}`)
  34. result, err := svc.RewriteUserID(body, 123, "acc-uuid", "client-xyz", "claude-cli/2.1.78 (external, cli)")
  35. require.NoError(t, err)
  36. resultStr := string(result)
  37. assertJSONTokenOrder(t, resultStr, `"alpha"`, `"messages"`, `"metadata"`, `"max_tokens"`, `"thinking"`, `"output_config"`, `"stream"`)
  38. require.NotContains(t, resultStr, originalUserID)
  39. require.Contains(t, resultStr, `"metadata":{"user_id":"`)
  40. }
  41. func TestIdentityService_RewriteUserIDWithMasking_PreservesTopLevelFieldOrder(t *testing.T) {
  42. cache := &identityCacheStub{maskedSessionID: "11111111-2222-4333-8444-555555555555"}
  43. svc := NewIdentityService(cache)
  44. originalUserID := FormatMetadataUserID(
  45. "d61f76d0730d2b920763648949bad5c79742155c27037fc77ac3f9805cb90169",
  46. "",
  47. "7578cf37-aaca-46e4-a45c-71285d9dbb83",
  48. "2.1.78",
  49. )
  50. body := []byte(`{"alpha":1,"messages":[],"metadata":{"user_id":` + strconvQuote(originalUserID) + `},"max_tokens":64000,"thinking":{"type":"adaptive"},"output_config":{"effort":"high"},"stream":true}`)
  51. account := &Account{
  52. ID: 123,
  53. Platform: PlatformAnthropic,
  54. Type: AccountTypeOAuth,
  55. Extra: map[string]any{
  56. "session_id_masking_enabled": true,
  57. },
  58. }
  59. result, err := svc.RewriteUserIDWithMasking(context.Background(), body, account, "acc-uuid", "client-xyz", "claude-cli/2.1.78 (external, cli)")
  60. require.NoError(t, err)
  61. resultStr := string(result)
  62. assertJSONTokenOrder(t, resultStr, `"alpha"`, `"messages"`, `"metadata"`, `"max_tokens"`, `"thinking"`, `"output_config"`, `"stream"`)
  63. require.Contains(t, resultStr, cache.maskedSessionID)
  64. require.True(t, strings.Contains(resultStr, `"metadata":{"user_id":"`))
  65. }
  66. func strconvQuote(v string) string {
  67. return `"` + strings.ReplaceAll(strings.ReplaceAll(v, `\`, `\\`), `"`, `\"`) + `"`
  68. }