From 087eb8f5feea91739008e6adc1cddc70bbbbee7a Mon Sep 17 00:00:00 2001 From: zichun Date: Wed, 29 Apr 2026 18:02:05 +0800 Subject: [PATCH] test(mod): module delete integration coverage REQ-MOD-003 --- backend/src/main/java/com/xly/erp/module/mod/controller/ModuleController.java | 7 +++++++ backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 0 deletions(-) diff --git a/backend/src/main/java/com/xly/erp/module/mod/controller/ModuleController.java b/backend/src/main/java/com/xly/erp/module/mod/controller/ModuleController.java index 2115328..ca5ebd0 100644 --- a/backend/src/main/java/com/xly/erp/module/mod/controller/ModuleController.java +++ b/backend/src/main/java/com/xly/erp/module/mod/controller/ModuleController.java @@ -5,6 +5,7 @@ import com.xly.erp.module.mod.dto.CreateModuleDTO; import com.xly.erp.module.mod.dto.UpdateModuleDTO; import com.xly.erp.module.mod.service.ModuleService; import jakarta.validation.Valid; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -36,4 +37,10 @@ public class ModuleController { Integer updated = moduleService.update(id, dto); return Result.ok(Map.of("iIncrement", updated)); } + + @DeleteMapping("/modules/{id}") + public Result delete(@PathVariable Integer id) { + moduleService.delete(id); + return Result.ok(); + } } diff --git a/backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java b/backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java index 3ac3f96..92ff89f 100644 --- a/backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java +++ b/backend/src/test/java/com/xly/erp/module/mod/controller/ModuleControllerIT.java @@ -287,6 +287,107 @@ class ModuleControllerIT { assertThat(objectMapper.readTree(resp.getBody()).get("code").asInt()).isEqualTo(20001); } + @Test + void deleteValidId_with_jwt_returns200_andSoftDeletes() throws Exception { + Integer id = insertOriginal("sp_test_del_ok", "原", "ORIG_USER"); + String token = testJwtHelper.signFor("ADMIN001"); + HttpHeaders headers = jsonHeaders(); + headers.set("Authorization", "Bearer " + token); + + ResponseEntity resp = rest.exchange( + idUrl(id), HttpMethod.DELETE, new HttpEntity<>(headers), String.class); + + assertThat(resp.getStatusCode().value()).isEqualTo(200); + JsonNode jb = objectMapper.readTree(resp.getBody()); + assertThat(jb.get("code").asInt()).isZero(); + assertThat(jb.get("data").isNull()).isTrue(); + + Map row = jdbcTemplate.queryForMap( + "SELECT bDeleted, sDeletedBy, tDeletedDate, sProcedureName, sCreatedBy FROM tModule WHERE iIncrement = ?", id); + assertThat(row.get("bDeleted")).isEqualTo(true); + assertThat(row.get("sDeletedBy")).isEqualTo("ADMIN001"); + assertThat(row.get("tDeletedDate")).isNotNull(); + assertThat(row.get("sProcedureName")).isEqualTo("sp_test_del_ok"); + assertThat(row.get("sCreatedBy")).isEqualTo("ORIG_USER"); + } + + @Test + void deleteNonExistentId_returns40400() throws Exception { + String token = testJwtHelper.signFor("ADMIN001"); + HttpHeaders headers = jsonHeaders(); + headers.set("Authorization", "Bearer " + token); + + ResponseEntity resp = rest.exchange( + idUrl(99999996), HttpMethod.DELETE, new HttpEntity<>(headers), String.class); + + assertThat(objectMapper.readTree(resp.getBody()).get("code").asInt()).isEqualTo(40400); + } + + @Test + void deleteAlreadyDeletedId_returns40400() throws Exception { + Integer id = insertOriginal("sp_test_del_already", "已删", "ORIG"); + jdbcTemplate.update("UPDATE tModule SET bDeleted = 1 WHERE iIncrement = ?", id); + String token = testJwtHelper.signFor("ADMIN001"); + HttpHeaders headers = jsonHeaders(); + headers.set("Authorization", "Bearer " + token); + + ResponseEntity resp = rest.exchange( + idUrl(id), HttpMethod.DELETE, new HttpEntity<>(headers), String.class); + + assertThat(objectMapper.readTree(resp.getBody()).get("code").asInt()).isEqualTo(40400); + } + + @Test + void deleteWithActiveChildren_returns40901() throws Exception { + Integer rootId = insertOriginal("sp_test_del_root", "根", "ORIG"); + jdbcTemplate.update( + "INSERT INTO tModule (sBrandsId, sSubsidiaryId, tCreateDate, sDisplayType, sProcedureName, " + + "sModuleType, sManageDeptEn, bShowPermission, sModuleNameZh, iParentId, iSortOrder, sCreatedBy, bDeleted) " + + "VALUES ('XLY','XLY', NOW(), '手机端', 'sp_test_del_child', '业务模块', 'IT', 0, '子', ?, 0, 'ORIG', 0)", + rootId); + String token = testJwtHelper.signFor("ADMIN001"); + HttpHeaders headers = jsonHeaders(); + headers.set("Authorization", "Bearer " + token); + + ResponseEntity resp = rest.exchange( + idUrl(rootId), HttpMethod.DELETE, new HttpEntity<>(headers), String.class); + + assertThat(objectMapper.readTree(resp.getBody()).get("code").asInt()).isEqualTo(40901); + Boolean stillAlive = jdbcTemplate.queryForObject( + "SELECT bDeleted FROM tModule WHERE iIncrement = ?", Boolean.class, rootId); + assertThat(stillAlive).isFalse(); + } + + @Test + void deleteWithoutJwt_permitAllStub_returns200_andDeletedByIsSTUB() throws Exception { + Integer id = insertOriginal("sp_test_del_nojwt", "原", "ORIG"); + HttpHeaders headers = jsonHeaders(); + + ResponseEntity resp = rest.exchange( + idUrl(id), HttpMethod.DELETE, new HttpEntity<>(headers), String.class); + + assertThat(objectMapper.readTree(resp.getBody()).get("code").asInt()).isZero(); + Map row = jdbcTemplate.queryForMap( + "SELECT bDeleted, sDeletedBy FROM tModule WHERE iIncrement = ?", id); + assertThat(row.get("bDeleted")).isEqualTo(true); + assertThat(row.get("sDeletedBy")).isEqualTo("STUB_ADMIN"); + } + + @Test + void deleteTamperedJwt_returns20001() throws Exception { + Integer id = insertOriginal("sp_test_del_tamper", "原", "ORIG"); + HttpHeaders headers = jsonHeaders(); + headers.set("Authorization", "Bearer not.a.real.jwt"); + + ResponseEntity resp = rest.exchange( + idUrl(id), HttpMethod.DELETE, new HttpEntity<>(headers), String.class); + + assertThat(objectMapper.readTree(resp.getBody()).get("code").asInt()).isEqualTo(20001); + Boolean stillAlive = jdbcTemplate.queryForObject( + "SELECT bDeleted FROM tModule WHERE iIncrement = ?", Boolean.class, id); + assertThat(stillAlive).isFalse(); + } + private Integer insertOriginal(String procedureName, String nameZh, String createdBy) { jdbcTemplate.update( "INSERT INTO tModule (sBrandsId, sSubsidiaryId, tCreateDate, sDisplayType, sProcedureName, " -- libgit2 0.22.2