刘光辉
3 小时以前 cf11e63b659afcc9792ab3e395f1b45d844431a8
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
82
83
84
85
86
87
88
89
90
91
92
93
94
import { ref } from 'vue';
 
import { describe, expect, it, vi } from 'vitest';
 
import { useFlowForm } from './useFlowForm';
 
vi.mock('@jnpf/hooks', () => ({ useMessage: () => ({ createMessage: { error: vi.fn() } }) }));
vi.mock('@vben/stores', () => ({ useUserStore: () => ({ getUserInfo: {} }) }));
vi.mock('#/api/system/billRule', () => ({ getBillNumber: vi.fn() }));
 
function createForm(validate: () => Promise<any>, onSubmit: () => void) {
  const emit = vi.fn(onSubmit);
  const formRef = ref({ validate });
  const { dataFormSubmit } = useFlowForm({ config: {}, selfState: { dataForm: {}, dataRule: {} }, emit, formRef } as any);
  return { dataFormSubmit, emit };
}
 
describe('useFlowForm post-validation step', () => {
  it.each(['save', 'saveAudit', 'saveAssist'])('preserves incomplete form and child rows without validation for %s', async (eventType) => {
    const validate = vi.fn().mockRejectedValue(new Error('required field missing'));
    const selfExist = vi.fn(() => false);
    const afterValidation = vi.fn(async () => false);
    const emit = vi.fn();
    const formData = {
      title: '',
      rows: [
        { id: 'existing', name: '' },
        { name: 'unfinished', amount: null },
      ],
    };
    const { dataFormSubmit } = useFlowForm({
      config: {},
      selfState: { dataForm: formData, dataRule: {} },
      emit,
      formRef: ref({ validate }),
      selfExist,
    } as any);
 
    await dataFormSubmit(eventType, 1, afterValidation);
 
    expect(validate).not.toHaveBeenCalled();
    expect(selfExist).not.toHaveBeenCalled();
    expect(afterValidation).not.toHaveBeenCalled();
    expect(emit).toHaveBeenCalledExactlyOnceWith('eventReceiver', { formData }, eventType);
  });
 
  it.each(['submit', 'delegateSubmit', 'audit', 'reject', 'freeApprover'])('still blocks invalid data for %s', async (eventType) => {
    const validate = vi.fn().mockRejectedValue(new Error('required field missing'));
    const { dataFormSubmit, emit } = createForm(validate, vi.fn());
 
    await dataFormSubmit(eventType, 1);
 
    expect(validate).toHaveBeenCalledOnce();
    expect(emit).not.toHaveBeenCalled();
  });
 
  it.each(['audit', 'reject'])('runs after validation and before submitting %s', async (eventType) => {
    const steps: string[] = [];
    const { dataFormSubmit } = createForm(
      async () => {
        steps.push('validate');
        return {};
      },
      () => steps.push('submit'),
    );
 
    await dataFormSubmit(eventType, 1, async () => {
      steps.push('approval check');
      return true;
    });
 
    expect(steps).toEqual(['validate', 'approval check', 'submit']);
  });
 
  it('does not check approval when validation fails', async () => {
    const afterValidation = vi.fn(async () => true);
    const { dataFormSubmit, emit } = createForm(async () => {
      throw new Error('invalid');
    }, vi.fn());
 
    await dataFormSubmit('reject', 1, afterValidation);
 
    expect(afterValidation).not.toHaveBeenCalled();
    expect(emit).not.toHaveBeenCalled();
  });
 
  it('does not submit when approval check stops submission', async () => {
    const { dataFormSubmit, emit } = createForm(async () => ({}), vi.fn());
 
    await dataFormSubmit('reject', 1, async () => false);
 
    expect(emit).not.toHaveBeenCalled();
  });
});