刘光辉
13 小时以前 0dfe84494048ce27ba8449831782128412d3eb13
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import { createPinia, setActivePinia } from 'pinia';
import { beforeEach, describe, expect, it, vi } from 'vitest';
 
import { fetchFillData } from '../../src/api/template-fill';
import { useTemplateFiller } from '../../src/composables/useTemplateFiller';
import type { OnlyOfficeBridge } from '../../src/onlyoffice/bridge';
 
vi.mock('../../src/api/template-fill', () => ({ fetchFillData: vi.fn() }));
 
const context = {
  apiBaseUrl: 'http://localhost:30000',
  bizDataId: 'record-1',
  bizModule: 'eln.template',
  bizScene: 'eln.template.fill',
  canFill: true,
  documentId: 'file-1',
  pluginVersion: '0.1.0',
  scope: 'onlyoffice:eln-template-fill',
  ticket: 'opaque-ticket',
};
 
function fixture(overrides: Partial<OnlyOfficeBridge> = {}) {
  let ready = () => undefined;
  const bridge: OnlyOfficeBridge = {
    applyFields: vi.fn().mockResolvedValue([]),
    bindLifecycle: vi.fn((callbacks) => {
      ready = callbacks.onReady;
      return vi.fn();
    }),
    getRuntimeOptions: vi.fn(() => context),
    inspectFields: vi.fn().mockResolvedValue([
      { alias: '名称', currentValue: '', internalId: '1', options: [], tag: 'eln.field.name', type: 'text' },
    ]),
    ...overrides,
  };
  const filler = useTemplateFiller(bridge);
  return { bridge, filler, ready: () => ready() };
}
 
describe('useTemplateFiller', () => {
  beforeEach(() => {
    setActivePinia(createPinia());
    vi.mocked(fetchFillData).mockReset().mockResolvedValue({ fields: {} });
  });
 
  it('enters an error state when SDK initialization times out', async () => {
    vi.useFakeTimers();
    const { filler } = fixture();
 
    await vi.advanceTimersByTimeAsync(5_000);
 
    expect(filler.store.status).toBe('error');
    expect(filler.store.message).toBe('ONLYOFFICE SDK 初始化超时');
    vi.useRealTimers();
  });
 
  it('reports an apply failure instead of remaining in working state', async () => {
    const applyFields = vi.fn().mockRejectedValue(new Error('文档写入失败'));
    const { filler, ready } = fixture({ applyFields });
    ready();
    await vi.waitFor(() => expect(filler.store.status).toBe('ready'));
    filler.store.setDraft('eln.field.name', '样品');
 
    await filler.apply();
 
    expect(filler.store.status).toBe('error');
    expect(filler.store.message).toBe('文档写入失败');
  });
 
  it('does not apply changes when canFill is false', async () => {
    const applyFields = vi.fn().mockResolvedValue([]);
    const { filler, ready } = fixture({ applyFields, getRuntimeOptions: () => ({ ...context, canFill: false }) });
    ready();
    await vi.waitFor(() => expect(filler.store.status).toBe('ready'));
    filler.store.setDraft('eln.field.name', '样品');
 
    await filler.apply();
 
    expect(applyFields).not.toHaveBeenCalled();
  });
});