From 6bd45c0d79ce0f93d1e04752a5245fc99cbb3082 Mon Sep 17 00:00:00 2001 From: lorretheboy Date: Wed, 25 Mar 2026 00:51:39 +0700 Subject: [PATCH 1/2] fix: swapping issue in getFormattedAttendees --- src/libs/ModifiedExpenseMessage.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/ModifiedExpenseMessage.ts b/src/libs/ModifiedExpenseMessage.ts index 63a7c061aa7d..fec6310808d2 100644 --- a/src/libs/ModifiedExpenseMessage.ts +++ b/src/libs/ModifiedExpenseMessage.ts @@ -451,8 +451,8 @@ function getForReportAction({ const hasModifiedAttendees = isReportActionOriginalMessageAnObject && 'oldAttendees' in reportActionOriginalMessage && 'newAttendees' in reportActionOriginalMessage; if (hasModifiedAttendees) { - const [oldAttendees, attendees] = getFormattedAttendees(reportActionOriginalMessage.newAttendees, reportActionOriginalMessage.oldAttendees); - buildMessageFragmentForValue(translate, oldAttendees, attendees, translate('iou.attendees'), false, setFragments, removalFragments, changeFragments); + const [oldAttendees, newAttendees] = getFormattedAttendees(reportActionOriginalMessage.oldAttendees, reportActionOriginalMessage.newAttendees); + buildMessageFragmentForValue(translate, newAttendees, oldAttendees, translate('iou.attendees'), false, setFragments, removalFragments, changeFragments); } const hasPersonalRulesModifiedFields = isReportActionOriginalMessageAnObject && 'personalRulesModifiedFields' in reportActionOriginalMessage; From fcc0fff1d226aaf124774c2662c2775c7b654e8f Mon Sep 17 00:00:00 2001 From: lorretheboy Date: Thu, 26 Mar 2026 15:26:55 +0700 Subject: [PATCH 2/2] chore: added test --- tests/unit/ModifiedExpenseMessageTest.ts | 65 ++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/tests/unit/ModifiedExpenseMessageTest.ts b/tests/unit/ModifiedExpenseMessageTest.ts index 15ce68ddcbae..81699b1eaaca 100644 --- a/tests/unit/ModifiedExpenseMessageTest.ts +++ b/tests/unit/ModifiedExpenseMessageTest.ts @@ -1395,5 +1395,70 @@ describe('ModifiedExpenseMessage', () => { expect(result).toEqual(expectedResult); }); }); + + describe('when attendees are changed', () => { + it('returns the correct message with old and new attendees in the right order', () => { + const reportAction = { + ...createRandomReportAction(1), + actionName: CONST.REPORT.ACTIONS.TYPE.MODIFIED_EXPENSE, + originalMessage: { + oldAttendees: [{email: 'alice@example.com', displayName: 'Alice', avatarUrl: ''}], + newAttendees: [ + {email: 'alice@example.com', displayName: 'Alice', avatarUrl: ''}, + {email: 'bob@example.com', displayName: 'Bob', avatarUrl: ''}, + ], + }, + }; + + const result = getForReportAction({ + translate: translateLocal, + reportAction, + policyTags: undefined, + currentUserLogin: 'test@example.com', + }); + + expect(result).toEqual('changed the attendees to Alice, Bob (previously Alice)'); + }); + + it('returns "set" message when attendees are added from empty', () => { + const reportAction = { + ...createRandomReportAction(1), + actionName: CONST.REPORT.ACTIONS.TYPE.MODIFIED_EXPENSE, + originalMessage: { + oldAttendees: [], + newAttendees: [{email: 'alice@example.com', displayName: 'Alice', avatarUrl: ''}], + }, + }; + + const result = getForReportAction({ + translate: translateLocal, + reportAction, + policyTags: undefined, + currentUserLogin: 'test@example.com', + }); + + expect(result).toEqual('set the attendees to Alice'); + }); + + it('returns "removed" message when attendees are cleared', () => { + const reportAction = { + ...createRandomReportAction(1), + actionName: CONST.REPORT.ACTIONS.TYPE.MODIFIED_EXPENSE, + originalMessage: { + oldAttendees: [{email: 'alice@example.com', displayName: 'Alice', avatarUrl: ''}], + newAttendees: [], + }, + }; + + const result = getForReportAction({ + translate: translateLocal, + reportAction, + policyTags: undefined, + currentUserLogin: 'test@example.com', + }); + + expect(result).toEqual('removed the attendees (previously Alice)'); + }); + }); }); });