aboutsummaryrefslogtreecommitdiffstats
path: root/frontend/src/App.test.tsx
blob: 27b9da2063dd7860cf2bca7b2e408ce8154e77a7 (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
import React from 'react';
import '@testing-library/jest-dom';
import { render, screen, waitFor, fireEvent } from '@testing-library/react';
import App from './App';
import { describe, it, expect, vi, beforeEach } from 'vitest';

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

  it('renders login on initial load (unauthenticated)', async () => {
    vi.mocked(global.fetch).mockResolvedValueOnce({
      ok: false,
    } as Response);
    window.history.pushState({}, 'Test page', '/v2/login');
    render(<App />);
    expect(await screen.findByRole('button', { name: /login/i })).toBeInTheDocument();
  });

  it('renders dashboard when authenticated', async () => {
    vi.mocked(global.fetch).mockImplementation((url) => {
      const urlStr = url.toString();
      if (urlStr.includes('/api/auth')) return Promise.resolve({ ok: true } as Response);
      if (urlStr.includes('/api/feed/')) return Promise.resolve({ ok: true, json: async () => [] } as Response);
      if (urlStr.includes('/api/tag')) return Promise.resolve({ ok: true, json: async () => [] } as Response);
      return Promise.resolve({ ok: true } as Response); // Fallback
    });

    window.history.pushState({}, 'Test page', '/v2/');
    render(<App />);

    await waitFor(() => {
      expect(screen.getByText('🐱')).toBeInTheDocument();
    });

    // Test Logout
    const logoutBtn = screen.getByText(/logout/i);
    expect(logoutBtn).toBeInTheDocument();

    // Mock window.location
    Object.defineProperty(window, 'location', {
      configurable: true,
      value: { href: '' },
    });

    vi.mocked(global.fetch).mockResolvedValueOnce({ ok: true } as Response);

    fireEvent.click(logoutBtn);

    await waitFor(() => {
      expect(global.fetch).toHaveBeenCalledWith(
        '/api/logout',
        expect.objectContaining({ method: 'POST' })
      );
      expect(window.location.href).toBe('/v2/#/login');
    });
  });
});