79 lines
3.2 KiB
TypeScript
79 lines
3.2 KiB
TypeScript
// @vitest-environment jsdom
|
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
import '@testing-library/jest-dom/vitest';
|
|
import { render, screen, fireEvent, cleanup, waitFor } from '@testing-library/react';
|
|
|
|
vi.mock('../../src/renderer/inbox/api.js', () => ({
|
|
inboxApi: {
|
|
listNotes: vi.fn(async () => []),
|
|
getContinuity: vi.fn(async () => ({
|
|
weekStart: '', weekCount: 0, weekTarget: 7,
|
|
consecutiveCompleteWeeks: 0, showRecoveryToast: false, lastNoteAt: null
|
|
})),
|
|
getPendingCount: vi.fn(async () => 0),
|
|
getOllamaStatus: vi.fn(async () => ({ ok: true })),
|
|
getTodayCount: vi.fn(async () => 0),
|
|
getTrashCount: vi.fn(async () => 0),
|
|
listExpired: vi.fn(async () => []),
|
|
getFailedCount: vi.fn(async () => 0),
|
|
listRecallCandidate: vi.fn(async () => null),
|
|
onNoteUpdated: vi.fn(() => () => undefined),
|
|
onOllamaStatus: vi.fn(() => () => undefined),
|
|
onOpenOllamaSettings: vi.fn(() => () => undefined),
|
|
onNavigate: vi.fn(() => () => undefined),
|
|
// 4 섹션 mounted 시 호출되는 stub
|
|
loadOllamaSettings: vi.fn(async () => ({ endpoint: '', model: '' })),
|
|
saveOllamaSettings: vi.fn(async () => ({ ok: true })),
|
|
ollamaRecheck: vi.fn(async () => ({ ok: true })),
|
|
getAutostart: vi.fn(async () => ({ openAtLogin: false })),
|
|
setAutostart: vi.fn(async () => ({ openAtLogin: false })),
|
|
runBackup: vi.fn(async () => ({ ok: true })),
|
|
runExport: vi.fn(async () => ({ ok: true })),
|
|
runImport: vi.fn(async () => ({ ok: true })),
|
|
runSync: vi.fn(async () => ({ ok: true })),
|
|
runExportTelemetry: vi.fn(async () => ({ ok: true })),
|
|
getAppInfo: vi.fn(async () => ({ version: '0.2.7', electron: '?', node: '?', os: '?', profileDir: '?' })),
|
|
openProfileDir: vi.fn(async () => undefined),
|
|
copyAppInfo: vi.fn(async () => undefined)
|
|
}
|
|
}));
|
|
|
|
import { App } from '../../src/renderer/inbox/App';
|
|
import { useInbox } from '../../src/renderer/inbox/store';
|
|
import { inboxApi } from '../../src/renderer/inbox/api.js';
|
|
|
|
describe('App — settings view', () => {
|
|
beforeEach(() => {
|
|
cleanup();
|
|
useInbox.setState({ showSettings: false, notes: [], trashNotes: [], trashCount: 0 });
|
|
});
|
|
|
|
it('renders SettingsPage when showSettings=true', async () => {
|
|
useInbox.setState({ showSettings: true });
|
|
render(<App />);
|
|
expect(await screen.findByText('설정')).toBeInTheDocument();
|
|
expect(screen.getByText('AI 제공자')).toBeInTheDocument();
|
|
});
|
|
|
|
it('header gear icon click sets showSettings=true', async () => {
|
|
render(<App />);
|
|
fireEvent.click(await screen.findByLabelText('설정 열기'));
|
|
expect(useInbox.getState().showSettings).toBe(true);
|
|
});
|
|
|
|
it('inbox:navigate "settings" event sets showSettings=true', async () => {
|
|
const navHandlers: Array<(view: 'inbox' | 'trash' | 'settings') => void> = [];
|
|
vi.mocked(inboxApi.onNavigate).mockImplementation((cb) => {
|
|
navHandlers.push(cb);
|
|
return () => {
|
|
const i = navHandlers.indexOf(cb);
|
|
if (i >= 0) navHandlers.splice(i, 1);
|
|
};
|
|
});
|
|
render(<App />);
|
|
await waitFor(() => expect(navHandlers.length).toBeGreaterThan(0));
|
|
navHandlers.forEach((h) => h('settings'));
|
|
await waitFor(() => expect(useInbox.getState().showSettings).toBe(true));
|
|
});
|
|
});
|