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<String> 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<String, Object> 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";
|
}
|
}
|