import React from 'react' import { render, fireEvent } from '@testing-library/react-native' import { MessageTabBar, TAB_ITEMS } from './MessageTabBar' import type { MessageType } from './MessageTabBar' describe('MessageTabBar Constants', () => { describe('TAB_ITEMS', () => { it('should have 4 tabs', () => { expect(TAB_ITEMS).toHaveLength(4) }) it('should have correct tab keys', () => { const keys = TAB_ITEMS.map((tab) => tab.key) expect(keys).toEqual(['all', 'activity', 'system', 'billing']) }) it('should have correct tab labels', () => { const labels = TAB_ITEMS.map((tab) => tab.label) expect(labels).toEqual(['全部', '互动', '系统', '账单']) }) it('should have correct tab types', () => { const types = TAB_ITEMS.map((tab) => tab.type) expect(types).toEqual([undefined, 'ACTIVITY', 'SYSTEM', 'BILLING']) }) }) }) describe('MessageTabBar Component', () => { const mockOnTabChange = jest.fn() beforeEach(() => { jest.clearAllMocks() }) describe('Rendering', () => { it('should render all 4 tabs', () => { const { getByText } = render( ) expect(getByText('全部')).toBeTruthy() expect(getByText('互动')).toBeTruthy() expect(getByText('系统')).toBeTruthy() expect(getByText('账单')).toBeTruthy() }) it('should render with testID for each tab', () => { const { getByTestId } = render( ) expect(getByTestId('tab-all')).toBeTruthy() expect(getByTestId('tab-activity')).toBeTruthy() expect(getByTestId('tab-system')).toBeTruthy() expect(getByTestId('tab-billing')).toBeTruthy() }) }) describe('Active Tab Highlighting', () => { it('should highlight "全部" tab when activeTab is undefined', () => { const { getByTestId } = render( ) const allTab = getByTestId('tab-all') const activityTab = getByTestId('tab-activity') // Check that all tab has active indicator expect(getByTestId('tab-all-active-indicator')).toBeTruthy() // Check that activity tab does not have active indicator expect(() => getByTestId('tab-activity-active-indicator')).toThrow() }) it('should highlight "互动" tab when activeTab is ACTIVITY', () => { const { getByTestId } = render( ) expect(getByTestId('tab-activity-active-indicator')).toBeTruthy() expect(() => getByTestId('tab-all-active-indicator')).toThrow() }) it('should highlight "系统" tab when activeTab is SYSTEM', () => { const { getByTestId } = render( ) expect(getByTestId('tab-system-active-indicator')).toBeTruthy() expect(() => getByTestId('tab-all-active-indicator')).toThrow() }) it('should highlight "账单" tab when activeTab is BILLING', () => { const { getByTestId } = render( ) expect(getByTestId('tab-billing-active-indicator')).toBeTruthy() expect(() => getByTestId('tab-all-active-indicator')).toThrow() }) }) describe('Tab Press Interaction', () => { it('should call onTabChange with undefined when "全部" tab is pressed', () => { const { getByTestId } = render( ) fireEvent.press(getByTestId('tab-all')) expect(mockOnTabChange).toHaveBeenCalledWith(undefined) }) it('should call onTabChange with ACTIVITY when "互动" tab is pressed', () => { const { getByTestId } = render( ) fireEvent.press(getByTestId('tab-activity')) expect(mockOnTabChange).toHaveBeenCalledWith('ACTIVITY') }) it('should call onTabChange with SYSTEM when "系统" tab is pressed', () => { const { getByTestId } = render( ) fireEvent.press(getByTestId('tab-system')) expect(mockOnTabChange).toHaveBeenCalledWith('SYSTEM') }) it('should call onTabChange with BILLING when "账单" tab is pressed', () => { const { getByTestId } = render( ) fireEvent.press(getByTestId('tab-billing')) expect(mockOnTabChange).toHaveBeenCalledWith('BILLING') }) it('should call onTabChange even when pressing the already active tab', () => { const { getByTestId } = render( ) fireEvent.press(getByTestId('tab-all')) expect(mockOnTabChange).toHaveBeenCalledWith(undefined) }) }) describe('Unread Badge Display', () => { it('should show unread badge on "全部" tab when all count > 0', () => { const { getByTestId, getByText } = render( ) expect(getByTestId('tab-all-badge')).toBeTruthy() expect(getByText('5')).toBeTruthy() }) it('should show unread badge on "互动" tab when activity count > 0', () => { const { getByTestId, getByText } = render( ) expect(getByTestId('tab-activity-badge')).toBeTruthy() expect(getByText('3')).toBeTruthy() }) it('should show unread badge on "系统" tab when system count > 0', () => { const { getByTestId, getByText } = render( ) expect(getByTestId('tab-system-badge')).toBeTruthy() expect(getByText('10')).toBeTruthy() }) it('should show unread badge on "账单" tab when billing count > 0', () => { const { getByTestId, getByText } = render( ) expect(getByTestId('tab-billing-badge')).toBeTruthy() expect(getByText('2')).toBeTruthy() }) it('should show multiple badges when multiple counts > 0', () => { const { getByTestId } = render( ) expect(getByTestId('tab-all-badge')).toBeTruthy() expect(getByTestId('tab-activity-badge')).toBeTruthy() expect(getByTestId('tab-system-badge')).toBeTruthy() expect(getByTestId('tab-billing-badge')).toBeTruthy() }) it('should show "99+" when count exceeds 99', () => { const { getByText } = render( ) expect(getByText('99+')).toBeTruthy() }) }) describe('No Badge Display', () => { it('should not show badge when unreadCounts is not provided', () => { const { queryByTestId } = render( ) expect(queryByTestId('tab-all-badge')).toBeNull() expect(queryByTestId('tab-activity-badge')).toBeNull() expect(queryByTestId('tab-system-badge')).toBeNull() expect(queryByTestId('tab-billing-badge')).toBeNull() }) it('should not show badge when count is 0', () => { const { queryByTestId } = render( ) expect(queryByTestId('tab-all-badge')).toBeNull() expect(queryByTestId('tab-activity-badge')).toBeNull() expect(queryByTestId('tab-system-badge')).toBeNull() expect(queryByTestId('tab-billing-badge')).toBeNull() }) it('should not show badge when count is undefined', () => { const { queryByTestId } = render( ) expect(queryByTestId('tab-all-badge')).toBeNull() expect(queryByTestId('tab-activity-badge')).toBeNull() expect(queryByTestId('tab-system-badge')).toBeNull() expect(queryByTestId('tab-billing-badge')).toBeNull() }) }) }) describe('MessageTabBar Types', () => { it('should accept valid MessageType values', () => { const types: MessageType[] = [undefined, 'ACTIVITY', 'SYSTEM', 'BILLING'] types.forEach((type) => { expect([undefined, 'ACTIVITY', 'SYSTEM', 'BILLING']).toContain(type) }) }) })