Files
life-companion/__tests__/annualReviewUi.test.tsx

84 lines
3.9 KiB
TypeScript

import { act, fireEvent, render, waitFor } from '@testing-library/react-native';
import '@/i18n';
import { MemoryScreen } from '@/modules/memory/MemoryScreen';
import { SharePrivacyScreen } from '@/modules/memory/SharePrivacyScreen';
import { createInitialState, useAppStore } from '@/store/appStore';
const events = Array.from({ length: 360 }, (_, index) => {
const timestamp = new Date(Date.UTC(2026, 0, 1 + index, 8)).toISOString();
const direction = index < 180 ? 'activity' as const : 'focus' as const;
return {
id: `annual-ui-${index}`,
signalId: direction,
action: direction === 'activity' ? 'walking' as const : 'focus' as const,
direction,
source: 'manual' as const,
startedAt: timestamp,
endedAt: timestamp,
localDay: timestamp.slice(0, 10),
deviceName: 'This device',
sourceLabel: 'You recorded',
idempotencyKey: `annual-ui:${index}`,
status: 'accepted' as const,
};
});
beforeEach(() => {
useAppStore.setState({ ...createInitialState(), hydrated: true, events });
});
test('shows the annual review after four long-term archives', async () => {
const screen = await render(
<MemoryScreen navigation={{ goBack: jest.fn(), navigate: jest.fn() } as never} route={{} as never} />,
);
expect(screen.getByTestId('memory-annual-review')).toBeTruthy();
expect(screen.getByText('第 1 次年度回看')).toBeTruthy();
expect(screen.getByText('活力 出现在长期档案:1 · 2')).toBeTruthy();
expect(screen.getByText('专注 出现在长期档案:3 · 4')).toBeTruthy();
expect(screen.getByText('依次留下:远行路标 · 天际缎带 · 星图页 · 思绪棱镜')).toBeTruthy();
const input = screen.getByLabelText('这一年的注记');
await fireEvent.changeText(input, '这一年,我终于看见自己的变化。');
await fireEvent.press(screen.getByRole('button', { name: '保存年度注记' }));
await waitFor(() => expect(useAppStore.getState().annualNotes).toEqual({ '1': '这一年,我终于看见自己的变化。' }));
});
test('includes the annual review in privacy-safe sharing', async () => {
const screen = await render(
<SharePrivacyScreen navigation={{ goBack: jest.fn() } as never} route={{} as never} />,
);
expect(screen.getByText('第 1 次年度回看 · 活力 · 专注 · 4 段长期档案')).toBeTruthy();
await act(() => {
useAppStore.setState({ annualNotes: { '1': '这一年,我终于看见自己的变化。' } });
});
await waitFor(() => expect(screen.getByText('我的年度注记:这一年,我终于看见自己的变化。')).toBeTruthy());
await fireEvent.press(screen.getByRole('tab', { name: '不含生活数据' }));
expect(screen.queryByText('我的年度注记:这一年,我终于看见自己的变化。')).toBeNull();
});
test('keeps earlier annual reviews and notes collapsed by default', async () => {
const twoYearEvents = Array.from({ length: 720 }, (_, index) => {
const timestamp = new Date(Date.UTC(2026, 0, 1 + index, 8)).toISOString();
return {
...events[0],
id: `annual-history-${index}`,
startedAt: timestamp,
endedAt: timestamp,
localDay: timestamp.slice(0, 10),
idempotencyKey: `annual-history:${index}`,
};
});
useAppStore.setState({ events: twoYearEvents, annualNotes: { '1': '第一年,我开始看见变化。' } });
const screen = await render(
<MemoryScreen navigation={{ goBack: jest.fn(), navigate: jest.fn() } as never} route={{} as never} />,
);
expect(screen.getByText('第 2 次年度回看')).toBeTruthy();
expect(screen.queryByText('第 1 次年度回看')).toBeNull();
await fireEvent.press(screen.getByRole('button', { name: '查看更早的 1 次年度回看' }));
expect(screen.getAllByTestId('memory-annual-review')).toHaveLength(2);
expect(screen.getByText('第一年,我开始看见变化。')).toBeTruthy();
expect(screen.getAllByLabelText('这一年的注记')).toHaveLength(1);
});