package com.ruoyi.system.mapper; import org.apache.ibatis.annotations.Select; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.session.Configuration; import org.junit.jupiter.api.Test; import java.lang.reflect.Method; import java.math.BigDecimal; import java.util.Arrays; import java.util.Locale; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertTrue; class RiderPositionMapperContractTest { @Test void flashNotificationCandidatesMatchEligibilityAndExclusivityRules() throws Exception { Method method = RiderPositionMapper.class.getMethod("getFlashRiderNotificationList", BigDecimal.class, BigDecimal.class, int.class, String.class, Integer.class, int.class); String sql = Arrays.stream(method.getAnnotation(Select.class).value()) .reduce("", (left, right) -> left + " " + right) .replaceAll("\\s+", " ") .toLowerCase(Locale.ROOT); assertTrue(sql.contains("join info_user iu on iu.user_id=rp.rider_id")); assertTrue(sql.contains("iu.user_type='2'")); assertTrue(sql.contains("find_in_set('flash'")); assertTrue(sql.contains("#{vehicletype}")); assertTrue(sql.contains("st_distance_sphere")); assertTrue(sql.contains("#{distancelimitkm} * 1000")); assertTrue(sql.contains("from pos_order po")); assertTrue(sql.contains("from flash_delivery_order fdo")); assertTrue(sql.contains("fdo.delivery_type='urgent'")); assertTrue(sql.contains("limit #{num}")); } @Test void flashNotificationQueryParsesAsDynamicMyBatisSql() { Configuration configuration = new Configuration(); configuration.addMapper(RiderPositionMapper.class); Map parameters = Map.of( "longitude", BigDecimal.valueOf(121.5), "latitude", BigDecimal.valueOf(25.0), "vehicleType", 1, "deliveryType", "NORMAL", "distanceLimitKm", 5, "num", 20); BoundSql boundSql = configuration.getMappedStatement( RiderPositionMapper.class.getName() + ".getFlashRiderNotificationList") .getBoundSql(parameters); String sql = boundSql.getSql().replaceAll("\\s+", " ").toLowerCase(Locale.ROOT); assertTrue(sql.contains("iu.offline")); assertTrue(sql.contains("st_distance_sphere")); assertTrue(sql.contains("<= ? * 1000")); assertTrue(sql.contains("order by")); } }