From 5e2b1b2de36fc63cfa677705388f5701c62ee138 Mon Sep 17 00:00:00 2001 From: Adam Mathes Date: Sat, 14 Feb 2026 21:20:32 -0800 Subject: feat: add manual crawl button and E2E test for crawl cycle --- frontend/src/components/Settings.tsx | 26 ++++++++++++++++++++++++++ frontend/tests/crawl.spec.ts | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 frontend/tests/crawl.spec.ts (limited to 'frontend') diff --git a/frontend/src/components/Settings.tsx b/frontend/src/components/Settings.tsx index b218775..ec432ba 100644 --- a/frontend/src/components/Settings.tsx +++ b/frontend/src/components/Settings.tsx @@ -111,6 +111,25 @@ export default function Settings({ fontTheme, setFontTheme }: SettingsProps) { }); }; + const handleCrawl = () => { + setLoading(true); + apiFetch('/api/crawl', { + method: 'POST', + }) + .then((res) => { + if (!res.ok) throw new Error('Failed to start crawl'); + return res.json(); + }) + .then(() => { + setLoading(false); + alert('Crawl started!'); + }) + .catch((err) => { + setError(err.message); + setLoading(false); + }); + }; + return (

Settings

@@ -178,6 +197,13 @@ export default function Settings({ fontTheme, setFontTheme }: SettingsProps) { JSON
+ +
+

Actions

+ +
{error &&

{error}

} diff --git a/frontend/tests/crawl.spec.ts b/frontend/tests/crawl.spec.ts new file mode 100644 index 0000000..175a764 --- /dev/null +++ b/frontend/tests/crawl.spec.ts @@ -0,0 +1,32 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Crawl Integration', () => { + test('should add a feed and see items after crawl', async ({ page }) => { + const mockFeedUrl = 'http://localhost:9090/mock_feed.xml'; + + // 1. Login and go to Settings + await page.goto('/v2/settings'); + + // 2. Add the mock feed + await page.fill('input[type="url"]', mockFeedUrl); + await page.click('text=Add Feed'); + + // Wait for feed to be added + await expect(page.getByText(mockFeedUrl)).toBeVisible({ timeout: 5000 }); + + // 3. Trigger Crawl + const crawlButton = page.getByRole('button', { name: /crawl/i }); + await expect(crawlButton).toBeVisible(); + + // Handle the alert + page.on('dialog', dialog => dialog.accept()); + await crawlButton.click(); + + // 4. Go to Home and check for items + await page.goto('/v2/'); + + // The mock feed has "Mock Item 1" and "Mock Item 2" + await expect(page.getByText('Mock Item 1')).toBeVisible({ timeout: 10000 }); + await expect(page.getByText('Mock Item 2')).toBeVisible({ timeout: 10000 }); + }); +}); -- cgit v1.2.3