T0.12: GatewayProperties 路由表 + TargetRouter(/{target}/oapi/** 路由判定与 forwardUrl 换主机不换路径计算)
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user