WaterUserTerminologyTest.java 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package com.zksy.WaterSupply;
  2. import com.zksy.WaterSupply.PipeNetworkStatistics.dto.PipeNetworkStatisticsDashboardDTO;
  3. import com.zksy.WaterSupply.PipeNetworkStatistics.mapper.PipeNetworkStatisticsMapper;
  4. import com.zksy.WaterSupply.PipeNetworkStatistics.service.impl.PipeNetworkStatisticsExportServiceImpl;
  5. import com.zksy.WaterSupply.WaterSupplyGisMap.dto.GisFeatureCollectionDTO;
  6. import com.zksy.WaterSupply.WaterSupplyGisMap.mapper.WaterSupplyGisMapMapper;
  7. import com.zksy.WaterSupply.WaterSupplyGisMap.service.impl.WaterSupplyGisMapServiceImpl;
  8. import org.apache.ibatis.builder.xml.XMLMapperBuilder;
  9. import org.apache.ibatis.io.Resources;
  10. import org.apache.ibatis.mapping.MappedStatement;
  11. import org.apache.ibatis.session.Configuration;
  12. import org.apache.poi.ss.usermodel.Workbook;
  13. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  14. import org.junit.jupiter.api.Test;
  15. import org.junit.jupiter.api.extension.ExtendWith;
  16. import org.mockito.InjectMocks;
  17. import org.mockito.Mock;
  18. import org.mockito.junit.jupiter.MockitoExtension;
  19. import java.io.ByteArrayInputStream;
  20. import java.io.ByteArrayOutputStream;
  21. import java.io.InputStream;
  22. import java.math.BigDecimal;
  23. import java.util.Collections;
  24. import java.util.List;
  25. import java.util.Map;
  26. import java.util.Set;
  27. import java.util.stream.Collectors;
  28. import static org.junit.jupiter.api.Assertions.assertEquals;
  29. import static org.junit.jupiter.api.Assertions.assertFalse;
  30. import static org.junit.jupiter.api.Assertions.assertNotNull;
  31. import static org.junit.jupiter.api.Assertions.assertNull;
  32. import static org.junit.jupiter.api.Assertions.assertTrue;
  33. import static org.mockito.Mockito.when;
  34. @ExtendWith(MockitoExtension.class)
  35. class WaterUserTerminologyTest {
  36. @Mock
  37. private WaterSupplyGisMapMapper gisMapper;
  38. @InjectMocks
  39. private WaterSupplyGisMapServiceImpl gisService;
  40. @Test
  41. void gisUserLayerReturnsEveryWaterUserCategoryWithUnifiedName() {
  42. when(gisMapper.selectUserFeatures()).thenReturn(List.of(
  43. userRow(1L, "RESIDENT", "居民用水户"),
  44. userRow(2L, "INDUSTRIAL", "工业用水户"),
  45. userRow(3L, "COMMERCIAL", "商业用水户"),
  46. userRow(4L, "PUBLIC", "行政事业用水户")
  47. ));
  48. GisFeatureCollectionDTO result = gisService.getFeatures(Set.of("user"));
  49. assertEquals(4, result.getFeatures().size());
  50. assertEquals(Set.of("RESIDENT", "INDUSTRIAL", "COMMERCIAL", "PUBLIC"),
  51. result.getFeatures().stream()
  52. .map(feature -> (String) feature.getProperties().get("code"))
  53. .collect(Collectors.toSet()));
  54. result.getFeatures().forEach(feature -> {
  55. assertEquals("user", feature.getProperties().get("facilityType"));
  56. assertEquals("用水户", feature.getProperties().get("facilityTypeName"));
  57. });
  58. }
  59. @Test
  60. void mapperOverviewKeepsUserCodeAndLabelsAllWaterUsersWithoutCategoryFilter() throws Exception {
  61. String gisOverviewSql = mappedSql(
  62. "mapper/WaterSupply/WaterSupplyGisMap/WaterSupplyGisMapMapper.xml",
  63. WaterSupplyGisMapMapper.class,
  64. "selectOverview",
  65. null
  66. );
  67. String gisUsersSql = mappedSql(
  68. "mapper/WaterSupply/WaterSupplyGisMap/WaterSupplyGisMapMapper.xml",
  69. WaterSupplyGisMapMapper.class,
  70. "selectUserFeatures",
  71. null
  72. );
  73. String statisticsOverviewSql = mappedSql(
  74. "mapper/WaterSupply/PipeNetworkStatistics/PipeNetworkStatisticsMapper.xml",
  75. PipeNetworkStatisticsMapper.class,
  76. "selectFacilityOverview",
  77. Collections.singletonMap("status", null)
  78. );
  79. assertTrue(gisOverviewSql.contains("SELECT 'user', '用水户'"));
  80. assertTrue(statisticsOverviewSql.contains("SELECT 'user', '用水户'"));
  81. assertFalse(gisOverviewSql.contains("大用水户"));
  82. assertFalse(statisticsOverviewSql.contains("大用水户"));
  83. assertTrue(gisUsersSql.contains("FROM app_user.water_user_info"));
  84. assertFalse(gisUsersSql.matches("(?is).*\\buser_type\\s*=.*"),
  85. "the user GIS layer must not restrict resident, industrial, commercial, or public-service users");
  86. assertFalse(statisticsOverviewSql.matches("(?is).*\\buser_type\\s*=.*"),
  87. "facility statistics must include every water user category");
  88. }
  89. @Test
  90. void statisticsExportCreatesUnifiedWaterUserWorksheet() throws Exception {
  91. ByteArrayOutputStream output = new ByteArrayOutputStream();
  92. new PipeNetworkStatisticsExportServiceImpl().write(output, new PipeNetworkStatisticsDashboardDTO());
  93. try (Workbook workbook = new XSSFWorkbook(new ByteArrayInputStream(output.toByteArray()))) {
  94. assertNotNull(workbook.getSheet("用水户统计"));
  95. assertNull(workbook.getSheet("大用水户统计"));
  96. }
  97. }
  98. private Map<String, Object> userRow(Long id, String code, String name) {
  99. return Map.of(
  100. "id", id,
  101. "code", code,
  102. "name", name,
  103. "status", "0",
  104. "location", "测试地址",
  105. "longitude", new BigDecimal("113.12345678"),
  106. "latitude", new BigDecimal("23.12345678")
  107. );
  108. }
  109. private String mappedSql(String resource, Class<?> mapperType, String statementId, Object parameter) throws Exception {
  110. Configuration configuration = new Configuration();
  111. configuration.addMapper(mapperType);
  112. try (InputStream input = Resources.getResourceAsStream(resource)) {
  113. new XMLMapperBuilder(input, configuration, resource, configuration.getSqlFragments()).parse();
  114. }
  115. MappedStatement statement = configuration.getMappedStatement(mapperType.getName() + "." + statementId);
  116. return statement.getBoundSql(parameter).getSql().replaceAll("\\s+", " ").trim();
  117. }
  118. }