Files
v-hono/tests/test_redirect_functionality.v
T
meiseayoung 3b8d21dd0d fix: update import path to VPM package name (meiseayoung.hono)
- Change all `import hono` to `import meiseayoung.hono` in code and docs
- Ensure compatibility with VPM installation via `v install meiseayoung.hono`
2026-01-02 22:05:12 +08:00

208 lines
3.9 KiB
V

import meiseayoung.hono
import net.http
// 重定向功能测试
fn redirect_basic_test() bool {
mut c := hono.Context.new(
http.Request{
method: .get
url: '/test'
},
map[string]string{},
map[string]string{},
''
)
response := c.redirect('https://example.com')
if response.status_code != 302 {
return false
}
location := response.header.get_custom('Location') or { '' }
if location != 'https://example.com' {
return false
}
if response.body != '' {
return false
}
return true
}
fn redirect_with_status_test() bool {
mut c := hono.Context.new(
http.Request{
method: .get
url: '/test'
},
map[string]string{},
map[string]string{},
''
)
response := c.redirect('https://example.com', 301)
if response.status_code != 301 {
return false
}
location := response.header.get_custom('Location') or { '' }
if location != 'https://example.com' {
return false
}
if response.body != '' {
return false
}
return true
}
fn redirect_multiple_status_codes_test() bool {
status_codes := [301, 302, 303, 307, 308]
for code in status_codes {
mut c := hono.Context.new(
http.Request{
method: .get
url: '/test'
},
map[string]string{},
map[string]string{},
''
)
response := c.redirect('https://example.com', code)
if response.status_code != code {
return false
}
location := response.header.get_custom('Location') or { '' }
if location != 'https://example.com' {
return false
}
if response.body != '' {
return false
}
}
return true
}
fn redirect_relative_url_test() bool {
mut c := hono.Context.new(
http.Request{
method: .get
url: '/test'
},
map[string]string{},
map[string]string{},
''
)
response := c.redirect('/relative-path')
if response.status_code != 302 {
return false
}
location := response.header.get_custom('Location') or { '' }
if location != '/relative-path' {
return false
}
return true
}
fn redirect_with_existing_headers_test() bool {
mut c := hono.Context.new(
http.Request{
method: .get
url: '/test'
},
map[string]string{},
map[string]string{},
''
)
// Set some existing headers
c.headers['X-Custom-Header'] = 'custom-value'
c.headers['Cache-Control'] = 'no-cache'
response := c.redirect('https://example.com')
if response.status_code != 302 {
return false
}
location := response.header.get_custom('Location') or { '' }
if location != 'https://example.com' {
return false
}
custom_header := response.header.get_custom('X-Custom-Header') or { '' }
if custom_header != 'custom-value' {
return false
}
cache_control := response.header.get_custom('Cache-Control') or { '' }
if cache_control != 'no-cache' {
return false
}
return true
}
// 测试统计结构
struct TestStats {
mut:
total_tests int
passed_tests int
failed_tests int
}
fn (mut stats TestStats) run_test(test_name string, test_func fn() bool) {
stats.total_tests++
print('🧪 ${test_name}... ')
if test_func() {
stats.passed_tests++
println('✅')
} else {
stats.failed_tests++
println('❌')
}
}
fn (stats TestStats) print_summary() {
println('\n=== 重定向测试总结 ===')
println('总测试数: ${stats.total_tests}')
println('通过: ${stats.passed_tests}')
println('失败: ${stats.failed_tests}')
if stats.failed_tests == 0 {
println('🎉 所有重定向测试通过!')
} else {
println('⚠️ 有 ${stats.failed_tests} 个测试失败')
}
}
fn main() {
println('🚀 开始重定向功能测试...\n')
mut stats := TestStats{}
// 运行所有重定向测试
stats.run_test('基本重定向 (302)', redirect_basic_test)
stats.run_test('自定义状态码重定向 (301)', redirect_with_status_test)
stats.run_test('多种状态码测试', redirect_multiple_status_codes_test)
stats.run_test('相对路径重定向', redirect_relative_url_test)
stats.run_test('保持现有头部信息', redirect_with_existing_headers_test)
// 打印测试总结
stats.print_summary()
}