import { render, screen, fireEvent } from '@testing-library/react'; import { test, expect, vi } from 'vitest'; import SearchSheet from './SearchSheet.jsx'; const base = { open: true, onClose: () => {}, query: 'shepherd', onQuery: () => {}, scope: 'bible', onScope: () => {}, verses: [], bookName: 'John', chapter: 3, currentBook: 'JHN', translation: 'NLT', isLocal: false, indexStatus: 'idle', onLoadIndex: () => {}, bibleMatches: [], deferredBibleQuery: '', }; test('server-searched translations list results with highlights and jump on tap', () => { const onJump = vi.fn(); const remote = { tooShort: false, loading: false, error: '', page: 1, total: 2, hasMore: true, loadMore: vi.fn(), results: [{ bookAbbrev: 'GEN', chapter: 4, verse: 2, text: 'Abel became a shepherd.' }, { bookAbbrev: 'PSA', chapter: 23, verse: 1, text: 'The Lord is my shepherd.' }], }; render(); expect(screen.getByText('2 matches in NLT')).toBeTruthy(); expect(screen.getAllByText('shepherd')[0].tagName).toBe('MARK'); fireEvent.click(screen.getByText(/Genesis 4:2/)); expect(onJump).toHaveBeenCalledWith('GEN', 4, 2); fireEvent.click(screen.getByText('Show more')); expect(remote.loadMore).toHaveBeenCalled(); }); test('shows the server error, e.g. a rate limit', () => { const remote = { tooShort: false, loading: false, error: 'ESV rate limit reached. Try again in a minute.', page: 0, total: 0, hasMore: false, loadMore: () => {}, results: [] }; render( {}} />); expect(screen.getByText(/rate limit/)).toBeTruthy(); });