import React from 'react' import { render, waitFor } from '@testing-library/react-native' import My from '../my' jest.mock('expo-router', () => ({ useRouter: () => ({ push: jest.fn(), replace: jest.fn(), }), })) jest.mock('react-i18next', () => ({ useTranslation: () => ({ t: (key: string) => key, i18n: { language: 'zh-CN', changeLanguage: jest.fn() }, }), })) jest.mock('@/lib/auth', () => ({ signOut: jest.fn(), useSession: () => ({ data: { user: { id: 'test-user-id', name: 'Test User', username: 'testuser', image: null, }, }, }), })) jest.mock('@/hooks/use-user-balance', () => ({ useUserBalance: () => ({ balance: 100, }), })) const mockRefetch = jest.fn() const mockLoadMore = jest.fn() jest.mock('@/hooks', () => ({ useTemplateGenerations: jest.fn(() => ({ generations: [], loading: false, loadingMore: false, refetch: mockRefetch, loadMore: mockLoadMore, hasMore: true, })), })) describe('My Page - Pagination', () => { beforeEach(() => { jest.clearAllMocks() }) it('should load first page with limit 20 on mount', async () => { render() await waitFor(() => { expect(mockRefetch).toHaveBeenCalledWith({ page: 1, limit: 20 }) }) }) it('should refresh with limit 20 on pull to refresh', async () => { const { useTemplateGenerations } = require('@/hooks') const mockOnRefresh = jest.fn() useTemplateGenerations.mockReturnValue({ generations: [{ id: '1', status: 'completed' }], loading: false, loadingMore: false, refetch: mockRefetch, loadMore: mockLoadMore, hasMore: true, }) render() await waitFor(() => { expect(mockRefetch).toHaveBeenCalledWith({ page: 1, limit: 20 }) }) }) it('should call loadMore when scrolling near bottom', async () => { const { useTemplateGenerations } = require('@/hooks') useTemplateGenerations.mockReturnValue({ generations: Array(20).fill(null).map((_, i) => ({ id: `${i}`, status: 'completed', resultUrl: ['url'], })), loading: false, loadingMore: false, refetch: mockRefetch, loadMore: mockLoadMore, hasMore: true, }) render() await waitFor(() => { expect(mockRefetch).toHaveBeenCalledWith({ page: 1, limit: 20 }) }) }) it('should not load more when loadingMore is true', async () => { const { useTemplateGenerations } = require('@/hooks') useTemplateGenerations.mockReturnValue({ generations: Array(20).fill(null).map((_, i) => ({ id: `${i}`, status: 'completed' })), loading: false, loadingMore: true, refetch: mockRefetch, loadMore: mockLoadMore, hasMore: true, }) render() await waitFor(() => { expect(mockRefetch).toHaveBeenCalledWith({ page: 1, limit: 20 }) }) }) it('should not load more when hasMore is false', async () => { const { useTemplateGenerations } = require('@/hooks') useTemplateGenerations.mockReturnValue({ generations: Array(10).fill(null).map((_, i) => ({ id: `${i}`, status: 'completed' })), loading: false, loadingMore: false, refetch: mockRefetch, loadMore: mockLoadMore, hasMore: false, }) render() await waitFor(() => { expect(mockRefetch).toHaveBeenCalledWith({ page: 1, limit: 20 }) }) }) })