From cba29e6aae637b04ff6eaf28f74bc15b6242b9ea Mon Sep 17 00:00:00 2001
From: Adam Mathes <adam@adammathes.com>
Date: Mon, 16 Feb 2026 19:37:50 -0800
Subject: Remove legacy V2 React frontend and update build/test scripts to
 focus on Vanilla JS (V3)

---
 frontend/src/Navigation.test.tsx | 123 ---------------------------------------
 1 file changed, 123 deletions(-)
 delete mode 100644 frontend/src/Navigation.test.tsx

(limited to 'frontend/src/Navigation.test.tsx')

diff --git a/frontend/src/Navigation.test.tsx b/frontend/src/Navigation.test.tsx
deleted file mode 100644
index b0bae86..0000000
--- a/frontend/src/Navigation.test.tsx
+++ /dev/null
@@ -1,123 +0,0 @@
-import { describe, it, expect, vi, beforeEach } from 'vitest';
-import { render, screen, fireEvent, waitFor } from '@testing-library/react';
-import React from 'react';
-import App from './App';
-import '@testing-library/jest-dom';
-
-describe('Navigation and Filtering', () => {
-    beforeEach(() => {
-        vi.resetAllMocks();
-        global.fetch = vi.fn();
-        // Default mock response for auth
-        vi.mocked(global.fetch).mockImplementation((url) => {
-            const urlStr = url.toString();
-            if (urlStr.includes('/api/auth')) return Promise.resolve({ ok: true, json: async () => ({ status: 'ok' }) } as Response);
-            if (urlStr.includes('/api/feed/')) return Promise.resolve({
-                ok: true,
-                json: async () => [
-                    { _id: 1, title: 'Feed 1', url: 'http://f1.com' },
-                    { _id: 2, title: 'Feed 2', url: 'http://f2.com' }
-                ]
-            } as Response);
-            if (urlStr.includes('/api/tag')) return Promise.resolve({ ok: true, json: async () => [] } as Response);
-            if (urlStr.includes('/api/stream')) return Promise.resolve({ ok: true, json: async () => [] } as Response);
-            return Promise.resolve({ ok: true, json: async () => ({}) } as Response);
-        });
-    });
-
-    it('preserves "all" filter when clicking a feed', async () => {
-        Object.defineProperty(window, 'innerWidth', { writable: true, configurable: true, value: 1024 });
-        window.history.pushState({}, '', '/#/');
-        render(<App />);
-
-        // Wait for sidebar to load and feeds section to be visible
-        await waitFor(() => {
-            expect(screen.queryByText(/Loading feeds/i)).not.toBeInTheDocument();
-        });
-
-        // Expand feeds if not expanded
-        const feedsHeader = await screen.findByRole('heading', { name: /Feeds/i, level: 4 });
-        fireEvent.click(feedsHeader);
-
-        await waitFor(() => {
-            expect(screen.getByText('Feed 1')).toBeInTheDocument();
-        });
-        // Click 'all' filter
-        const allFilter = screen.getByText('all');
-        fireEvent.click(allFilter);
-
-        // Verify URL has filter=all
-        await waitFor(() => {
-            expect(window.location.hash).toContain('filter=all');
-        });
-
-        // Click Feed 1
-        const feed1Link = screen.getByText('Feed 1');
-        fireEvent.click(feed1Link);
-
-        // Verify URL is /feed/1?filter=all (or similar)
-        await waitFor(() => {
-            expect(window.location.hash).toContain('/feed/1');
-            expect(window.location.hash).toContain('filter=all');
-        });
-
-        // Click Feed 2
-        const feed2Link = screen.getByText('Feed 2');
-        fireEvent.click(feed2Link);
-
-        // Verify URL is /feed/2?filter=all
-        await waitFor(() => {
-            expect(window.location.hash).toContain('/feed/2');
-            expect(window.location.hash).toContain('filter=all');
-        });
-    });
-
-    it('highlights the correct filter link', async () => {
-        window.history.pushState({}, '', '/#/');
-        render(<App />);
-
-        await waitFor(() => {
-            const unreadLink = screen.getByText('unread');
-            expect(unreadLink.className).toContain('active');
-        });
-
-        fireEvent.click(screen.getByText('all'));
-        await waitFor(() => {
-            const allLink = screen.getByText('all');
-            const unreadLink = screen.getByText('unread');
-            expect(allLink.className).toContain('active');
-            expect(unreadLink.className).not.toContain('active');
-        });
-    });
-
-    it('highlights "unread" as active even when on a feed page without filter param', async () => {
-        window.history.pushState({}, '', '/#/feed/1');
-        render(<App />);
-
-        await waitFor(() => {
-            const unreadLink = screen.getByText('unread');
-            expect(unreadLink.className).toContain('active');
-        });
-    });
-
-    it('preserves search query when clicking a feed', async () => {
-        window.history.pushState({}, '', '/#/?q=linux');
-        render(<App />);
-
-        // Wait for load
-        await waitFor(() => {
-            expect(screen.queryByText(/Loading feeds/i)).not.toBeInTheDocument();
-        });
-
-        const feedsHeader = await screen.findByRole('heading', { name: /Feeds/i, level: 4 });
-        fireEvent.click(feedsHeader);
-
-        await screen.findByText('Feed 1');
-        fireEvent.click(screen.getByText('Feed 1'));
-
-        await waitFor(() => {
-            expect(window.location.hash).toContain('/feed/1');
-            expect(window.location.hash).toContain('q=linux');
-        });
-    });
-});
-- 
cgit v1.2.3

