84 lines
3.9 KiB
TypeScript
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);
|
|
});
|