Commit b4a152ccea1383a88fee1bd864fbdc19aacf327f

Authored by zichun
1 parent 398543d3

feat(usr): user update DTO REQ-USR-002

backend/src/main/java/com/xly/erp/module/usr/dto/UserUpdateDTO.java 0 → 100644
  1 +package com.xly.erp.module.usr.dto;
  2 +
  3 +import jakarta.validation.constraints.NotBlank;
  4 +import jakarta.validation.constraints.Pattern;
  5 +import lombok.Data;
  6 +
  7 +import java.util.List;
  8 +
  9 +/**
  10 + * REQ-USR-002 用户修改入参。
  11 + * 与 {@link UserCreateDTO} 相比剥除 sUserNo / sUserName(登录身份不可改);
  12 + * 密码不通过本接口修改,亦不在 DTO 里。
  13 + */
  14 +@Data
  15 +public class UserUpdateDTO {
  16 +
  17 + /** 可空:null 表示清空员工关联(service 层借 iStaffId.IGNORED 策略写入 NULL) */
  18 + private Integer iStaffId;
  19 +
  20 + @NotBlank
  21 + @Pattern(regexp = "^(普通用户|超级管理员)$", message = "sUserType 必须是 普通用户/超级管理员 之一")
  22 + private String sUserType;
  23 +
  24 + @NotBlank
  25 + @Pattern(regexp = "^(zh|en|zh-TW)$", message = "sLanguage 必须是 zh/en/zh-TW 之一")
  26 + private String sLanguage;
  27 +
  28 + /** 可空:null 表示保持原值;显式覆盖 */
  29 + private Boolean bCanModifyDocs;
  30 +
  31 + /** 可空:每元素须存在且未软删除;空数组 / null 都视为清空全部授权关联 */
  32 + private List<Integer> permissionCategoryIds;
  33 +}
backend/src/test/java/com/xly/erp/module/usr/dto/UserUpdateDTOValidationTest.java 0 → 100644
  1 +package com.xly.erp.module.usr.dto;
  2 +
  3 +import jakarta.validation.ConstraintViolation;
  4 +import jakarta.validation.Validation;
  5 +import jakarta.validation.Validator;
  6 +import jakarta.validation.ValidatorFactory;
  7 +import org.junit.jupiter.api.Test;
  8 +
  9 +import java.util.List;
  10 +import java.util.Set;
  11 +
  12 +import static org.assertj.core.api.Assertions.assertThat;
  13 +
  14 +class UserUpdateDTOValidationTest {
  15 +
  16 + private static final ValidatorFactory FACTORY = Validation.buildDefaultValidatorFactory();
  17 + private final Validator validator = FACTORY.getValidator();
  18 +
  19 + private UserUpdateDTO valid() {
  20 + UserUpdateDTO d = new UserUpdateDTO();
  21 + d.setSUserType("超级管理员");
  22 + d.setSLanguage("en");
  23 + d.setBCanModifyDocs(true);
  24 + d.setIStaffId(7);
  25 + d.setPermissionCategoryIds(List.of(1, 2));
  26 + return d;
  27 + }
  28 +
  29 + @Test
  30 + void allValidFields_yieldsNoViolations() {
  31 + Set<ConstraintViolation<UserUpdateDTO>> v = validator.validate(valid());
  32 + assertThat(v).isEmpty();
  33 + }
  34 +
  35 + @Test
  36 + void blankRequiredFields_yieldsViolations() {
  37 + UserUpdateDTO d = new UserUpdateDTO();
  38 + Set<ConstraintViolation<UserUpdateDTO>> v = validator.validate(d);
  39 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString())
  40 + .contains("sUserType", "sLanguage");
  41 + }
  42 +
  43 + @Test
  44 + void invalidUserTypeEnum_yieldsViolation() {
  45 + UserUpdateDTO d = valid();
  46 + d.setSUserType("非法值");
  47 + Set<ConstraintViolation<UserUpdateDTO>> v = validator.validate(d);
  48 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("sUserType");
  49 + }
  50 +
  51 + @Test
  52 + void invalidLanguageEnum_yieldsViolation() {
  53 + UserUpdateDTO d = valid();
  54 + d.setSLanguage("fr");
  55 + Set<ConstraintViolation<UserUpdateDTO>> v = validator.validate(d);
  56 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("sLanguage");
  57 + }
  58 +}