@@ -5,16 +5,33 @@ import { QuoteRowProps, QuoteRowViewProps } from './QuoteRow';
55import { useSelector } from 'react-redux' ;
66import { getDisplayCurrencyValue } from '../../utils/exchange-rates' ;
77
8- jest . mock ( './QuoteRow' , ( ) => ( {
9- QuoteRowView : ( { providerName, quoteRequestId } : QuoteRowViewProps ) => {
8+ const mockQuoteRowRenderCounts = new Map < string , number > ( ) ;
9+
10+ jest . mock ( './QuoteRow' , ( ) => {
11+ const ReactActual = jest . requireActual ( 'react' ) ;
12+
13+ function MockQuoteRowView ( {
14+ providerName,
15+ quoteRequestId,
16+ } : QuoteRowViewProps ) {
1017 const { Text } = jest . requireActual ( 'react-native' ) ;
18+
19+ mockQuoteRowRenderCounts . set (
20+ quoteRequestId ,
21+ ( mockQuoteRowRenderCounts . get ( quoteRequestId ) ?? 0 ) + 1 ,
22+ ) ;
23+
1124 return (
1225 < Text testID = { `quote-row-${ quoteRequestId } ` } >
1326 { providerName } - { quoteRequestId }
1427 </ Text >
1528 ) ;
16- } ,
17- } ) ) ;
29+ }
30+
31+ return {
32+ QuoteRowView : ReactActual . memo ( MockQuoteRowView ) ,
33+ } ;
34+ } ) ;
1835
1936jest . mock ( 'react-redux' , ( ) => ( {
2037 ...jest . requireActual ( 'react-redux' ) ,
@@ -50,6 +67,7 @@ describe('QuoteList', () => {
5067
5168 beforeEach ( ( ) => {
5269 jest . clearAllMocks ( ) ;
70+ mockQuoteRowRenderCounts . clear ( ) ;
5371 } ) ;
5472
5573 describe ( 'rendering' , ( ) => {
@@ -126,6 +144,50 @@ describe('QuoteList', () => {
126144 } ) ;
127145 } ) ;
128146
147+ describe ( 'memoization' , ( ) => {
148+ it ( 'does not re-render unchanged rows when one quote changes' , ( ) => {
149+ // Arrange
150+ const quotes = [
151+ createMockQuote ( {
152+ provider : { name : 'Lifi' } ,
153+ quoteRequestId : 'quote-1' ,
154+ } ) ,
155+ createMockQuote ( {
156+ provider : { name : 'Socket' } ,
157+ quoteRequestId : 'quote-2' ,
158+ } ) ,
159+ createMockQuote ( {
160+ provider : { name : 'Hop' } ,
161+ quoteRequestId : 'quote-3' ,
162+ } ) ,
163+ ] ;
164+ const { rerender } = render ( < QuoteList data = { quotes } /> ) ;
165+ const updatedQuotes = [
166+ createMockQuote ( {
167+ provider : { name : 'Lifi' } ,
168+ quoteRequestId : 'quote-1' ,
169+ } ) ,
170+ createMockQuote ( {
171+ provider : { name : 'Socket' } ,
172+ quoteRequestId : 'quote-2' ,
173+ formattedTotalCost : '$101.00' ,
174+ } ) ,
175+ createMockQuote ( {
176+ provider : { name : 'Hop' } ,
177+ quoteRequestId : 'quote-3' ,
178+ } ) ,
179+ ] ;
180+
181+ // Act
182+ rerender ( < QuoteList data = { updatedQuotes } /> ) ;
183+
184+ // Assert
185+ expect ( mockQuoteRowRenderCounts . get ( 'quote-1' ) ) . toBe ( 1 ) ;
186+ expect ( mockQuoteRowRenderCounts . get ( 'quote-2' ) ) . toBe ( 2 ) ;
187+ expect ( mockQuoteRowRenderCounts . get ( 'quote-3' ) ) . toBe ( 1 ) ;
188+ } ) ;
189+ } ) ;
190+
129191 describe ( 'prop passing' , ( ) => {
130192 it ( 'passes all props to QuoteRow components' , ( ) => {
131193 const quote = createMockQuote ( {
0 commit comments