summaryrefslogtreecommitdiff
path: root/frontend/src/lib/projectsPageLoad.test.ts
blob: baf1ceeb993a19a1a2f0920e2266abca096a3c10 (plain)
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
import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest';
import { render, screen, waitFor, cleanup } from '@testing-library/svelte';

vi.mock('../lib/client', () => {
  const real = vi.importActual<typeof import('../lib/client')>('../lib/client');
  return { ...real, listProjects: vi.fn() };
});

import ProjectsPage from '../pages/ProjectsPage.svelte';
import { listProjects } from '../lib/client';
import type { Project } from '../lib/types';

function project(i: number): Project {
  return {
    id: `p${i}`,
    name: `项目${i}`,
    description: null,
    draft_code: '',
    draft_generation: 0,
    created_at: '2026-09-17T01:00:00Z',
    updated_at: '2026-09-17T01:00:00Z'
  };
}

beforeEach(() => {
  vi.mocked(listProjects).mockReset();
});

afterEach(() => cleanup());

describe('projects page loads the list (159399 QA regression: load() existed but was wired nowhere, UI always showed 还没有项目)', () => {
  it('listProjects is called on mount and existing rows render', async () => {
    vi.mocked(listProjects).mockResolvedValue({ items: [project(1), project(2)] });
    render(ProjectsPage);
    await waitFor(() => expect(listProjects).toHaveBeenCalled());
    await screen.findByText('项目1');
    await screen.findByText('项目2');
    expect(screen.queryByText('还没有项目')).toBeNull();
  });

  it('load failure is surfaced as a visible error, not an empty "no projects" state', async () => {
    vi.mocked(listProjects).mockRejectedValue(new Error('HTTP500: server unavailable'));
    render(ProjectsPage);
    await screen.findByText(/server unavailable/);
  });
});