test: 集成测试验证 RestTemplate 运行时 User-Agent 为 Mozilla/5.0

This commit is contained in:
2026-06-03 23:46:03 +08:00
parent 2413b2bf58
commit e23eb32c1d
@@ -0,0 +1,69 @@
package com.emotion.config;
import com.emotion.interceptor.WechatApiLoggingInterceptor;
import org.junit.jupiter.api.Test;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.client.BufferingClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* RestTemplate 运行时配置集成测试
*
* <p>目标:验证 8 任务 WeChat 修复计划的核心成功标志 - RestTemplate 实际发送的
* User-Agent 是 "Mozilla/5.0 (compatible; EmotionMuseum/1.0)" 而非
* 默认的 "Java/17.0.x"WAF 会拦截 Java UA 导致 text/plain 响应)。
*
* <p>策略:复现生产代码 RestTemplateConfig.restTemplate() 的构建逻辑,
* 对 httpbin.org/headers 发真实 HTTPS 请求,从返回的 JSON 中验证
* 实际发送的 User-Agent。
*
* <p>不依赖 Spring 上下文,纯 JUnit 构造 + 真实网络调用 = 最直接的端到端证据。
*/
class RestTemplateRuntimeConfigTest {
private static final String EXPECTED_USER_AGENT = "Mozilla/5.0 (compatible; EmotionMuseum/1.0)";
private static final String FORBIDDEN_USER_AGENT_PREFIX = "Java/";
@Test
void restTemplate_RealHttpCallToHttpbin_ConfirmsMozillaUserAgent() {
// 复现生产 RestTemplateConfig.restTemplate() 的构建逻辑
SimpleClientHttpRequestFactory simpleFactory = new SimpleClientHttpRequestFactory();
simpleFactory.setConnectTimeout((int) Duration.ofSeconds(5).toMillis());
simpleFactory.setReadTimeout((int) Duration.ofSeconds(10).toMillis());
BufferingClientHttpRequestFactory bufferingFactory =
new BufferingClientHttpRequestFactory(simpleFactory);
RestTemplate restTemplate = new RestTemplateBuilder()
.requestFactory(() -> bufferingFactory)
.defaultHeader("User-Agent", EXPECTED_USER_AGENT)
.defaultHeader("Accept", "application/json, text/plain, */*")
.additionalMessageConverters(new StringHttpMessageConverter(StandardCharsets.UTF_8))
.additionalInterceptors(new WechatApiLoggingInterceptor())
.errorHandler(new WechatResponseErrorHandler())
.build();
// httpbin.org/headers 返回客户端发送的所有请求头(JSON 格式)
String response = restTemplate.getForObject(
"https://httpbin.org/headers", String.class);
assertNotNull(response, "httpbin.org should respond");
System.out.println("[RestTemplateRuntimeConfigTest] httpbin response: " + response);
// 核心断言:实际发送的 User-Agent 是 Mozilla/5.0
assertTrue(response.contains(EXPECTED_USER_AGENT),
"User-Agent 应为 '" + EXPECTED_USER_AGENT + "',但实际响应: " + response);
// 反向断言:绝对不能是 Java/* 默认 UA(WAF 拦截根因)
assertFalse(response.contains(FORBIDDEN_USER_AGENT_PREFIX),
"User-Agent 不应是 Java/*WAF 会拦截),但实际响应: " + response);
}
}