Skip to content

Commit ad7bb46

Browse files
chore: tests
1 parent fbcc709 commit ad7bb46

1 file changed

Lines changed: 66 additions & 4 deletions

File tree

app/components/UI/Bridge/components/QuoteSelectorView/QuoteList.test.tsx

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,33 @@ import { QuoteRowProps, QuoteRowViewProps } from './QuoteRow';
55
import { useSelector } from 'react-redux';
66
import { 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

1936
jest.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

Comments
 (0)