FlashDeliveryMapperXmlTest.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package com.ruoyi.system.mapper.flash;
  2. import com.ruoyi.system.domain.flash.FlashDeliveryOrder;
  3. import org.apache.ibatis.builder.xml.XMLMapperBuilder;
  4. import org.apache.ibatis.mapping.ResultMapping;
  5. import org.apache.ibatis.session.Configuration;
  6. import org.junit.jupiter.api.Test;
  7. import java.io.InputStream;
  8. import java.nio.charset.StandardCharsets;
  9. import java.util.Set;
  10. import java.util.stream.Collectors;
  11. import static org.junit.jupiter.api.Assertions.assertEquals;
  12. import static org.junit.jupiter.api.Assertions.assertFalse;
  13. import static org.junit.jupiter.api.Assertions.assertNotNull;
  14. import static org.junit.jupiter.api.Assertions.assertTrue;
  15. class FlashDeliveryMapperXmlTest {
  16. @Test
  17. void stationFulfilmentLocksOrderAndPersistsExplicitTargetReset() throws Exception {
  18. String resource = "mapper/flash/FlashDeliveryOrderMapper.xml";
  19. Configuration configuration = new Configuration();
  20. configuration.getTypeAliasRegistry().registerAlias("FlashDeliveryOrder", FlashDeliveryOrder.class);
  21. try (InputStream input = getClass().getClassLoader().getResourceAsStream(resource)) {
  22. new XMLMapperBuilder(input, configuration, resource, configuration.getSqlFragments()).parse();
  23. }
  24. String namespace = "com.ruoyi.system.mapper.flash.FlashDeliveryOrderMapper.";
  25. String lock = configuration.getMappedStatement(namespace + "selectByIdForUpdate")
  26. .getBoundSql(java.util.Map.of("id", 10L)).getSql().replaceAll("\\s+", " ").toLowerCase();
  27. assertTrue(lock.endsWith("for update"));
  28. FlashDeliveryOrder order = new FlashDeliveryOrder(); order.setId(10L); order.setVersion(3);
  29. var bound = configuration.getMappedStatement(namespace + "updateFulfilment").getBoundSql(java.util.Map.of("order", order));
  30. String sql = bound.getSql().replaceAll("\\s+", " ").toLowerCase();
  31. assertTrue(sql.contains("current_target_stop_id = ?"));
  32. assertTrue(sql.contains("picked_up_stop_count = ?"));
  33. assertTrue(sql.contains("status = 'accepted' and version = ?"));
  34. assertTrue(sql.contains("version = version + 1"));
  35. assertTrue(bound.getParameterMappings().stream().anyMatch(p -> p.getProperty().equals("order.currentTargetStopId")));
  36. }
  37. @Test
  38. void stationAndAdjustmentMappingsPreserveItemsAndDeclarationIdentity() throws Exception {
  39. for (String name : java.util.List.of("FlashDeliveryOrderStop", "FlashDeliveryTargetAdjustment")) {
  40. String resource = "mapper/flash/" + name + "Mapper.xml";
  41. Configuration configuration = new Configuration();
  42. try (InputStream input = getClass().getClassLoader().getResourceAsStream(resource)) {
  43. new XMLMapperBuilder(input, configuration, resource, configuration.getSqlFragments()).parse();
  44. }
  45. Set<String> properties = configuration.getResultMap("com.ruoyi.system.mapper.flash." + name + "Mapper." + name + "Result")
  46. .getResultMappings().stream().map(ResultMapping::getProperty).collect(Collectors.toSet());
  47. if (name.equals("FlashDeliveryOrderStop")) {
  48. assertTrue(properties.containsAll(Set.of("orderId", "stopType", "stopOrder", "packageType", "quantity", "weightRange", "specification", "status", "pickedUpAt")));
  49. } else {
  50. assertTrue(properties.containsAll(Set.of("fromStopId", "toStopId", "riderId", "clientRequestId", "orderVersion", "reason", "consentDeclared", "createTime")));
  51. }
  52. }
  53. }
  54. @Test
  55. void waitingOrderEditsGuardOwnerStatusRiderAndVersionInOneUpdate() throws Exception {
  56. String resource = "mapper/flash/FlashDeliveryOrderMapper.xml";
  57. Configuration configuration = new Configuration();
  58. configuration.getTypeAliasRegistry().registerAlias("FlashDeliveryOrder", FlashDeliveryOrder.class);
  59. try (InputStream input = getClass().getClassLoader().getResourceAsStream(resource)) {
  60. new XMLMapperBuilder(input, configuration, resource, configuration.getSqlFragments()).parse();
  61. }
  62. for (String name : java.util.List.of("updateWaitingAddress", "updateWaitingTip")) {
  63. String statement = "com.ruoyi.system.mapper.flash.FlashDeliveryOrderMapper." + name;
  64. assertTrue(configuration.hasStatement(statement), "Missing atomic update: " + name);
  65. var sql = configuration.getMappedStatement(statement)
  66. .getBoundSql(java.util.Map.of("order", new FlashDeliveryOrder(), "expectedVersion", 2));
  67. String text = sql.getSql().replaceAll("\\s+", " ").toLowerCase();
  68. String where = text.substring(text.indexOf("where"));
  69. assertTrue(where.contains("id = ?"));
  70. assertTrue(where.contains("user_id = ?"));
  71. assertTrue(where.contains("status = 'waiting_acceptance'"));
  72. assertTrue(where.contains("rider_id is null"));
  73. assertTrue(where.contains("version = ?"));
  74. assertTrue(text.contains("version = version + 1"));
  75. var bindings = sql.getParameterMappings().stream().map(item -> item.getProperty()).toList();
  76. assertTrue(bindings.containsAll(java.util.List.of("order.id", "order.userId", "expectedVersion")));
  77. if (name.equals("updateWaitingAddress")) {
  78. assertTrue(text.contains("receiver_user_id = ?"));
  79. assertTrue(bindings.containsAll(java.util.List.of("order.pickupPhone", "order.deliveryPhone",
  80. "order.pickupLongitude", "order.deliveryLatitude", "order.distanceMeters",
  81. "order.baseDeliveryFee", "order.urgentFee", "order.amount")));
  82. } else {
  83. assertFalse(text.contains("pickup_"));
  84. assertFalse(text.contains("base_delivery_fee ="));
  85. }
  86. }
  87. }
  88. @Test
  89. void receiverLookupRequiresUniqueEligibleNormalizedPhoneCandidate() throws Exception {
  90. String resource = "mapper/infouser/InfoUserMapper.xml";
  91. String xml;
  92. try (InputStream input = getClass().getClassLoader().getResourceAsStream(resource)) {
  93. assertNotNull(input);
  94. xml = new String(input.readAllBytes(), StandardCharsets.UTF_8).toLowerCase();
  95. }
  96. assertTrue(xml.contains("selectordinaryuseridsbynormalizedphone"));
  97. assertTrue(xml.contains("user_type = '0'"));
  98. assertTrue(xml.contains("status = '0'"));
  99. assertTrue(xml.contains("del_flag = '0' or del_flag is null"));
  100. assertFalse(xml.contains("regexp_replace("));
  101. assertTrue(xml.contains("replace(phone, ' ', '')"));
  102. assertTrue(xml.contains("char(9)"));
  103. assertTrue(xml.contains("char(10)"));
  104. assertTrue(xml.contains("char(13)"));
  105. assertTrue(xml.contains("replace(replace(replace(replace(replace(replace(replace(replace(phone, "
  106. + "' ', ''), char(9), ''), char(10), ''), char(13), ''), '(', ''), ')', ''), '+', ''), "
  107. + "'-', '') = #{normalizedphone}"));
  108. assertTrue(xml.contains("limit 2"));
  109. }
  110. @Test
  111. void orderMapperMapsSnapshotsAndUsesConditionalAtomicUpdates() throws Exception {
  112. String resource = "mapper/flash/FlashDeliveryOrderMapper.xml";
  113. Configuration configuration = new Configuration();
  114. configuration.getTypeAliasRegistry().registerAlias("FlashDeliveryOrder", FlashDeliveryOrder.class);
  115. String xml;
  116. try (InputStream input = getClass().getClassLoader().getResourceAsStream(resource)) {
  117. assertNotNull(input);
  118. xml = new String(input.readAllBytes(), StandardCharsets.UTF_8);
  119. }
  120. try (InputStream input = getClass().getClassLoader().getResourceAsStream(resource)) {
  121. new XMLMapperBuilder(input, configuration, resource, configuration.getSqlFragments()).parse();
  122. }
  123. ResultMapping amount = configuration
  124. .getResultMap("com.ruoyi.system.mapper.flash.FlashDeliveryOrderMapper.FlashDeliveryOrderResult")
  125. .getResultMappings().stream().filter(item -> "amount".equals(item.getProperty()))
  126. .findFirst().orElseThrow();
  127. assertEquals("amount", amount.getColumn());
  128. ResultMapping weightRange = configuration
  129. .getResultMap("com.ruoyi.system.mapper.flash.FlashDeliveryOrderMapper.FlashDeliveryOrderResult")
  130. .getResultMappings().stream().filter(item -> "weightRange".equals(item.getProperty()))
  131. .findFirst().orElseThrow();
  132. assertEquals("weight_range", weightRange.getColumn());
  133. Set<String> mappedProperties = configuration
  134. .getResultMap("com.ruoyi.system.mapper.flash.FlashDeliveryOrderMapper.FlashDeliveryOrderResult")
  135. .getResultMappings().stream()
  136. .map(ResultMapping::getProperty)
  137. .collect(Collectors.toSet());
  138. assertTrue(mappedProperties.containsAll(Set.of(
  139. "receiverUserId",
  140. "deliveryType", "quantity", "weightRange", "specification",
  141. "pricingId", "pricingVersion", "pricingStartTime", "pricingEndTime",
  142. "startingDistance", "startingFare", "distance", "freight", "distanceFee",
  143. "baseDeliveryFee", "urgentRate", "minimumUrgentFee", "urgentFee", "tipAmount")));
  144. assertFalse(mappedProperties.contains("totalWeightKg"));
  145. assertFalse(mappedProperties.contains("packageSize"));
  146. assertTrue(xml.contains("status = 'WAITING_ACCEPTANCE'"));
  147. assertTrue(xml.contains("rider_id is null"));
  148. assertTrue(xml.contains("scheduled_pickup_start_at &lt;= #{now}"));
  149. assertTrue(xml.contains("package_type"));
  150. assertTrue(xml.contains("delivery_pin_code"));
  151. assertTrue(xml.contains("delivered_at &lt;="));
  152. assertTrue(xml.contains("version = version + 1"));
  153. assertTrue(xml.contains("receiver_user_id = #{userId}"));
  154. }
  155. }