From 7b9131133c612f85a150c478782657aec6c37188 Mon Sep 17 00:00:00 2001 From: Elise Alix Date: Wed, 22 Apr 2026 16:46:42 -0400 Subject: [PATCH] feat(apple): expose given_name and family_name in user metadata --- internal/api/provider/apple.go | 2 + internal/api/provider/apple_test.go | 60 +++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 internal/api/provider/apple_test.go diff --git a/internal/api/provider/apple.go b/internal/api/provider/apple.go index 7d979a121c..3a858e23a3 100644 --- a/internal/api/provider/apple.go +++ b/internal/api/provider/apple.go @@ -175,5 +175,7 @@ func (p AppleProvider) ParseUser(data string, userData *UserProvidedData) error userData.Metadata.Name = strings.TrimSpace(u.Name.FirstName + " " + u.Name.LastName) userData.Metadata.FullName = strings.TrimSpace(u.Name.FirstName + " " + u.Name.LastName) + userData.Metadata.GivenName = u.Name.FirstName + userData.Metadata.FamilyName = u.Name.LastName return nil } diff --git a/internal/api/provider/apple_test.go b/internal/api/provider/apple_test.go new file mode 100644 index 0000000000..551198b925 --- /dev/null +++ b/internal/api/provider/apple_test.go @@ -0,0 +1,60 @@ +package provider + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestAppleProvider_ParseUser(t *testing.T) { + t.Run("populates all name fields when firstName and lastName present", func(t *testing.T) { + p := AppleProvider{} + userData := &UserProvidedData{Metadata: &Claims{}} + err := p.ParseUser(`{"name":{"firstName":"Test","lastName":"User"},"email":"test@example.com"}`, userData) + require.NoError(t, err) + require.Equal(t, "Test", userData.Metadata.GivenName) + require.Equal(t, "User", userData.Metadata.FamilyName) + require.Equal(t, "Test User", userData.Metadata.Name) + require.Equal(t, "Test User", userData.Metadata.FullName) + }) + + t.Run("populates given name only when lastName missing", func(t *testing.T) { + p := AppleProvider{} + userData := &UserProvidedData{Metadata: &Claims{}} + err := p.ParseUser(`{"name":{"firstName":"Cher"},"email":"cher@example.com"}`, userData) + require.NoError(t, err) + require.Equal(t, "Cher", userData.Metadata.GivenName) + require.Empty(t, userData.Metadata.FamilyName) + require.Equal(t, "Cher", userData.Metadata.Name) + require.Equal(t, "Cher", userData.Metadata.FullName) + }) + + t.Run("populates family name only when firstName missing", func(t *testing.T) { + p := AppleProvider{} + userData := &UserProvidedData{Metadata: &Claims{}} + err := p.ParseUser(`{"name":{"lastName":"User"},"email":"user@example.com"}`, userData) + require.NoError(t, err) + require.Empty(t, userData.Metadata.GivenName) + require.Equal(t, "User", userData.Metadata.FamilyName) + require.Equal(t, "User", userData.Metadata.Name) + require.Equal(t, "User", userData.Metadata.FullName) + }) + + t.Run("leaves name fields empty when name object absent", func(t *testing.T) { + p := AppleProvider{} + userData := &UserProvidedData{Metadata: &Claims{}} + err := p.ParseUser(`{"email":"anonymous@example.com"}`, userData) + require.NoError(t, err) + require.Empty(t, userData.Metadata.GivenName) + require.Empty(t, userData.Metadata.FamilyName) + require.Empty(t, userData.Metadata.Name) + require.Empty(t, userData.Metadata.FullName) + }) + + t.Run("returns error on invalid JSON", func(t *testing.T) { + p := AppleProvider{} + userData := &UserProvidedData{Metadata: &Claims{}} + err := p.ParseUser(`not-json`, userData) + require.Error(t, err) + }) +}