perf: 模型管理界面重做

This commit is contained in:
2026-03-11 20:33:04 +08:00
parent 219fa566ef
commit 373d7f8201
37 changed files with 4120 additions and 2108 deletions

View File

@@ -0,0 +1,152 @@
import {mount} from '@vue/test-utils';
import {nextTick} from 'vue';
import {beforeEach, describe, expect, it, vi} from 'vitest';
import AuthenticationLogin from '../login.vue';
const { formApi, routerPush } = vi.hoisted(() => ({
formApi: {
getValues: vi.fn(),
setFieldValue: vi.fn(),
validate: vi.fn(),
},
routerPush: vi.fn(),
}));
vi.mock('vue-router', () => ({
useRouter: () => ({
push: routerPush,
}),
}));
vi.mock('@easyflow/locales', () => ({
$t: (key: string) => key,
}));
vi.mock('@easyflow-core/form-ui', async () => {
const vue = await import('vue');
return {
useEasyFlowForm: () => [
vue.defineComponent({
name: 'MockEasyFlowForm',
setup() {
return () => vue.h('div', { class: 'mock-form' });
},
}),
formApi,
],
};
});
vi.mock('@easyflow-core/shadcn-ui', async (importOriginal) => {
const vue = await import('vue');
const actual = await importOriginal<typeof import('@easyflow-core/shadcn-ui')>();
return {
...actual,
EasyFlowButton: vue.defineComponent({
name: 'EasyFlowButton',
props: {
loading: {
default: false,
type: Boolean,
},
},
emits: ['click'],
setup(props, { attrs, emit, slots }) {
return () =>
vue.h(
'button',
{
...attrs,
'data-loading': String(props.loading),
type: 'button',
onClick: () => emit('click'),
},
slots.default?.(),
);
},
}),
EasyFlowCheckbox: vue.defineComponent({
name: 'EasyFlowCheckbox',
props: {
modelValue: {
default: false,
type: Boolean,
},
name: {
default: '',
type: String,
},
},
emits: ['update:modelValue'],
setup(props, { emit, slots }) {
return () =>
vue.h('label', [
vue.h('input', {
checked: props.modelValue,
name: props.name,
type: 'checkbox',
onChange: (event: Event) => {
emit(
'update:modelValue',
(event.target as HTMLInputElement).checked,
);
},
}),
slots.default?.(),
]);
},
}),
};
});
describe('AuthenticationLogin', () => {
const rememberKey = `REMEMBER_ME_ACCOUNT_${location.hostname}`;
beforeEach(() => {
localStorage.clear();
vi.clearAllMocks();
formApi.validate.mockResolvedValue({ valid: true });
formApi.getValues.mockResolvedValue({ account: 'admin' });
});
it('restores remembered account into the account field', async () => {
localStorage.setItem(rememberKey, 'remembered-user');
mount(AuthenticationLogin, {
props: {
formSchema: [],
},
});
await nextTick();
expect(formApi.setFieldValue).toHaveBeenCalledWith(
'account',
'remembered-user',
);
});
it('persists remembered account using the account field and renders overlay slot', async () => {
localStorage.setItem(rememberKey, 'remembered-user');
const wrapper = mount(AuthenticationLogin, {
props: {
formSchema: [],
showRememberMe: true,
},
slots: {
overlay: '<div id="captcha-box"></div>',
},
});
await nextTick();
await wrapper.get('button').trigger('click');
expect(localStorage.getItem(rememberKey)).toBe('admin');
expect(wrapper.emitted('submit')?.[0]).toEqual([{ account: 'admin' }]);
expect(wrapper.find('#captcha-box').exists()).toBe(true);
});
});