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.HashMap; import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; class DmsWenjianBianhaoMapperXmlTest { private static final List MAPPERS = Arrays.asList( "DmsWenjianBianhaoGuizeMapper", "DmsWenjianBianhaoGuizeZixiangMapper", "DmsWenjianBianhaoLiushuiJishuMapper", "DmsWenjianBianhaoMapper", "DmsWenjianBianhaoShenqingMapper", "DmsWenjianMingchengBiangengShenqingMapper"); @Test void allFileNumberMappersUseXmlWithoutSelectStar() 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 applicationFlowStateHasExplicitResultMapping() throws IOException { Configuration configuration = parse(resource("DmsWenjianBianhaoShenqingMapper")); assertMapping(configuration, DmsWenjianBianhaoShenqingMapper.class.getName() + ".selectByFlowForUpdate", "f_flow_state", "flowState"); } @Test void nameChangeFlowStateHasExplicitResultMapping() throws IOException { Configuration configuration = parse( resource("DmsWenjianMingchengBiangengShenqingMapper")); assertMapping(configuration, DmsWenjianMingchengBiangengShenqingMapper.class.getName() + ".selectByFlowForUpdate", "f_flow_state", "flowState"); } @Test void usingNumberCandidatesExcludeActiveNameChangesButEchoRemainsAvailable() throws IOException { Configuration configuration = parse(resource("DmsWenjianBianhaoMapper")); String statementId = DmsWenjianBianhaoMapper.class.getName() + ".selectUsingPage"; Map parameters = new HashMap<>(); parameters.put("bianhaoId", ""); parameters.put("keyword", ""); String candidateSql = normalize(configuration.getMappedStatement(statementId) .getBoundSql(parameters).getSql()); assertTrue(candidateSql.contains("NOT EXISTS")); assertTrue(candidateSql.contains("c.f_flow_state IN (1, 5, 6, 8, 10)")); parameters.put("bianhaoId", "number-1"); String echoSql = normalize(configuration.getMappedStatement(statementId) .getBoundSql(parameters).getSql()); assertFalse(echoSql.contains("NOT EXISTS")); assertTrue(echoSql.contains("b.f_id = ?")); } 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 normalize(String sql) { return sql.replaceAll("\\s+", " ").trim(); } private String resource(String mapper) { return "mapper/" + mapper + ".xml"; } }