refc: Refactor project structure
This commit is contained in:
@@ -0,0 +1,828 @@
|
||||
import hono
|
||||
import time
|
||||
import net.http
|
||||
|
||||
fn main() {
|
||||
println('=== 高级动态路由测试用例 ===')
|
||||
|
||||
// 测试1: 复杂嵌套参数路由
|
||||
test_complex_nested_routes()
|
||||
|
||||
// 测试2: RESTful API 路由模式
|
||||
test_restful_api_patterns()
|
||||
|
||||
// 测试3: 版本化API路由
|
||||
test_versioned_api_routes()
|
||||
|
||||
// 测试4: 文件路径路由
|
||||
test_file_path_routes()
|
||||
|
||||
// 测试5: 多语言路由
|
||||
test_multilingual_routes()
|
||||
|
||||
// 测试6: 子域名路由模拟
|
||||
test_subdomain_simulation()
|
||||
|
||||
// 测试7: 动态中间件路由
|
||||
test_dynamic_middleware_routes()
|
||||
|
||||
println('✅ 高级动态路由测试完成')
|
||||
}
|
||||
|
||||
fn test_complex_nested_routes() {
|
||||
println('\n📊 复杂嵌套参数路由测试...')
|
||||
|
||||
mut app := hono.Hono.new()
|
||||
|
||||
// 复杂嵌套路由定义
|
||||
complex_routes := [
|
||||
// 电商平台路由
|
||||
'/shop/:region/:city/stores/:store_id/products/:category/:product_id',
|
||||
'/shop/:region/:city/stores/:store_id/orders/:order_id/items/:item_id',
|
||||
'/shop/:region/:city/stores/:store_id/reviews/:review_id/replies/:reply_id',
|
||||
|
||||
// 社交媒体路由
|
||||
'/social/:platform/users/:user_id/posts/:post_id/comments/:comment_id/likes',
|
||||
'/social/:platform/groups/:group_id/events/:event_id/attendees/:user_id',
|
||||
'/social/:platform/pages/:page_id/posts/:post_id/shares/:share_id',
|
||||
|
||||
// 企业管理路由
|
||||
'/enterprise/:org_id/departments/:dept_id/teams/:team_id/members/:member_id',
|
||||
'/enterprise/:org_id/projects/:project_id/tasks/:task_id/subtasks/:subtask_id',
|
||||
'/enterprise/:org_id/budgets/:budget_id/categories/:category_id/items/:item_id'
|
||||
]
|
||||
|
||||
// 添加路由
|
||||
for route in complex_routes {
|
||||
app.get(route, fn (mut c hono.Context) http.Response {
|
||||
return c.text('Complex route response')
|
||||
})
|
||||
}
|
||||
|
||||
// 测试路径
|
||||
test_cases := [
|
||||
{
|
||||
'route': '/shop/:region/:city/stores/:store_id/products/:category/:product_id'
|
||||
'path': '/shop/asia/beijing/stores/store123/products/electronics/phone456'
|
||||
'expected_params': 'region:asia,city:beijing,store_id:store123,category:electronics,product_id:phone456'
|
||||
},
|
||||
{
|
||||
'route': '/social/:platform/users/:user_id/posts/:post_id/comments/:comment_id/likes'
|
||||
'path': '/social/twitter/users/user789/posts/post101/comments/comment202/likes'
|
||||
'expected_params': 'platform:twitter,user_id:user789,post_id:post101,comment_id:comment202'
|
||||
},
|
||||
{
|
||||
'route': '/enterprise/:org_id/departments/:dept_id/teams/:team_id/members/:member_id'
|
||||
'path': '/enterprise/org999/departments/dept888/teams/team777/members/member666'
|
||||
'expected_params': 'org_id:org999,dept_id:dept888,team_id:team777,member_id:member666'
|
||||
}
|
||||
]
|
||||
|
||||
mut success_count := 0
|
||||
for test_case in test_cases {
|
||||
if match_result := app.fast_router.match_route('GET', test_case['path']) {
|
||||
// 验证参数提取
|
||||
mut param_check_passed := true
|
||||
expected_params := test_case['expected_params'].split(',')
|
||||
|
||||
for expected_param in expected_params {
|
||||
parts := expected_param.split(':')
|
||||
if parts.len == 2 {
|
||||
param_name := parts[0].trim_space()
|
||||
expected_value := parts[1].trim_space()
|
||||
|
||||
if actual_value := match_result.params[param_name] {
|
||||
if actual_value != expected_value {
|
||||
param_check_passed = false
|
||||
break
|
||||
}
|
||||
} else {
|
||||
param_check_passed = false
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if param_check_passed {
|
||||
success_count++
|
||||
println(' ✅ ${test_case['path']} - 参数提取正确')
|
||||
} else {
|
||||
println(' ❌ ${test_case['path']} - 参数提取错误')
|
||||
}
|
||||
} else {
|
||||
println(' ❌ ${test_case['path']} - 路由匹配失败')
|
||||
}
|
||||
}
|
||||
|
||||
println(' 复杂嵌套路由测试: ${success_count}/${test_cases.len} 通过')
|
||||
}
|
||||
|
||||
fn test_restful_api_patterns() {
|
||||
println('\n📊 RESTful API 路由模式测试...')
|
||||
|
||||
mut app := hono.Hono.new()
|
||||
|
||||
// RESTful 资源路由
|
||||
restful_patterns := [
|
||||
// 用户资源
|
||||
'/api/users', // GET: 列表, POST: 创建
|
||||
'/api/users/:id', // GET: 详情, PUT: 更新, DELETE: 删除
|
||||
'/api/users/:id/profile', // GET: 用户资料
|
||||
'/api/users/:id/settings', // GET/PUT: 用户设置
|
||||
|
||||
// 嵌套资源
|
||||
'/api/users/:user_id/posts', // GET: 用户文章列表, POST: 创建文章
|
||||
'/api/users/:user_id/posts/:post_id', // GET: 文章详情, PUT: 更新, DELETE: 删除
|
||||
'/api/users/:user_id/posts/:post_id/comments', // GET: 评论列表, POST: 添加评论
|
||||
'/api/users/:user_id/posts/:post_id/comments/:comment_id', // GET/PUT/DELETE: 评论操作
|
||||
|
||||
// 关系资源
|
||||
'/api/users/:user_id/followers', // GET: 关注者列表
|
||||
'/api/users/:user_id/following', // GET: 关注列表
|
||||
'/api/users/:user_id/follow/:target_id', // POST: 关注, DELETE: 取消关注
|
||||
|
||||
// 搜索和过滤
|
||||
'/api/search/users/:query', // GET: 搜索用户
|
||||
'/api/search/posts/:query', // GET: 搜索文章
|
||||
'/api/filter/posts/:category/:tag', // GET: 按分类和标签过滤
|
||||
]
|
||||
|
||||
// 添加所有RESTful路由
|
||||
for pattern in restful_patterns {
|
||||
// 模拟不同HTTP方法
|
||||
app.get(pattern, fn (mut c hono.Context) http.Response {
|
||||
return c.text('GET response')
|
||||
})
|
||||
app.post(pattern, fn (mut c hono.Context) http.Response {
|
||||
return c.text('POST response')
|
||||
})
|
||||
app.put(pattern, fn (mut c hono.Context) http.Response {
|
||||
return c.text('PUT response')
|
||||
})
|
||||
app.delete(pattern, fn (mut c hono.Context) http.Response {
|
||||
return c.text('DELETE response')
|
||||
})
|
||||
}
|
||||
|
||||
// 测试RESTful操作
|
||||
restful_tests := [
|
||||
{
|
||||
'method': 'GET'
|
||||
'path': '/api/users/123'
|
||||
'description': '获取用户详情'
|
||||
},
|
||||
{
|
||||
'method': 'POST'
|
||||
'path': '/api/users/123/posts'
|
||||
'description': '创建用户文章'
|
||||
},
|
||||
{
|
||||
'method': 'PUT'
|
||||
'path': '/api/users/123/posts/456'
|
||||
'description': '更新文章'
|
||||
},
|
||||
{
|
||||
'method': 'DELETE'
|
||||
'path': '/api/users/123/posts/456/comments/789'
|
||||
'description': '删除评论'
|
||||
},
|
||||
{
|
||||
'method': 'GET'
|
||||
'path': '/api/search/users/john'
|
||||
'description': '搜索用户'
|
||||
},
|
||||
{
|
||||
'method': 'GET'
|
||||
'path': '/api/filter/posts/tech/javascript'
|
||||
'description': '过滤文章'
|
||||
}
|
||||
]
|
||||
|
||||
mut restful_success := 0
|
||||
for test in restful_tests {
|
||||
if match_result := app.fast_router.match_route(test['method'], test['path']) {
|
||||
restful_success++
|
||||
println(' ✅ ${test['method']} ${test['path']} - ${test['description']}')
|
||||
} else {
|
||||
println(' ❌ ${test['method']} ${test['path']} - ${test['description']}')
|
||||
}
|
||||
}
|
||||
|
||||
println(' RESTful API测试: ${restful_success}/${restful_tests.len} 通过')
|
||||
}
|
||||
|
||||
fn test_versioned_api_routes() {
|
||||
println('\n📊 版本化API路由测试...')
|
||||
|
||||
mut app := hono.Hono.new()
|
||||
|
||||
// 版本化API路由
|
||||
versioned_routes := [
|
||||
// 版本1 API
|
||||
'/api/v1/users/:id',
|
||||
'/api/v1/posts/:id',
|
||||
'/api/v1/auth/login',
|
||||
|
||||
// 版本2 API (向后兼容)
|
||||
'/api/v2/users/:id',
|
||||
'/api/v2/users/:id/profile',
|
||||
'/api/v2/posts/:id',
|
||||
'/api/v2/posts/:id/analytics',
|
||||
'/api/v2/auth/oauth/:provider',
|
||||
|
||||
// 版本3 API (最新)
|
||||
'/api/v3/users/:id',
|
||||
'/api/v3/users/:id/preferences',
|
||||
'/api/v3/posts/:id',
|
||||
'/api/v3/posts/:id/engagement',
|
||||
'/api/v3/auth/sso/:provider/:tenant',
|
||||
|
||||
// 通用版本路由
|
||||
'/api/:version/health',
|
||||
'/api/:version/status',
|
||||
'/api/:version/metrics/:metric_type'
|
||||
]
|
||||
|
||||
for route in versioned_routes {
|
||||
app.get(route, fn (mut c hono.Context) http.Response {
|
||||
return c.text('Versioned API response')
|
||||
})
|
||||
}
|
||||
|
||||
// 版本兼容性测试
|
||||
version_tests := [
|
||||
{
|
||||
'path': '/api/v1/users/123'
|
||||
'expected_version': 'v1'
|
||||
},
|
||||
{
|
||||
'path': '/api/v2/users/456/profile'
|
||||
'expected_version': 'v2'
|
||||
},
|
||||
{
|
||||
'path': '/api/v3/auth/sso/google/tenant789'
|
||||
'expected_version': 'v3'
|
||||
},
|
||||
{
|
||||
'path': '/api/v2/health'
|
||||
'expected_version': 'v2'
|
||||
},
|
||||
{
|
||||
'path': '/api/v3/metrics/performance'
|
||||
'expected_version': 'v3'
|
||||
}
|
||||
]
|
||||
|
||||
mut version_success := 0
|
||||
for test in version_tests {
|
||||
if match_result := app.fast_router.match_route('GET', test['path']) {
|
||||
// 检查版本参数
|
||||
if version := match_result.params['version'] {
|
||||
if version == test['expected_version'] {
|
||||
version_success++
|
||||
println(' ✅ ${test['path']} - 版本${version}')
|
||||
} else {
|
||||
println(' ❌ ${test['path']} - 版本不匹配: 期望${test['expected_version']}, 实际${version}')
|
||||
}
|
||||
} else {
|
||||
// 固定版本路由
|
||||
if test['path'].contains(test['expected_version']) {
|
||||
version_success++
|
||||
println(' ✅ ${test['path']} - 固定版本${test['expected_version']}')
|
||||
}
|
||||
}
|
||||
} else {
|
||||
println(' ❌ ${test['path']} - 路由匹配失败')
|
||||
}
|
||||
}
|
||||
|
||||
println(' 版本化API测试: ${version_success}/${version_tests.len} 通过')
|
||||
}
|
||||
|
||||
fn test_file_path_routes() {
|
||||
println('\n📊 文件路径路由测试...')
|
||||
|
||||
mut app := hono.Hono.new()
|
||||
|
||||
// 文件系统路由
|
||||
file_routes := [
|
||||
// 基础文件路由
|
||||
'/files/:filename',
|
||||
'/files/:category/:filename',
|
||||
'/files/:year/:month/:filename',
|
||||
'/files/:year/:month/:day/:filename',
|
||||
|
||||
// 用户文件路由
|
||||
'/users/:user_id/files/:filename',
|
||||
'/users/:user_id/files/:folder/:filename',
|
||||
'/users/:user_id/files/:folder/:subfolder/:filename',
|
||||
|
||||
// 项目文件路由
|
||||
'/projects/:project_id/files/:path/:filename',
|
||||
'/projects/:project_id/versions/:version/files/:filename',
|
||||
'/projects/:project_id/branches/:branch/files/:path/:filename',
|
||||
|
||||
// 媒体文件路由
|
||||
'/media/:type/:resolution/:filename',
|
||||
'/media/:type/:year/:month/:day/:filename',
|
||||
'/media/thumbnails/:size/:filename',
|
||||
|
||||
// 文档路由
|
||||
'/docs/:language/:category/:filename',
|
||||
'/docs/:version/:language/:section/:filename'
|
||||
]
|
||||
|
||||
for route in file_routes {
|
||||
app.get(route, fn (mut c hono.Context) http.Response {
|
||||
return c.text('File response')
|
||||
})
|
||||
}
|
||||
|
||||
// 文件路径测试用例
|
||||
file_tests := [
|
||||
{
|
||||
'path': '/files/document.pdf'
|
||||
'expected_params': 'filename:document.pdf'
|
||||
},
|
||||
{
|
||||
'path': '/files/images/photo.jpg'
|
||||
'expected_params': 'category:images,filename:photo.jpg'
|
||||
},
|
||||
{
|
||||
'path': '/files/2023/12/report.xlsx'
|
||||
'expected_params': 'year:2023,month:12,filename:report.xlsx'
|
||||
},
|
||||
{
|
||||
'path': '/users/user123/files/documents/contract.pdf'
|
||||
'expected_params': 'user_id:user123,folder:documents,filename:contract.pdf'
|
||||
},
|
||||
{
|
||||
'path': '/projects/proj456/versions/v1.2.3/files/readme.md'
|
||||
'expected_params': 'project_id:proj456,version:v1.2.3,filename:readme.md'
|
||||
},
|
||||
{
|
||||
'path': '/media/video/1080p/movie.mp4'
|
||||
'expected_params': 'type:video,resolution:1080p,filename:movie.mp4'
|
||||
},
|
||||
{
|
||||
'path': '/docs/en/api/authentication.md'
|
||||
'expected_params': 'language:en,category:api,filename:authentication.md'
|
||||
}
|
||||
]
|
||||
|
||||
mut file_success := 0
|
||||
for test in file_tests {
|
||||
if match_result := app.fast_router.match_route('GET', test['path']) {
|
||||
mut params_correct := true
|
||||
expected_params := test['expected_params'].split(',')
|
||||
|
||||
for expected_param in expected_params {
|
||||
parts := expected_param.split(':')
|
||||
if parts.len == 2 {
|
||||
param_name := parts[0]
|
||||
expected_value := parts[1]
|
||||
|
||||
if actual_value := match_result.params[param_name] {
|
||||
if actual_value != expected_value {
|
||||
params_correct = false
|
||||
break
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if params_correct {
|
||||
file_success++
|
||||
println(' ✅ ${test['path']} - 参数正确')
|
||||
} else {
|
||||
println(' ❌ ${test['path']} - 参数错误')
|
||||
}
|
||||
} else {
|
||||
println(' ❌ ${test['path']} - 路由匹配失败')
|
||||
}
|
||||
}
|
||||
|
||||
println(' 文件路径路由测试: ${file_success}/${file_tests.len} 通过')
|
||||
}
|
||||
|
||||
fn test_multilingual_routes() {
|
||||
println('\n📊 多语言路由测试...')
|
||||
|
||||
mut app := hono.Hono.new()
|
||||
|
||||
// 多语言路由
|
||||
multilingual_routes := [
|
||||
// 基础多语言路由
|
||||
'/:lang/home',
|
||||
'/:lang/about',
|
||||
'/:lang/contact',
|
||||
|
||||
// 多语言内容路由
|
||||
'/:lang/articles/:id',
|
||||
'/:lang/articles/:category/:slug',
|
||||
'/:lang/products/:id',
|
||||
'/:lang/products/:category/:product_id',
|
||||
|
||||
// 多语言用户路由
|
||||
'/:lang/users/:id/profile',
|
||||
'/:lang/users/:id/settings',
|
||||
'/:lang/auth/login',
|
||||
'/:lang/auth/register',
|
||||
|
||||
// 多语言API路由
|
||||
'/api/:lang/search/:query',
|
||||
'/api/:lang/translate/:from/:to/:text',
|
||||
|
||||
// 地区化路由
|
||||
'/:country/:lang/stores',
|
||||
'/:country/:lang/stores/:store_id',
|
||||
'/:country/:lang/checkout/:step'
|
||||
]
|
||||
|
||||
for route in multilingual_routes {
|
||||
app.get(route, fn (mut c hono.Context) http.Response {
|
||||
return c.text('Multilingual response')
|
||||
})
|
||||
}
|
||||
|
||||
// 多语言测试用例
|
||||
multilingual_tests := [
|
||||
{
|
||||
'path': '/en/home'
|
||||
'expected_lang': 'en'
|
||||
},
|
||||
{
|
||||
'path': '/zh/articles/tech/ai-revolution'
|
||||
'expected_lang': 'zh'
|
||||
'expected_category': 'tech'
|
||||
'expected_slug': 'ai-revolution'
|
||||
},
|
||||
{
|
||||
'path': '/fr/users/123/profile'
|
||||
'expected_lang': 'fr'
|
||||
'expected_id': '123'
|
||||
},
|
||||
{
|
||||
'path': '/api/es/search/machine learning'
|
||||
'expected_lang': 'es'
|
||||
'expected_query': 'machine learning'
|
||||
},
|
||||
{
|
||||
'path': '/us/en/stores/store456'
|
||||
'expected_country': 'us'
|
||||
'expected_lang': 'en'
|
||||
'expected_store_id': 'store456'
|
||||
},
|
||||
{
|
||||
'path': '/jp/ja/checkout/payment'
|
||||
'expected_country': 'jp'
|
||||
'expected_lang': 'ja'
|
||||
'expected_step': 'payment'
|
||||
}
|
||||
]
|
||||
|
||||
mut multilingual_success := 0
|
||||
for test in multilingual_tests {
|
||||
if match_result := app.fast_router.match_route('GET', test['path']) {
|
||||
mut params_correct := true
|
||||
|
||||
// 检查语言参数
|
||||
if expected_lang := test['expected_lang'] {
|
||||
if actual_lang := match_result.params['lang'] {
|
||||
if actual_lang != expected_lang {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
// 检查其他参数
|
||||
test_params := ['expected_category', 'expected_slug', 'expected_id', 'expected_query', 'expected_country', 'expected_store_id', 'expected_step']
|
||||
param_names := ['category', 'slug', 'id', 'query', 'country', 'store_id', 'step']
|
||||
|
||||
for i, test_param in test_params {
|
||||
if expected_value := test[test_param] {
|
||||
param_name := param_names[i]
|
||||
if actual_value := match_result.params[param_name] {
|
||||
if actual_value != expected_value {
|
||||
params_correct = false
|
||||
break
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if params_correct {
|
||||
multilingual_success++
|
||||
println(' ✅ ${test['path']} - 多语言参数正确')
|
||||
} else {
|
||||
println(' ❌ ${test['path']} - 多语言参数错误')
|
||||
}
|
||||
} else {
|
||||
println(' ❌ ${test['path']} - 路由匹配失败')
|
||||
}
|
||||
}
|
||||
|
||||
println(' 多语言路由测试: ${multilingual_success}/${multilingual_tests.len} 通过')
|
||||
}
|
||||
|
||||
fn test_subdomain_simulation() {
|
||||
println('\n📊 子域名路由模拟测试...')
|
||||
|
||||
mut app := hono.Hono.new()
|
||||
|
||||
// 模拟子域名路由 (通过路径前缀)
|
||||
subdomain_routes := [
|
||||
// API子域名
|
||||
'/api.example.com/v1/users/:id',
|
||||
'/api.example.com/v1/posts/:id',
|
||||
'/api.example.com/health',
|
||||
|
||||
// 管理子域名
|
||||
'/admin.example.com/dashboard',
|
||||
'/admin.example.com/users/:id',
|
||||
'/admin.example.com/settings/:section',
|
||||
|
||||
// 用户子域名
|
||||
'/:username.example.com/profile',
|
||||
'/:username.example.com/posts',
|
||||
'/:username.example.com/posts/:post_id',
|
||||
|
||||
// 多租户子域名
|
||||
'/:tenant.app.com/dashboard',
|
||||
'/:tenant.app.com/users/:user_id',
|
||||
'/:tenant.app.com/projects/:project_id',
|
||||
|
||||
// 地区子域名
|
||||
'/:region.shop.com/products',
|
||||
'/:region.shop.com/products/:category',
|
||||
'/:region.shop.com/stores/:store_id'
|
||||
]
|
||||
|
||||
for route in subdomain_routes {
|
||||
app.get(route, fn (mut c hono.Context) http.Response {
|
||||
return c.text('Subdomain response')
|
||||
})
|
||||
}
|
||||
|
||||
// 子域名测试用例
|
||||
subdomain_tests := [
|
||||
{
|
||||
'path': '/api.example.com/v1/users/123'
|
||||
'description': 'API子域名用户接口'
|
||||
},
|
||||
{
|
||||
'path': '/admin.example.com/users/456'
|
||||
'description': '管理子域名用户管理'
|
||||
'expected_id': '456'
|
||||
},
|
||||
{
|
||||
'path': '/john.example.com/posts/789'
|
||||
'description': '用户子域名文章'
|
||||
'expected_username': 'john'
|
||||
'expected_post_id': '789'
|
||||
},
|
||||
{
|
||||
'path': '/company1.app.com/projects/proj123'
|
||||
'description': '多租户项目管理'
|
||||
'expected_tenant': 'company1'
|
||||
'expected_project_id': 'proj123'
|
||||
},
|
||||
{
|
||||
'path': '/us.shop.com/products/electronics'
|
||||
'description': '地区商店产品'
|
||||
'expected_region': 'us'
|
||||
'expected_category': 'electronics'
|
||||
}
|
||||
]
|
||||
|
||||
mut subdomain_success := 0
|
||||
for test in subdomain_tests {
|
||||
if match_result := app.fast_router.match_route('GET', test['path']) {
|
||||
mut params_correct := true
|
||||
|
||||
// 检查参数
|
||||
if expected_id := test['expected_id'] {
|
||||
if actual_id := match_result.params['id'] {
|
||||
if actual_id != expected_id {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
if expected_username := test['expected_username'] {
|
||||
if actual_username := match_result.params['username'] {
|
||||
if actual_username != expected_username {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
if expected_post_id := test['expected_post_id'] {
|
||||
if actual_post_id := match_result.params['post_id'] {
|
||||
if actual_post_id != expected_post_id {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
if expected_tenant := test['expected_tenant'] {
|
||||
if actual_tenant := match_result.params['tenant'] {
|
||||
if actual_tenant != expected_tenant {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
if expected_project_id := test['expected_project_id'] {
|
||||
if actual_project_id := match_result.params['project_id'] {
|
||||
if actual_project_id != expected_project_id {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
if expected_region := test['expected_region'] {
|
||||
if actual_region := match_result.params['region'] {
|
||||
if actual_region != expected_region {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
if expected_category := test['expected_category'] {
|
||||
if actual_category := match_result.params['category'] {
|
||||
if actual_category != expected_category {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
if params_correct {
|
||||
subdomain_success++
|
||||
println(' ✅ ${test['path']} - ${test['description']}')
|
||||
} else {
|
||||
println(' ❌ ${test['path']} - ${test['description']} (参数错误)')
|
||||
}
|
||||
} else {
|
||||
println(' ❌ ${test['path']} - ${test['description']} (匹配失败)')
|
||||
}
|
||||
}
|
||||
|
||||
println(' 子域名路由测试: ${subdomain_success}/${subdomain_tests.len} 通过')
|
||||
}
|
||||
|
||||
fn test_dynamic_middleware_routes() {
|
||||
println('\n📊 动态中间件路由测试...')
|
||||
|
||||
mut app := hono.Hono.new()
|
||||
|
||||
// 需要不同中间件的路由
|
||||
middleware_routes := [
|
||||
// 需要认证的路由
|
||||
'/auth/profile/:id',
|
||||
'/auth/settings/:section',
|
||||
'/auth/admin/:action',
|
||||
|
||||
// 需要权限检查的路由
|
||||
'/protected/users/:id/edit',
|
||||
'/protected/posts/:id/delete',
|
||||
'/protected/admin/:resource/:action',
|
||||
|
||||
// 需要限流的路由
|
||||
'/rate-limited/api/:endpoint',
|
||||
'/rate-limited/upload/:type',
|
||||
'/rate-limited/search/:query',
|
||||
|
||||
// 需要缓存的路由
|
||||
'/cached/articles/:id',
|
||||
'/cached/products/:category/:id',
|
||||
'/cached/static/:resource',
|
||||
|
||||
// 需要日志记录的路由
|
||||
'/logged/transactions/:id',
|
||||
'/logged/audit/:action/:resource',
|
||||
'/logged/security/:event/:details'
|
||||
]
|
||||
|
||||
for route in middleware_routes {
|
||||
app.get(route, fn (mut c hono.Context) http.Response {
|
||||
return c.text('Middleware route response')
|
||||
})
|
||||
}
|
||||
|
||||
// 中间件路由测试
|
||||
middleware_tests := [
|
||||
{
|
||||
'path': '/auth/profile/user123'
|
||||
'middleware_type': 'authentication'
|
||||
'expected_id': 'user123'
|
||||
},
|
||||
{
|
||||
'path': '/protected/users/456/edit'
|
||||
'middleware_type': 'authorization'
|
||||
'expected_id': '456'
|
||||
},
|
||||
{
|
||||
'path': '/rate-limited/api/users'
|
||||
'middleware_type': 'rate_limiting'
|
||||
'expected_endpoint': 'users'
|
||||
},
|
||||
{
|
||||
'path': '/cached/articles/789'
|
||||
'middleware_type': 'caching'
|
||||
'expected_id': '789'
|
||||
},
|
||||
{
|
||||
'path': '/logged/transactions/txn101'
|
||||
'middleware_type': 'logging'
|
||||
'expected_id': 'txn101'
|
||||
},
|
||||
{
|
||||
'path': '/logged/audit/delete/user'
|
||||
'middleware_type': 'audit_logging'
|
||||
'expected_action': 'delete'
|
||||
'expected_resource': 'user'
|
||||
}
|
||||
]
|
||||
|
||||
mut middleware_success := 0
|
||||
for test in middleware_tests {
|
||||
if match_result := app.fast_router.match_route('GET', test['path']) {
|
||||
mut params_correct := true
|
||||
|
||||
// 验证参数提取
|
||||
if expected_id := test['expected_id'] {
|
||||
if actual_id := match_result.params['id'] {
|
||||
if actual_id != expected_id {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
if expected_endpoint := test['expected_endpoint'] {
|
||||
if actual_endpoint := match_result.params['endpoint'] {
|
||||
if actual_endpoint != expected_endpoint {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
if expected_action := test['expected_action'] {
|
||||
if actual_action := match_result.params['action'] {
|
||||
if actual_action != expected_action {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
if expected_resource := test['expected_resource'] {
|
||||
if actual_resource := match_result.params['resource'] {
|
||||
if actual_resource != expected_resource {
|
||||
params_correct = false
|
||||
}
|
||||
} else {
|
||||
params_correct = false
|
||||
}
|
||||
}
|
||||
|
||||
if params_correct {
|
||||
middleware_success++
|
||||
println(' ✅ ${test['path']} - ${test['middleware_type']} 中间件路由')
|
||||
} else {
|
||||
println(' ❌ ${test['path']} - ${test['middleware_type']} 中间件路由 (参数错误)')
|
||||
}
|
||||
} else {
|
||||
println(' ❌ ${test['path']} - ${test['middleware_type']} 中间件路由 (匹配失败)')
|
||||
}
|
||||
}
|
||||
|
||||
println(' 动态中间件路由测试: ${middleware_success}/${middleware_tests.len} 通过')
|
||||
}
|
||||
Reference in New Issue
Block a user