package service import ( "regexp" "testing" "github.com/stretchr/testify/require" ) func TestBuildOAuthMetadataUserID_FallbackWithoutAccountUUID(t *testing.T) { svc := &GatewayService{} parsed := &ParsedRequest{ Model: "claude-sonnet-4-5", Stream: true, MetadataUserID: "", System: nil, Messages: nil, } account := &Account{ ID: 123, Type: AccountTypeOAuth, Extra: map[string]any{}, // intentionally missing account_uuid / claude_user_id } fp := &Fingerprint{ClientID: "deadbeef"} // should be used as user id in legacy format got := svc.buildOAuthMetadataUserID(parsed, account, fp) require.NotEmpty(t, got) // Legacy format: user_{client}_account__session_{uuid} re := regexp.MustCompile(`^user_[a-zA-Z0-9]+_account__session_[a-f0-9-]{36}$`) require.True(t, re.MatchString(got), "unexpected user_id format: %s", got) } func TestBuildOAuthMetadataUserID_UsesAccountUUIDWhenPresent(t *testing.T) { svc := &GatewayService{} parsed := &ParsedRequest{ Model: "claude-sonnet-4-5", Stream: true, MetadataUserID: "", } account := &Account{ ID: 123, Type: AccountTypeOAuth, Extra: map[string]any{ "account_uuid": "acc-uuid", "claude_user_id": "clientid123", "anthropic_user_id": "", }, } got := svc.buildOAuthMetadataUserID(parsed, account, nil) require.NotEmpty(t, got) // New format: user_{client}_account_{account_uuid}_session_{uuid} re := regexp.MustCompile(`^user_clientid123_account_acc-uuid_session_[a-f0-9-]{36}$`) require.True(t, re.MatchString(got), "unexpected user_id format: %s", got) }