T0.12: GatewayProperties 路由表 + TargetRouter(/{target}/oapi/** 路由判定与 forwardUrl 换主机不换路径计算)

This commit is contained in:
chenxing
2026-09-21 00:25:54 +08:00
parent 6cb0fa1b5b
commit 4777d47499
3 changed files with 198 additions and 0 deletions
@@ -0,0 +1,79 @@
package com.yunhai.platform.gateway.route;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
/**
* TargetRouter 用例(T0.12 TDD):已知 target forwardUrl 逐字符断言(换主机不换路径)、
* 未知 target / 单段 / 非 oapi 第二段一律裸 404(null)、base-url 尾斜杠归一化。
*/
class TargetRouterTest {
private TargetRouter router;
@BeforeEach
void setUp() {
router = new TargetRouter();
GatewayProperties props = new GatewayProperties();
Map<String, String> routes = new LinkedHashMap<>();
routes.put("userbase", "http://userbase-service:8080");
routes.put("notice", "http://notice-service:8080/");
props.setRoutes(routes);
router.setProperties(props);
}
@Test
void 已知target_forwardUrl逐字符断言() {
TargetRouter.Routing r = router.route("/userbase/oapi/x", "a=1");
assertThat(r).isNotNull();
assertThat(r.forwardUrl).as("换主机不换路径:base-url + 完整原始 URI 含 query,逐字符")
.isEqualTo("http://userbase-service:8080/userbase/oapi/x?a=1");
assertThat(r.target).isEqualTo("userbase");
assertThat(r.pathAfterStrip).as("剥段路径 = 注册表/签名坐标系").isEqualTo("/oapi/x");
}
@Test
void 无query的URI不带问号() {
TargetRouter.Routing r = router.route("/notice/oapi/notice/list", null);
assertThat(r.forwardUrl).isEqualTo("http://notice-service:8080/notice/oapi/notice/list");
assertThat(r.pathAfterStrip).isEqualTo("/oapi/notice/list");
}
@Test
void 未知target_裸404() {
assertThat(router.route("/nobody/oapi/x", null)).as("未配置的 target = 裸 404").isNull();
}
@Test
void 单段URI_裸404() {
assertThat(router.route("/", null)).isNull();
assertThat(router.route("/foo", null)).isNull();
}
@Test
void 非oapi第二段_裸404() {
assertThat(router.route("/userbase/api/x", null)).as("网关只做 oapi,/api 一律 404").isNull();
assertThat(router.route("/userbase/oapix", null)).as("前缀相同不算 oapi 段").isNull();
}
@Test
void 尾斜杠base归一化_无双斜杠() {
TargetRouter.Routing r = router.route("/notice/oapi/x", null);
assertThat(r.forwardUrl).as("base-url 尾斜杠不得产生双斜杠")
.isEqualTo("http://notice-service:8080/notice/oapi/x");
}
@Test
void 裸oapi路径可路由() {
// /{target}/oapi(无尾路径)属 /{target}/oapi/** 匹配范围
TargetRouter.Routing r = router.route("/userbase/oapi", null);
assertThat(r).isNotNull();
assertThat(r.forwardUrl).isEqualTo("http://userbase-service:8080/userbase/oapi");
assertThat(r.pathAfterStrip).isEqualTo("/oapi");
}
}