|
1 | | -import {normalizeAttendee, normalizeAttendees} from '@libs/AttendeeUtils'; |
| 1 | +import {enrichAndSortAttendees, normalizeAttendee, normalizeAttendees} from '@libs/AttendeeUtils'; |
| 2 | +import type {PersonalDetailsList} from '@src/types/onyx'; |
2 | 3 | import type {Attendee} from '@src/types/onyx/IOU'; |
3 | 4 |
|
4 | 5 | describe('AttendeeUtils', () => { |
@@ -71,4 +72,57 @@ describe('AttendeeUtils', () => { |
71 | 72 | ]); |
72 | 73 | }); |
73 | 74 | }); |
| 75 | + |
| 76 | + describe('enrichAndSortAttendees', () => { |
| 77 | + const localeCompare = (a: string, b: string) => a.localeCompare(b); |
| 78 | + |
| 79 | + it('returns input as-is when it is not an array', () => { |
| 80 | + expect(enrichAndSortAttendees(undefined, undefined, localeCompare)).toBeUndefined(); |
| 81 | + }); |
| 82 | + |
| 83 | + it('sorts alphabetically by stored displayName when no personalDetails are available', () => { |
| 84 | + const attendees: Attendee[] = [ |
| 85 | + {email: 'b@x.com', displayName: 'banana', avatarUrl: '', login: 'b@x.com'}, |
| 86 | + {email: 'a@x.com', displayName: 'apple', avatarUrl: '', login: 'a@x.com'}, |
| 87 | + ]; |
| 88 | + |
| 89 | + expect(enrichAndSortAttendees(attendees, undefined, localeCompare)?.map((a) => a.displayName)).toEqual(['apple', 'banana']); |
| 90 | + }); |
| 91 | + |
| 92 | + it('enriches displayName and avatar from personalDetails when accountID matches', () => { |
| 93 | + const attendees: Attendee[] = [{accountID: 1, displayName: 'Old', avatarUrl: 'old.png'} as Attendee]; |
| 94 | + const personalDetailsList = {1: {accountID: 1, displayName: 'New', avatar: 'new.png'}} as unknown as PersonalDetailsList; |
| 95 | + |
| 96 | + const result = enrichAndSortAttendees(attendees, personalDetailsList, localeCompare); |
| 97 | + |
| 98 | + expect(result?.[0].displayName).toBe('New'); |
| 99 | + expect(result?.[0].avatarUrl).toBe('new.png'); |
| 100 | + }); |
| 101 | + |
| 102 | + it('falls back to stored value when personalDetails has empty strings', () => { |
| 103 | + const attendees: Attendee[] = [{accountID: 1, displayName: 'Stored', avatarUrl: 'stored.png'} as Attendee]; |
| 104 | + const personalDetailsList = {1: {accountID: 1, displayName: '', avatar: ''}} as unknown as PersonalDetailsList; |
| 105 | + |
| 106 | + const result = enrichAndSortAttendees(attendees, personalDetailsList, localeCompare); |
| 107 | + |
| 108 | + expect(result?.[0].displayName).toBe('Stored'); |
| 109 | + expect(result?.[0].avatarUrl).toBe('stored.png'); |
| 110 | + }); |
| 111 | + |
| 112 | + it('sorts using enriched displayName so a profile rename moves the pill', () => { |
| 113 | + const attendees: Attendee[] = [{accountID: 1, displayName: 'alice', avatarUrl: ''} as Attendee, {accountID: 2, displayName: 'bob', avatarUrl: ''} as Attendee]; |
| 114 | + const personalDetailsList = {1: {accountID: 1, displayName: 'zoe'}} as unknown as PersonalDetailsList; |
| 115 | + |
| 116 | + expect(enrichAndSortAttendees(attendees, personalDetailsList, localeCompare)?.map((a) => a.displayName)).toEqual(['bob', 'zoe']); |
| 117 | + }); |
| 118 | + |
| 119 | + it('does not mutate the input array', () => { |
| 120 | + const attendees: Attendee[] = [{displayName: 'banana', avatarUrl: ''} as Attendee, {displayName: 'apple', avatarUrl: ''} as Attendee]; |
| 121 | + const snapshot = [...attendees]; |
| 122 | + |
| 123 | + enrichAndSortAttendees(attendees, undefined, localeCompare); |
| 124 | + |
| 125 | + expect(attendees).toEqual(snapshot); |
| 126 | + }); |
| 127 | + }); |
74 | 128 | }); |
0 commit comments