package jnpf.dmsMapper; import org.apache.ibatis.builder.xml.XMLMapperBuilder; import org.apache.ibatis.io.Resources; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ResultMapping; import org.apache.ibatis.session.Configuration; import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.util.Arrays; import java.util.List; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; class DmsWenjianBanbenMapperXmlTest { private static final List MAPPERS = Arrays.asList( "DmsWenjianBanbenKongzhiMapper", "DmsWenjianXinzengGuanliMapper", "DmsWenjianXinzengShenheMapper", "DmsWenjianXiudingShenqingMapper", "DmsWenjianXiudingShenheMapper"); @Test void allVersionMappersParseAndAvoidSelectStar() throws IOException { for (String mapper : MAPPERS) { String resource = resource(mapper); String xml; try (Reader reader = Resources.getResourceAsReader(resource)) { xml = read(reader); } assertFalse(xml.toUpperCase().contains("SELECT *"), resource); parse(resource); } } @Test void flowAndVersionFieldsHaveExplicitMappings() throws IOException { Configuration newAudit = parse(resource("DmsWenjianXinzengShenheMapper")); assertMapping(newAudit, DmsWenjianXinzengShenheMapper.class.getName() + ".selectByFlowForUpdate", "f_flow_state", "flowState"); assertMapping(newAudit, DmsWenjianXinzengShenheMapper.class.getName() + ".selectByFlowForUpdate", "shengxiao_banben_xuhao", "shengxiaoBanbenXuhao"); Configuration control = parse(resource("DmsWenjianBanbenKongzhiMapper")); assertMapping(control, DmsWenjianBanbenKongzhiMapper.class.getName() + ".selectByFileForUpdate", "biangeng_xuhao", "biangengXuhao"); } @Test void controlAdvanceChecksBothExpectedSequences() throws IOException { Configuration configuration = parse(resource("DmsWenjianBanbenKongzhiMapper")); MappedStatement statement = configuration.getMappedStatement( DmsWenjianBanbenKongzhiMapper.class.getName() + ".advance"); String sql = statement.getBoundSql(null).getSql().replaceAll("\\s+", " "); assertTrue(sql.contains("banben_xuhao = ?")); assertTrue(sql.contains("biangeng_xuhao = ?")); } private Configuration parse(String resource) throws IOException { Configuration configuration = new Configuration(); try (InputStream input = Resources.getResourceAsStream(resource)) { XMLMapperBuilder builder = new XMLMapperBuilder( input, configuration, resource, configuration.getSqlFragments()); builder.parse(); } return configuration; } private void assertMapping(Configuration configuration, String statementId, String column, String property) { MappedStatement statement = configuration.getMappedStatement(statementId); boolean mapped = statement.getResultMaps().stream() .flatMap(resultMap -> resultMap.getResultMappings().stream()) .anyMatch(mapping -> matches(mapping, column, property)); assertTrue(mapped, column + " must map explicitly to " + property); } private boolean matches(ResultMapping mapping, String column, String property) { return column.equals(mapping.getColumn()) && property.equals(mapping.getProperty()); } private String read(Reader reader) throws IOException { StringBuilder result = new StringBuilder(); char[] buffer = new char[2048]; int length; while ((length = reader.read(buffer)) >= 0) { result.append(buffer, 0, length); } return result.toString(); } private String resource(String mapper) { return "mapper/" + mapper + ".xml"; } }