Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 47 additions & 6 deletions web/src/components/NoteCard.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,6 @@ describe('NoteCard', () => {
expect(screen.getByText('Test Note')).toBeInTheDocument();
expect(screen.getByText('Faith')).toBeInTheDocument();
expect(screen.getByText('Prayer')).toBeInTheDocument();
// Date formatting might depend on locale, but let's check basic presence
// 1/1/2023 or similar
// expect(screen.getByText(/2023/)).toBeInTheDocument();
});

it('navigates to note detail on card click', () => {
Expand All @@ -62,17 +59,61 @@ describe('NoteCard', () => {
expect(mockNavigate).toHaveBeenCalledWith('/notes/1');
});

it('navigates on Enter key', () => {
it('navigates on Enter key and Space key', () => {
render(
<MemoryRouter>
<NoteCard note={mockNote} {...mockHandlers} />
</MemoryRouter>
);

const card = screen.getByRole('link');
fireEvent.keyDown(card, { key: 'Enter', code: 'Enter' });

fireEvent.keyDown(card, { key: 'Enter', code: 'Enter' });
expect(mockNavigate).toHaveBeenCalledWith('/notes/1');

fireEvent.keyDown(card, { key: ' ', code: 'Space' });
expect(mockNavigate).toHaveBeenCalledTimes(2);
});

it('ignores other key presses', () => {
render(
<MemoryRouter>
<NoteCard note={mockNote} {...mockHandlers} />
</MemoryRouter>
);

const card = screen.getByRole('link');
fireEvent.keyDown(card, { key: 'A', code: 'KeyA' });

expect(mockNavigate).not.toHaveBeenCalled();
});

it('renders untitled note if title is missing', () => {
render(
<MemoryRouter>
<NoteCard note={{...mockNote, title: ''}} {...mockHandlers} />
</MemoryRouter>
);

expect(screen.getByText('Untitled Note')).toBeInTheDocument();
});

it('renders correctly without tags', () => {
render(
<MemoryRouter>
<NoteCard note={{...mockNote, tags: undefined}} {...mockHandlers} />
</MemoryRouter>
);
expect(screen.queryByText('Faith')).not.toBeInTheDocument();
});

it('renders empty tag list correctly', () => {
render(
<MemoryRouter>
<NoteCard note={{...mockNote, tags: []}} {...mockHandlers} />
</MemoryRouter>
);
expect(screen.queryByText('Faith')).not.toBeInTheDocument();
});

it('triggers actions without navigation', () => {
Expand All @@ -88,7 +129,7 @@ describe('NoteCard', () => {

fireEvent.click(deleteButton);
expect(mockHandlers.onDelete).toHaveBeenCalledWith(mockNote);
expect(mockNavigate).not.toHaveBeenCalled(); // Should assume test isolation or clear mocks
expect(mockNavigate).not.toHaveBeenCalled();

fireEvent.click(shareButton);
expect(mockHandlers.onShare).toHaveBeenCalledWith(mockNote);
Expand Down
3 changes: 3 additions & 0 deletions web/src/components/NoteCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export function NoteCard({ note, onDelete, onShare, onAskAI }: NoteCardProps) {
onAskAI(note);
}}
title="Ask AI"
aria-label={`Ask AI about ${note.title || "Untitled Note"}`}
>
<Sparkles className="w-4 h-4" />
</Button>
Expand All @@ -73,6 +74,7 @@ export function NoteCard({ note, onDelete, onShare, onAskAI }: NoteCardProps) {
onShare(note);
}}
title="Share"
aria-label={`Share ${note.title || "Untitled Note"}`}
>
<Share2 className="w-4 h-4" />
</Button>
Expand All @@ -86,6 +88,7 @@ export function NoteCard({ note, onDelete, onShare, onAskAI }: NoteCardProps) {
onDelete(note);
}}
title="Delete"
aria-label={`Delete ${note.title || "Untitled Note"}`}
>
<Trash2 className="w-4 h-4" />
</Button>
Expand Down
Loading