userDetailMappers.test.ts 3.26 KB
// REQ-USR-001 / REQ-USR-002: 用户单据常量与提交映射纯函数单测(枚举/默认/正则/错误码 + toCreateReq/toUpdateReq/userVoToFormValues)
import { describe, it, expect } from 'vitest';
import {
  USER_TYPE_OPTIONS,
  LANGUAGE_OPTIONS,
  CREATE_DEFAULTS,
  USERNAME_PATTERN,
  ERR_VALIDATION,
  ERR_USERNAME_EXISTS,
  ERR_USER_NOT_FOUND,
  ERR_NO_PERMISSION,
  MODE_CREATE,
  MODE_EDIT,
  toCreateReq,
  toUpdateReq,
  userVoToFormValues,
  type UserFormValues,
} from '../../src/pages/usr/UserDetail/constants';
import type { UserVO } from '../../src/api/types';

function makeFormValues(over: Partial<UserFormValues> = {}): UserFormValues {
  return {
    sUserName: 'zhangsan',
    sUserNo: 'zs',
    iEmployeeId: 3,
    sUserType: '普通用户',
    sLanguage: '中文',
    iCanModifyBill: 0,
    iIsVoid: 0,
    ...over,
  };
}

describe('用户单据常量与映射', () => {
  it('constants enums and defaults', () => {
    expect(USER_TYPE_OPTIONS).toEqual(['普通用户', '超级管理员']);
    expect(LANGUAGE_OPTIONS).toEqual(['中文', '英文', '繁体']);
    expect(CREATE_DEFAULTS.sUserType).toBe('普通用户');
    expect(CREATE_DEFAULTS.iCanModifyBill).toBe(0);
    expect(CREATE_DEFAULTS.sLanguage).toBeUndefined();
    expect(USERNAME_PATTERN.test('ab_12')).toBe(true);
    expect(USERNAME_PATTERN.test('ab')).toBe(false);
    expect(USERNAME_PATTERN.test('有中文')).toBe(false);
    expect(ERR_VALIDATION).toBe(40001);
    expect(ERR_USERNAME_EXISTS).toBe(40901);
    expect(ERR_USER_NOT_FOUND).toBe(40401);
    expect(ERR_NO_PERMISSION).toBe(40301);
    expect(MODE_CREATE).toBe('create');
    expect(MODE_EDIT).toBe('edit');
  });

  it('toCreateReq maps form values + permissionIds (no password)', () => {
    const req = toCreateReq(makeFormValues({ iCanModifyBill: 1 }), [1, 2]);
    expect(req.sUserName).toBe('zhangsan');
    expect(req.sUserNo).toBe('zs');
    expect(req.iEmployeeId).toBe(3);
    expect(req.sUserType).toBe('普通用户');
    expect(req.sLanguage).toBe('中文');
    expect(req.iCanModifyBill).toBe(1);
    expect(req.permissionIds).toEqual([1, 2]);
    expect(req).not.toHaveProperty('initialPassword');
    expect(req).not.toHaveProperty('iIsVoid');
  });

  it('toUpdateReq maps without sUserName + includes iIsVoid + full permissionIds', () => {
    const req = toUpdateReq(makeFormValues({ iIsVoid: 1 }), [2, 3]);
    expect(req).not.toHaveProperty('sUserName');
    expect(req.iIsVoid).toBe(1);
    expect(req.permissionIds).toEqual([2, 3]);
    expect(req.sUserType).toBe('普通用户');
    expect(req.sLanguage).toBe('中文');
    expect(req.iCanModifyBill).toBe(0);
  });

  it('userVoToFormValues fills from UserVO', () => {
    const vo: UserVO = {
      id: 7,
      sUserName: 'zhangsan',
      employeeName: '张三',
      sUserNo: 'zs',
      departmentName: null,
      sUserType: '超级管理员',
      sLanguage: '英文',
      iIsVoid: 1,
      tLastLoginDate: null,
      sCreator: 'admin',
      tCreateDate: '2026-01-01T00:00:00',
    };
    const fv = userVoToFormValues(vo);
    expect(fv.sUserName).toBe('zhangsan');
    expect(fv.sUserNo).toBe('zs');
    expect(fv.sUserType).toBe('超级管理员');
    expect(fv.sLanguage).toBe('英文');
    expect(fv.iCanModifyBill).toBe(0);
    expect(fv.iIsVoid).toBe(1);
  });
});