Commit 0da97ed59eccdd678379dd6e9007072a77a7f03b

Authored by zichun
1 parent f445e19d

feat(mod): module update DTO REQ-MOD-002

backend/src/main/java/com/xly/erp/module/mod/dto/ModuleUpdateDTO.java 0 → 100644
  1 +package com.xly.erp.module.mod.dto;
  2 +
  3 +import jakarta.validation.constraints.Min;
  4 +import jakarta.validation.constraints.NotBlank;
  5 +import jakarta.validation.constraints.Pattern;
  6 +import jakarta.validation.constraints.Size;
  7 +import lombok.Data;
  8 +
  9 +/**
  10 + * REQ-MOD-002 模块修改入参。
  11 + * 与 {@link ModuleCreateDTO} 相比剥除了 sProcedureName(不可改);其余 7 个字段规则一致。
  12 + */
  13 +@Data
  14 +public class ModuleUpdateDTO {
  15 +
  16 + @NotBlank
  17 + @Pattern(regexp = "^(手机端|前端业务|系统配置|接口)$", message = "sDisplayType 必须是 手机端/前端业务/系统配置/接口 之一")
  18 + private String sDisplayType;
  19 +
  20 + @NotBlank
  21 + @Size(max = 50)
  22 + private String sModuleType;
  23 +
  24 + @NotBlank
  25 + @Size(max = 50)
  26 + private String sManageDeptEn;
  27 +
  28 + /** 可空:null 表示保持原值 */
  29 + private Boolean bShowPermission;
  30 +
  31 + @NotBlank
  32 + @Size(max = 100)
  33 + private String sModuleNameZh;
  34 +
  35 + /** 可空:null 表示设为根模块 */
  36 + private Integer iParentId;
  37 +
  38 + /** 可空:null 表示保持原值 */
  39 + @Min(0)
  40 + private Integer iSortOrder;
  41 +}
backend/src/test/java/com/xly/erp/module/mod/dto/ModuleUpdateDTOValidationTest.java 0 → 100644
  1 +package com.xly.erp.module.mod.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.Set;
  10 +
  11 +import static org.assertj.core.api.Assertions.assertThat;
  12 +
  13 +class ModuleUpdateDTOValidationTest {
  14 +
  15 + private static final ValidatorFactory FACTORY = Validation.buildDefaultValidatorFactory();
  16 + private final Validator validator = FACTORY.getValidator();
  17 +
  18 + private ModuleUpdateDTO valid() {
  19 + ModuleUpdateDTO d = new ModuleUpdateDTO();
  20 + d.setSDisplayType("前端业务");
  21 + d.setSModuleType("USR");
  22 + d.setSManageDeptEn("IT");
  23 + d.setBShowPermission(true);
  24 + d.setSModuleNameZh("用户管理(修订)");
  25 + d.setIParentId(null);
  26 + d.setISortOrder(0);
  27 + return d;
  28 + }
  29 +
  30 + @Test
  31 + void allValidFields_yieldsNoViolations() {
  32 + Set<ConstraintViolation<ModuleUpdateDTO>> v = validator.validate(valid());
  33 + assertThat(v).isEmpty();
  34 + }
  35 +
  36 + @Test
  37 + void blankRequiredFields_yieldsViolations() {
  38 + ModuleUpdateDTO d = new ModuleUpdateDTO();
  39 + Set<ConstraintViolation<ModuleUpdateDTO>> v = validator.validate(d);
  40 + // 5 个 @NotBlank:sDisplayType / sModuleType / sManageDeptEn / sModuleNameZh
  41 + // (bShowPermission / iParentId / iSortOrder 可空)
  42 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString())
  43 + .contains("sDisplayType", "sModuleType", "sManageDeptEn", "sModuleNameZh");
  44 + }
  45 +
  46 + @Test
  47 + void invalidDisplayTypeEnum_yieldsViolation() {
  48 + ModuleUpdateDTO d = valid();
  49 + d.setSDisplayType("非法值");
  50 + Set<ConstraintViolation<ModuleUpdateDTO>> v = validator.validate(d);
  51 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("sDisplayType");
  52 + }
  53 +
  54 + @Test
  55 + void negativeSortOrder_yieldsViolation() {
  56 + ModuleUpdateDTO d = valid();
  57 + d.setISortOrder(-1);
  58 + Set<ConstraintViolation<ModuleUpdateDTO>> v = validator.validate(d);
  59 + assertThat(v).extracting(cv -> cv.getPropertyPath().toString()).contains("iSortOrder");
  60 + }
  61 +}