aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/tests/e2e.spec.ts
blob: 3f4898a958abbc832f328f6faf0f2e9e975f4c77 (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
import { test, expect } from '@playwright/test';

test.describe('Neko Reader E2E', () => {
  test('should allow login, viewing feeds, and logout', async ({ page }) => {
    // 1. Go to Login
    await page.goto('/v2/login');
    await expect(page).toHaveTitle(/Neko/);

    // 2. Login
    // 2. Login
    // Password is empty by default in test env
    await page.click('button[type="submit"]');

    // Check for error message if login failed (optional, for debugging)
    // await expect(page.locator('.error-message')).toBeVisible({ timeout: 2000 }).catch(() => {});

    // 3. Verify Dashboard
    // Keep checking for /v2/ or /v2
    await expect(page).toHaveURL(/.*\/v2\/?$/);
    await expect(page.locator('h1.logo')).toContainText('🐱');
    await expect(page.getByText('Logout')).toBeVisible();

    // 4. Verify Feed List
    await page.click('text=Settings');
    await expect(page).toHaveURL(/.*\/v2\/settings/);

    // Add a feed
    const feedUrl = 'http://rss.cnn.com/rss/cnn_topstories.rss';
    await page.fill('input[type="url"]', feedUrl);
    await page.click('text=Add Feed');

    // Wait for it to appear
    await expect(page.getByText(feedUrl)).toBeVisible();

    // 5. Navigate to Feed
    await page.goto('/v2/');
    // Default view is now the stream.
    // It should NOT show "Select a feed" anymore.
    // Wait for items or "No items found" or loading state
    await expect(
      page
        .locator('.feed-items')
        .or(page.locator('.feed-items-loading'))
        .or(page.getByText('No items found'))
    ).toBeVisible({ timeout: 10000 });

    // 6. Verify Tag View
    // Go to a tag URL (simulated, since we can't easily add tags via UI in this test yet without setup)
    // But we can check if the route loads without crashing
    await page.goto('/v2/tag/Tech');
    // The TagView component might show "Category: Tech" or "Tag: Tech" or just items.
    // In the current FeedItems.tsx it doesn't show a header, but it should load.
    // The TagView component might show "Category: Tech" or "Tag: Tech" or just items.
    // In the current FeedItems.tsx it doesn't show a header, but it should load.
    await expect(
      page
        .locator('.feed-items')
        .or(page.locator('.feed-items-loading'))
        .or(page.getByText('No items found'))
    ).toBeVisible({ timeout: 10000 });

    // 7. Logout
    await page.click('text=Logout');
    await expect(page).toHaveURL(/.*\/v2\/login/);
  });
});