packages/types: 27 tests - Zod schema validation for user, node, workspace, tag, link - Default values, required fields, enum constraints, edge cases packages/ui: 8 tests - Button rendering, variants, sizes, asChild, ref forwarding, disabled - Dialog trigger rendering apps/web: 13 tests - Notes store CRUD operations (add, update, remove, select, search) - Tasks store operations (add, toggle complete, priority, remove, view switching, projects) apps/api: 4 placeholders for DB-backed integration tests Infrastructure: - vitest configs for packages/types and packages/ui - jsdom test environment for UI components - localStorage mock for Zustand persist middleware in jsdom - crypto.randomUUID polyfill for test environment - Fixed create schemas to make non-essential fields optional
60 lines
1.7 KiB
TypeScript
60 lines
1.7 KiB
TypeScript
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { useNotesStore } from '../stores/notes';
|
|
|
|
function createNote(overrides: Record<string, unknown> = {}) {
|
|
return {
|
|
id: crypto.randomUUID(),
|
|
title: 'Test Note',
|
|
type: 'note' as const,
|
|
content: { type: 'doc', content: [] },
|
|
plainText: '',
|
|
status: 'active' as const,
|
|
workspaceId: 'ws-1',
|
|
tags: [],
|
|
folderId: null,
|
|
createdAt: new Date().toISOString(),
|
|
updatedAt: new Date().toISOString(),
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
describe('useNotesStore', () => {
|
|
beforeEach(() => {
|
|
useNotesStore.setState({ notes: [], folders: [], selectedNoteId: null, searchQuery: '', loading: false });
|
|
});
|
|
|
|
it('starts with empty notes', () => {
|
|
expect(useNotesStore.getState().notes).toHaveLength(0);
|
|
});
|
|
|
|
it('adds a note', () => {
|
|
const note = createNote();
|
|
useNotesStore.getState().addNote(note);
|
|
expect(useNotesStore.getState().notes).toHaveLength(1);
|
|
});
|
|
|
|
it('updates a note', () => {
|
|
const note = createNote();
|
|
useNotesStore.getState().addNote(note);
|
|
useNotesStore.getState().updateNote(note.id, { title: 'Updated' });
|
|
expect(useNotesStore.getState().notes[0]?.title).toBe('Updated');
|
|
});
|
|
|
|
it('removes a note', () => {
|
|
const note = createNote();
|
|
useNotesStore.getState().addNote(note);
|
|
useNotesStore.getState().removeNote(note.id);
|
|
expect(useNotesStore.getState().notes).toHaveLength(0);
|
|
});
|
|
|
|
it('sets selected note', () => {
|
|
useNotesStore.getState().setSelectedNoteId('note-1');
|
|
expect(useNotesStore.getState().selectedNoteId).toBe('note-1');
|
|
});
|
|
|
|
it('sets search query', () => {
|
|
useNotesStore.getState().setSearchQuery('hello');
|
|
expect(useNotesStore.getState().searchQuery).toBe('hello');
|
|
});
|
|
});
|