diff --git a/src/components/NoteList.test.tsx b/src/components/NoteList.test.tsx index e8beb7db..6e00d480 100644 --- a/src/components/NoteList.test.tsx +++ b/src/components/NoteList.test.tsx @@ -335,6 +335,38 @@ describe('getSortComparator', () => { const sorted = [a, b].sort(getSortComparator('status')) expect(sorted.map((e) => e.title)).toEqual(['NewerActive', 'OlderActive']) }) + + it('sorts by modified date ascending when direction is asc', () => { + const a = makeEntry({ title: 'A', modifiedAt: 1000 }) + const b = makeEntry({ title: 'B', modifiedAt: 3000 }) + const c = makeEntry({ title: 'C', modifiedAt: 2000 }) + const sorted = [a, b, c].sort(getSortComparator('modified', 'asc')) + expect(sorted.map((e) => e.title)).toEqual(['A', 'C', 'B']) + }) + + it('sorts by title descending when direction is desc', () => { + const a = makeEntry({ title: 'Zebra' }) + const b = makeEntry({ title: 'Alpha' }) + const c = makeEntry({ title: 'Middle' }) + const sorted = [a, b, c].sort(getSortComparator('title', 'desc')) + expect(sorted.map((e) => e.title)).toEqual(['Zebra', 'Middle', 'Alpha']) + }) + + it('sorts by created date ascending when direction is asc', () => { + const a = makeEntry({ title: 'A', createdAt: 3000, modifiedAt: 1000 }) + const b = makeEntry({ title: 'B', createdAt: 1000, modifiedAt: 3000 }) + const c = makeEntry({ title: 'C', createdAt: 2000, modifiedAt: 2000 }) + const sorted = [a, b, c].sort(getSortComparator('created', 'asc')) + expect(sorted.map((e) => e.title)).toEqual(['B', 'C', 'A']) + }) + + it('sorts by status descending (null first, Done before Active)', () => { + const a = makeEntry({ title: 'Done', status: 'Done', modifiedAt: 1000 }) + const b = makeEntry({ title: 'Active', status: 'Active', modifiedAt: 1000 }) + const c = makeEntry({ title: 'NoStatus', status: null, modifiedAt: 1000 }) + const sorted = [a, b, c].sort(getSortComparator('status', 'desc')) + expect(sorted.map((e) => e.title)).toEqual(['NoStatus', 'Done', 'Active']) + }) }) describe('NoteList sort controls', () => { @@ -425,6 +457,71 @@ describe('NoteList sort controls', () => { expect(screen.queryByTestId('sort-menu-__list__')).not.toBeInTheDocument() }) + it('shows direction arrows in sort dropdown menu', () => { + render( + + ) + fireEvent.click(screen.getByTestId('sort-button-__list__')) + // Each option should have asc and desc direction buttons + expect(screen.getByTestId('sort-dir-asc-modified')).toBeInTheDocument() + expect(screen.getByTestId('sort-dir-desc-modified')).toBeInTheDocument() + expect(screen.getByTestId('sort-dir-asc-title')).toBeInTheDocument() + expect(screen.getByTestId('sort-dir-desc-title')).toBeInTheDocument() + }) + + it('reverses sort order when clicking direction arrow', () => { + const entries = [ + makeEntry({ path: '/a.md', title: 'Zebra', modifiedAt: 3000 }), + makeEntry({ path: '/b.md', title: 'Alpha', modifiedAt: 1000 }), + makeEntry({ path: '/c.md', title: 'Middle', modifiedAt: 2000 }), + ] + render( + + ) + // Default sort: modified descending (Zebra first at 3000) + let titles = screen.getAllByText(/Zebra|Alpha|Middle/).map((el) => el.textContent) + expect(titles).toEqual(['Zebra', 'Middle', 'Alpha']) + + // Click the asc arrow for modified to reverse + fireEvent.click(screen.getByTestId('sort-button-__list__')) + fireEvent.click(screen.getByTestId('sort-dir-asc-modified')) + + // Now ascending: Alpha (1000) first + titles = screen.getAllByText(/Zebra|Alpha|Middle/).map((el) => el.textContent) + expect(titles).toEqual(['Alpha', 'Middle', 'Zebra']) + }) + + it('persists sort direction via saveSortPreferences', () => { + const entries = [ + makeEntry({ path: '/a.md', title: 'Zebra', modifiedAt: 3000 }), + makeEntry({ path: '/b.md', title: 'Alpha', modifiedAt: 1000 }), + ] + render( + + ) + // Select title sort with desc direction + fireEvent.click(screen.getByTestId('sort-button-__list__')) + fireEvent.click(screen.getByTestId('sort-dir-desc-title')) + + // Verify direction took effect: desc title means Z before A + const titles = screen.getAllByText(/Zebra|Alpha/).map((el) => el.textContent) + expect(titles).toEqual(['Zebra', 'Alpha']) + }) + + it('shows direction icon on the sort button that reflects current direction', () => { + render( + + ) + // Default: modified desc → should have ArrowDown icon + expect(screen.getByTestId('sort-direction-icon-__list__')).toBeInTheDocument() + + // Switch to title (default asc) and verify icon changes + fireEvent.click(screen.getByTestId('sort-button-__list__')) + fireEvent.click(screen.getByTestId('sort-option-title')) + // Title default is asc → should show ArrowUp icon + expect(screen.getByTestId('sort-direction-icon-__list__')).toBeInTheDocument() + }) + it('sorts relationship subsection entries when sort option changed', () => { // Create an entity with children that have different titles const parent = makeEntry({