From 9022cf4cdcbc436156a392cbb6c1667bc55c89db Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Tue, 27 Jan 2026 20:49:01 +0500 Subject: [PATCH 1/3] test: Add IOURequestStepScan multi-scan mode tests --- tests/ui/IOURequestStepScanTest.tsx | 178 ++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 tests/ui/IOURequestStepScanTest.tsx diff --git a/tests/ui/IOURequestStepScanTest.tsx b/tests/ui/IOURequestStepScanTest.tsx new file mode 100644 index 000000000000..081960c1572d --- /dev/null +++ b/tests/ui/IOURequestStepScanTest.tsx @@ -0,0 +1,178 @@ +import Onyx from 'react-native-onyx'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; +import type {Transaction} from '@src/types/onyx'; +import * as TransactionUtils from '@libs/TransactionUtils'; +import createRandomTransaction from '../utils/collections/transaction'; +import waitForBatchedUpdatesWithAct from '../utils/waitForBatchedUpdatesWithAct'; + +describe('IOURequestStepScan', () => { + beforeAll(() => { + Onyx.init({ + keys: ONYXKEYS, + }); + }); + + beforeEach(async () => { + jest.clearAllMocks(); + await Onyx.clear(); + await waitForBatchedUpdatesWithAct(); + }); + + afterEach(async () => { + await Onyx.clear(); + jest.clearAllMocks(); + }); + + describe('Receipt and Draft State Management', () => { + it('should preserve multiple draft transactions when processing new receipts', async () => { + const transaction1 = createRandomTransaction(1); + transaction1.receipt = {source: 'file://receipt1.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + + const transaction2 = createRandomTransaction(2); + transaction2.receipt = {source: 'file://receipt2.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); + await waitForBatchedUpdatesWithAct(); + + const tx1Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, + }); + }); + + const tx2Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, + }); + }); + + expect(tx1Data?.transactionID).toBe(transaction1.transactionID); + expect(tx1Data?.receipt?.source).toBe('file://receipt1.png'); + expect(tx2Data?.transactionID).toBe(transaction2.transactionID); + expect(tx2Data?.receipt?.source).toBe('file://receipt2.png'); + }); + + it('should not lose draft transactions when updating one receipt', async () => { + const transaction1 = createRandomTransaction(1); + transaction1.receipt = {source: 'file://receipt1.png'}; + + const transaction2 = createRandomTransaction(2); + transaction2.receipt = {source: 'file://receipt2.png'}; + + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); + await waitForBatchedUpdatesWithAct(); + + const updatedTransaction1 = {...transaction1, receipt: {source: 'file://receipt1-updated.png'}}; + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, updatedTransaction1); + await waitForBatchedUpdatesWithAct(); + + const tx1Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, + }); + }); + + const tx2Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, + }); + }); + + expect(tx2Data?.transactionID).toBe(transaction2.transactionID); + expect(tx2Data?.receipt?.source).toBe('file://receipt2.png'); + expect(tx1Data?.transactionID).toBe(transaction1.transactionID); + expect(tx1Data?.receipt?.source).toBe('file://receipt1-updated.png'); + }); + + it('replacing receipt in multi-scan does not clear other drafts', async () => { + const transaction1 = createRandomTransaction(1); + transaction1.receipt = {source: 'file://receipt1.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + + const transaction2 = createRandomTransaction(2); + transaction2.receipt = {source: 'file://receipt2.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); + await waitForBatchedUpdatesWithAct(); + + const transactions = [transaction1, transaction2]; + const shouldReuse = TransactionUtils.shouldReuseInitialTransaction(transaction1, true, 0, true, transactions); + + expect(shouldReuse).toBe(false); + + const tx2Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, + }); + }); + + expect(tx2Data?.transactionID).toBe(transaction2.transactionID); + expect(tx2Data?.receipt?.source).toBe('file://receipt2.png'); + }); + + it('multi-scan mode preserves receipts when adding new ones', async () => { + const initialTx = createRandomTransaction(0); + initialTx.receipt = {source: 'file://initial-receipt.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${initialTx.transactionID}`, initialTx); + await waitForBatchedUpdatesWithAct(); + + const secondTx = createRandomTransaction(1); + secondTx.receipt = {source: 'file://second-receipt.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + + const transactions = [initialTx]; + const shouldReuseForSecondFile = TransactionUtils.shouldReuseInitialTransaction(initialTx, true, 1, true, transactions); + + expect(shouldReuseForSecondFile).toBe(false); + + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${secondTx.transactionID}`, secondTx); + await waitForBatchedUpdatesWithAct(); + + const tx1Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${initialTx.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, + }); + }); + + const tx2Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${secondTx.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, + }); + }); + + expect(tx1Data?.receipt?.source).toBe('file://initial-receipt.png'); + expect(tx2Data?.receipt?.source).toBe('file://second-receipt.png'); + }); + }); +}); From 03ce5c3b121252791b706855c1b51cd7aad0d476 Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Tue, 27 Jan 2026 21:24:34 +0500 Subject: [PATCH 2/3] fix: switch to waitForBatchedUpdates in UI tests since no component is rendered --- tests/ui/IOURequestStepScanTest.tsx | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/ui/IOURequestStepScanTest.tsx b/tests/ui/IOURequestStepScanTest.tsx index 081960c1572d..1ee0fdb293f0 100644 --- a/tests/ui/IOURequestStepScanTest.tsx +++ b/tests/ui/IOURequestStepScanTest.tsx @@ -1,10 +1,10 @@ import Onyx from 'react-native-onyx'; +import {shouldReuseInitialTransaction} from '@libs/TransactionUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {Transaction} from '@src/types/onyx'; -import * as TransactionUtils from '@libs/TransactionUtils'; import createRandomTransaction from '../utils/collections/transaction'; -import waitForBatchedUpdatesWithAct from '../utils/waitForBatchedUpdatesWithAct'; +import waitForBatchedUpdates from '../utils/waitForBatchedUpdates'; describe('IOURequestStepScan', () => { beforeAll(() => { @@ -16,7 +16,7 @@ describe('IOURequestStepScan', () => { beforeEach(async () => { jest.clearAllMocks(); await Onyx.clear(); - await waitForBatchedUpdatesWithAct(); + await waitForBatchedUpdates(); }); afterEach(async () => { @@ -34,7 +34,7 @@ describe('IOURequestStepScan', () => { await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); - await waitForBatchedUpdatesWithAct(); + await waitForBatchedUpdates(); const tx1Data = await new Promise((resolve) => { const connection = Onyx.connect({ @@ -71,11 +71,11 @@ describe('IOURequestStepScan', () => { await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); - await waitForBatchedUpdatesWithAct(); + await waitForBatchedUpdates(); const updatedTransaction1 = {...transaction1, receipt: {source: 'file://receipt1-updated.png'}}; await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, updatedTransaction1); - await waitForBatchedUpdatesWithAct(); + await waitForBatchedUpdates(); const tx1Data = await new Promise((resolve) => { const connection = Onyx.connect({ @@ -112,10 +112,10 @@ describe('IOURequestStepScan', () => { await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); - await waitForBatchedUpdatesWithAct(); + await waitForBatchedUpdates(); const transactions = [transaction1, transaction2]; - const shouldReuse = TransactionUtils.shouldReuseInitialTransaction(transaction1, true, 0, true, transactions); + const shouldReuse = shouldReuseInitialTransaction(transaction1, true, 0, true, transactions); expect(shouldReuse).toBe(false); @@ -138,18 +138,18 @@ describe('IOURequestStepScan', () => { initialTx.receipt = {source: 'file://initial-receipt.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${initialTx.transactionID}`, initialTx); - await waitForBatchedUpdatesWithAct(); + await waitForBatchedUpdates(); const secondTx = createRandomTransaction(1); secondTx.receipt = {source: 'file://second-receipt.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; const transactions = [initialTx]; - const shouldReuseForSecondFile = TransactionUtils.shouldReuseInitialTransaction(initialTx, true, 1, true, transactions); + const shouldReuseForSecondFile = shouldReuseInitialTransaction(initialTx, true, 1, true, transactions); expect(shouldReuseForSecondFile).toBe(false); await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${secondTx.transactionID}`, secondTx); - await waitForBatchedUpdatesWithAct(); + await waitForBatchedUpdates(); const tx1Data = await new Promise((resolve) => { const connection = Onyx.connect({ From 10af483e3c1630a2a557b9995a3da14db43c3f2f Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Tue, 27 Jan 2026 23:34:56 +0500 Subject: [PATCH 3/3] fix: test by removing nested describe block --- tests/ui/IOURequestStepScanTest.tsx | 242 ++++++++++++++-------------- 1 file changed, 120 insertions(+), 122 deletions(-) diff --git a/tests/ui/IOURequestStepScanTest.tsx b/tests/ui/IOURequestStepScanTest.tsx index 1ee0fdb293f0..8dc4d8775991 100644 --- a/tests/ui/IOURequestStepScanTest.tsx +++ b/tests/ui/IOURequestStepScanTest.tsx @@ -24,155 +24,153 @@ describe('IOURequestStepScan', () => { jest.clearAllMocks(); }); - describe('Receipt and Draft State Management', () => { - it('should preserve multiple draft transactions when processing new receipts', async () => { - const transaction1 = createRandomTransaction(1); - transaction1.receipt = {source: 'file://receipt1.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; - - const transaction2 = createRandomTransaction(2); - transaction2.receipt = {source: 'file://receipt2.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; - - await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); - await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); - await waitForBatchedUpdates(); - - const tx1Data = await new Promise((resolve) => { - const connection = Onyx.connect({ - key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, - callback: (val) => { - resolve(val); - Onyx.disconnect(connection); - }, - }); - }); + it('should preserve multiple draft transactions when processing new receipts', async () => { + const transaction1 = createRandomTransaction(1); + transaction1.receipt = {source: 'file://receipt1.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; - const tx2Data = await new Promise((resolve) => { - const connection = Onyx.connect({ - key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, - callback: (val) => { - resolve(val); - Onyx.disconnect(connection); - }, - }); - }); + const transaction2 = createRandomTransaction(2); + transaction2.receipt = {source: 'file://receipt2.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; - expect(tx1Data?.transactionID).toBe(transaction1.transactionID); - expect(tx1Data?.receipt?.source).toBe('file://receipt1.png'); - expect(tx2Data?.transactionID).toBe(transaction2.transactionID); - expect(tx2Data?.receipt?.source).toBe('file://receipt2.png'); - }); + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); + await waitForBatchedUpdates(); - it('should not lose draft transactions when updating one receipt', async () => { - const transaction1 = createRandomTransaction(1); - transaction1.receipt = {source: 'file://receipt1.png'}; - - const transaction2 = createRandomTransaction(2); - transaction2.receipt = {source: 'file://receipt2.png'}; - - await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); - await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); - await waitForBatchedUpdates(); - - const updatedTransaction1 = {...transaction1, receipt: {source: 'file://receipt1-updated.png'}}; - await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, updatedTransaction1); - await waitForBatchedUpdates(); - - const tx1Data = await new Promise((resolve) => { - const connection = Onyx.connect({ - key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, - callback: (val) => { - resolve(val); - Onyx.disconnect(connection); - }, - }); + const tx1Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, }); + }); - const tx2Data = await new Promise((resolve) => { - const connection = Onyx.connect({ - key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, - callback: (val) => { - resolve(val); - Onyx.disconnect(connection); - }, - }); + const tx2Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, }); - - expect(tx2Data?.transactionID).toBe(transaction2.transactionID); - expect(tx2Data?.receipt?.source).toBe('file://receipt2.png'); - expect(tx1Data?.transactionID).toBe(transaction1.transactionID); - expect(tx1Data?.receipt?.source).toBe('file://receipt1-updated.png'); }); - it('replacing receipt in multi-scan does not clear other drafts', async () => { - const transaction1 = createRandomTransaction(1); - transaction1.receipt = {source: 'file://receipt1.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + expect(tx1Data?.transactionID).toBe(transaction1.transactionID); + expect(tx1Data?.receipt?.source).toBe('file://receipt1.png'); + expect(tx2Data?.transactionID).toBe(transaction2.transactionID); + expect(tx2Data?.receipt?.source).toBe('file://receipt2.png'); + }); - const transaction2 = createRandomTransaction(2); - transaction2.receipt = {source: 'file://receipt2.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + it('should not lose draft transactions when updating one receipt', async () => { + const transaction1 = createRandomTransaction(1); + transaction1.receipt = {source: 'file://receipt1.png'}; - await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); - await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); - await waitForBatchedUpdates(); + const transaction2 = createRandomTransaction(2); + transaction2.receipt = {source: 'file://receipt2.png'}; - const transactions = [transaction1, transaction2]; - const shouldReuse = shouldReuseInitialTransaction(transaction1, true, 0, true, transactions); + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); + await waitForBatchedUpdates(); - expect(shouldReuse).toBe(false); + const updatedTransaction1 = {...transaction1, receipt: {source: 'file://receipt1-updated.png'}}; + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, updatedTransaction1); + await waitForBatchedUpdates(); - const tx2Data = await new Promise((resolve) => { - const connection = Onyx.connect({ - key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, - callback: (val) => { - resolve(val); - Onyx.disconnect(connection); - }, - }); + const tx1Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, }); + }); - expect(tx2Data?.transactionID).toBe(transaction2.transactionID); - expect(tx2Data?.receipt?.source).toBe('file://receipt2.png'); + const tx2Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, + }); }); - it('multi-scan mode preserves receipts when adding new ones', async () => { - const initialTx = createRandomTransaction(0); - initialTx.receipt = {source: 'file://initial-receipt.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + expect(tx2Data?.transactionID).toBe(transaction2.transactionID); + expect(tx2Data?.receipt?.source).toBe('file://receipt2.png'); + expect(tx1Data?.transactionID).toBe(transaction1.transactionID); + expect(tx1Data?.receipt?.source).toBe('file://receipt1-updated.png'); + }); - await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${initialTx.transactionID}`, initialTx); - await waitForBatchedUpdates(); + it('replacing receipt in multi-scan does not clear other drafts', async () => { + const transaction1 = createRandomTransaction(1); + transaction1.receipt = {source: 'file://receipt1.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; - const secondTx = createRandomTransaction(1); - secondTx.receipt = {source: 'file://second-receipt.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + const transaction2 = createRandomTransaction(2); + transaction2.receipt = {source: 'file://receipt2.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; - const transactions = [initialTx]; - const shouldReuseForSecondFile = shouldReuseInitialTransaction(initialTx, true, 1, true, transactions); + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction1.transactionID}`, transaction1); + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, transaction2); + await waitForBatchedUpdates(); - expect(shouldReuseForSecondFile).toBe(false); + const transactions = [transaction1, transaction2]; + const shouldReuse = shouldReuseInitialTransaction(transaction1, true, 0, true, transactions); - await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${secondTx.transactionID}`, secondTx); - await waitForBatchedUpdates(); + expect(shouldReuse).toBe(false); - const tx1Data = await new Promise((resolve) => { - const connection = Onyx.connect({ - key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${initialTx.transactionID}`, - callback: (val) => { - resolve(val); - Onyx.disconnect(connection); - }, - }); + const tx2Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${transaction2.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, }); + }); - const tx2Data = await new Promise((resolve) => { - const connection = Onyx.connect({ - key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${secondTx.transactionID}`, - callback: (val) => { - resolve(val); - Onyx.disconnect(connection); - }, - }); + expect(tx2Data?.transactionID).toBe(transaction2.transactionID); + expect(tx2Data?.receipt?.source).toBe('file://receipt2.png'); + }); + + it('multi-scan mode preserves receipts when adding new ones', async () => { + const initialTx = createRandomTransaction(0); + initialTx.receipt = {source: 'file://initial-receipt.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${initialTx.transactionID}`, initialTx); + await waitForBatchedUpdates(); + + const secondTx = createRandomTransaction(1); + secondTx.receipt = {source: 'file://second-receipt.png', state: CONST.IOU.RECEIPT_STATE.OPEN}; + + const transactions = [initialTx]; + const shouldReuseForSecondFile = shouldReuseInitialTransaction(initialTx, true, 1, true, transactions); + + expect(shouldReuseForSecondFile).toBe(false); + + await Onyx.merge(`${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${secondTx.transactionID}`, secondTx); + await waitForBatchedUpdates(); + + const tx1Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${initialTx.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, }); + }); - expect(tx1Data?.receipt?.source).toBe('file://initial-receipt.png'); - expect(tx2Data?.receipt?.source).toBe('file://second-receipt.png'); + const tx2Data = await new Promise((resolve) => { + const connection = Onyx.connect({ + key: `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${secondTx.transactionID}`, + callback: (val) => { + resolve(val); + Onyx.disconnect(connection); + }, + }); }); + + expect(tx1Data?.receipt?.source).toBe('file://initial-receipt.png'); + expect(tx2Data?.receipt?.source).toBe('file://second-receipt.png'); }); });