Files
peipei-backend/play-admin/src/test/java/com/starry/admin/api/WxCustomOrderEvaluationApiTest.java
irving 79b516d81c
Some checks failed
Build and Push Backend / docker (push) Failing after 5s
test: 添加微信端优惠券、订单评价、订单管理和提现的API测试
新增四个API集成测试类:
- WxCouponControllerApiTest: 测试优惠券领取、查询、使用限制和白名单逻辑
- WxCustomOrderEvaluationApiTest: 测试订单评价创建和查询功能
- WxOrderInfoControllerApiTest: 测试随机订单接单、续单申请和隐私字段处理
- WxWithdrawControllerApiTest: 测试收益余额查询、提现申请和收益明细过滤

提高微信端核心业务流程的测试覆盖率
2025-11-02 10:32:16 -05:00

137 lines
6.2 KiB
Java

package com.starry.admin.api;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.starry.admin.common.apitest.ApiTestDataSeeder;
import com.starry.admin.modules.order.module.constant.OrderConstant;
import com.starry.admin.modules.order.module.entity.PlayOrderInfoEntity;
import com.starry.admin.modules.order.service.IPlayOrderEvaluateInfoService;
import com.starry.admin.modules.order.service.IPlayOrderInfoService;
import com.starry.admin.utils.SecurityUtils;
import com.starry.common.constant.Constants;
import com.starry.common.context.CustomSecurityContextHolder;
import com.starry.common.utils.IdUtils;
import java.time.LocalDateTime;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MvcResult;
class WxCustomOrderEvaluationApiTest extends WxCustomOrderApiTestSupport {
private static final String EVALUATION_MESSAGE = "评价成功";
private String customerToken;
@Autowired
private IPlayOrderEvaluateInfoService orderEvaluateInfoService;
@Autowired
private IPlayOrderInfoService orderInfoService;
@BeforeEach
void setUp() {
ensureTenantContext();
resetCustomerBalance();
customerToken = wxTokenService.createWxUserToken(ApiTestDataSeeder.DEFAULT_CUSTOMER_ID);
customUserInfoService.updateTokenById(ApiTestDataSeeder.DEFAULT_CUSTOMER_ID, customerToken);
}
@AfterEach
void tearDown() {
CustomSecurityContextHolder.remove();
}
@Test
void customerCanEvaluateCompletedOrderAndRetrieveResult() throws Exception {
ensureTenantContext();
String remark = "evaluate-" + LocalDateTime.now();
String orderId = createRandomOrder(remark);
ensureTenantContext();
orderInfoService.lambdaUpdate()
.eq(PlayOrderInfoEntity::getId, orderId)
.set(PlayOrderInfoEntity::getAcceptBy, ApiTestDataSeeder.DEFAULT_CLERK_ID)
.set(PlayOrderInfoEntity::getOrderStatus, OrderConstant.OrderStatus.COMPLETED.getCode())
.update();
ObjectNode payload = objectMapper.createObjectNode();
payload.put("orderId", orderId);
payload.put("anonymous", "1");
payload.put("evaluateLevel", 5);
String evaluationSuffix = IdUtils.getUuid();
String evaluationText = "API评价-" + evaluationSuffix;
payload.put("evaluateCon", evaluationText);
mockMvc.perform(post("/wx/custom/order/evaluate/add")
.header(USER_HEADER, DEFAULT_USER)
.header(TENANT_HEADER, DEFAULT_TENANT)
.header(Constants.CUSTOM_USER_LOGIN_TOKEN, Constants.TOKEN_PREFIX + customerToken)
.contentType(MediaType.APPLICATION_JSON)
.content(payload.toString()))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(200))
.andExpect(jsonPath("$.data").value(EVALUATION_MESSAGE));
ensureTenantContext();
assertThat(orderEvaluateInfoService.queryCustomToOrderEvaluateInfo(
ApiTestDataSeeder.DEFAULT_CUSTOMER_ID, orderId))
.isNotNull();
MvcResult result = mockMvc.perform(get("/wx/custom/order/evaluate/queryByOrderId")
.param("id", orderId)
.header(USER_HEADER, DEFAULT_USER)
.header(TENANT_HEADER, DEFAULT_TENANT)
.header(Constants.CUSTOM_USER_LOGIN_TOKEN, Constants.TOKEN_PREFIX + customerToken))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(200))
.andReturn();
JsonNode data = objectMapper.readTree(result.getResponse().getContentAsString()).path("data");
assertThat(data.path("id").asText()).isNotBlank();
assertThat(data.path("evaluateLevel").asInt()).isEqualTo(5);
assertThat(data.path("anonymous").asText()).isEqualTo("1");
assertThat(data.path("evaluateCon").asText()).endsWith(evaluationSuffix);
}
private String createRandomOrder(String remark) throws Exception {
ensureTenantContext();
ObjectNode payload = objectMapper.createObjectNode();
payload.put("sex", OrderConstant.Gender.FEMALE.getCode());
payload.put("levelId", ApiTestDataSeeder.DEFAULT_CLERK_LEVEL_ID);
payload.put("commodityId", ApiTestDataSeeder.DEFAULT_COMMODITY_ID);
payload.put("commodityQuantity", 1);
payload.put("weiChatCode", "apitest-customer-wx");
payload.put("excludeHistory", "0");
payload.set("couponIds", objectMapper.createArrayNode());
payload.put("remark", remark);
mockMvc.perform(post("/wx/custom/order/random")
.header(USER_HEADER, DEFAULT_USER)
.header(TENANT_HEADER, DEFAULT_TENANT)
.header(Constants.CUSTOM_USER_LOGIN_TOKEN, Constants.TOKEN_PREFIX + customerToken)
.contentType(MediaType.APPLICATION_JSON)
.content(payload.toString()))
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value(200));
ensureTenantContext();
PlayOrderInfoEntity order = orderInfoService.lambdaQuery()
.eq(PlayOrderInfoEntity::getPurchaserBy, ApiTestDataSeeder.DEFAULT_CUSTOMER_ID)
.eq(PlayOrderInfoEntity::getRemark, remark)
.orderByDesc(PlayOrderInfoEntity::getCreatedTime)
.last("limit 1")
.one();
assertThat(order).isNotNull();
return order.getId();
}
}