Files
happy-life-star/server/src/test/java/com/emotion/config/RestTemplateRuntimeConfigTest.java
T

70 lines
3.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}