aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/src/components/TagView.test.tsx
blob: 6304fb2b7f8a365e602e6eefbf3d9cfb72909ba4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import React from 'react';
import { render, screen, waitFor } from '@testing-library/react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { MemoryRouter, Route, Routes } from 'react-router-dom';
import FeedList from './FeedList';
import FeedItems from './FeedItems';

describe('Tag View Integration', () => {
    beforeEach(() => {
        vi.resetAllMocks();
        global.fetch = vi.fn();
    });

    it('renders tags in FeedList and navigates to tag view', async () => {
        const mockFeeds = [{ _id: 1, title: 'Feed 1', url: 'http://example.com/rss', category: 'Tech' }];
        const mockTags = [{ title: 'Tech' }, { title: 'News' }];

        (global.fetch as any).mockImplementation((url: string) => {
            if (url.includes('/api/feed/')) {
                return Promise.resolve({
                    ok: true,
                    json: async () => mockFeeds,
                });
            }
            if (url.includes('/api/tag')) {
                return Promise.resolve({
                    ok: true,
                    json: async () => mockTags,
                });
            }
            return Promise.reject(new Error(`Unknown URL: ${url}`));
        });

        render(
            <MemoryRouter>
                <FeedList />
            </MemoryRouter>
        );

        await waitFor(() => {
            const techTags = screen.getAllByText('Tech');
            expect(techTags.length).toBeGreaterThan(0);
            expect(screen.getByText('News')).toBeInTheDocument();
        });

        // Verify structure
        const techTag = screen.getByText('News').closest('a');
        expect(techTag).toHaveAttribute('href', '/tag/News');
    });

    it('fetches items by tag in FeedItems', async () => {
        const mockItems = [
            { _id: 101, title: 'Tag Item 1', url: 'http://example.com/1', feed_title: 'Feed 1' }
        ];

        (global.fetch as any).mockImplementation((url: string) => {
            if (url.includes('/api/stream')) {
                return Promise.resolve({
                    ok: true,
                    json: async () => mockItems,
                });
            }
            return Promise.reject(new Error(`Unknown URL: ${url}`));
        });

        render(
            <MemoryRouter initialEntries={['/tag/Tech']}>
                <Routes>
                    <Route path="/tag/:tagName" element={<FeedItems />} />
                </Routes>
            </MemoryRouter>
        );

        await waitFor(() => {
            expect(screen.getByText('Tag: Tech')).toBeInTheDocument();
            expect(screen.getByText('Tag Item 1')).toBeInTheDocument();
        });

        const params = new URLSearchParams();
        params.append('tag', 'Tech');
        params.append('read_filter', 'unread');
        expect(global.fetch).toHaveBeenCalledWith(`/api/stream?${params.toString()}`);
    });
});