forked from moyin/whale-town-front
501 lines
14 KiB
GDScript
501 lines
14 KiB
GDScript
extends Control
|
||
|
||
# 认证UI测试场景
|
||
# 用于测试登录和注册界面的各种响应情况
|
||
|
||
@onready var auth_scene: Control = $AuthScene
|
||
@onready var test_panel: Panel = $TestPanel
|
||
@onready var test_buttons: VBoxContainer = $TestPanel/VBoxContainer/ScrollContainer/TestButtons
|
||
@onready var feedback_panel: Panel = $TestPanel/VBoxContainer/FeedbackPanel
|
||
@onready var feedback_text: RichTextLabel = $TestPanel/VBoxContainer/FeedbackPanel/FeedbackContainer/FeedbackScroll/FeedbackText
|
||
|
||
# 反馈样式 - 动态创建
|
||
var feedback_styles = {}
|
||
|
||
var test_scenarios = [
|
||
{
|
||
"name": "✅ 登录成功",
|
||
"type": "login",
|
||
"response_code": 200,
|
||
"response_data": {
|
||
"success": true,
|
||
"data": {
|
||
"user": {
|
||
"id": "123",
|
||
"username": "testuser",
|
||
"email": "test@example.com"
|
||
},
|
||
"token": "jwt_token_here"
|
||
},
|
||
"message": "登录成功"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 登录失败-用户名或密码错误",
|
||
"type": "login",
|
||
"response_code": 401,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "用户名或密码错误",
|
||
"error_code": "INVALID_CREDENTIALS"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 登录失败-用户不存在",
|
||
"type": "login",
|
||
"response_code": 404,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "用户不存在",
|
||
"error_code": "USER_NOT_FOUND"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 登录失败-参数错误",
|
||
"type": "login",
|
||
"response_code": 400,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "用户名格式错误",
|
||
"error_code": "INVALID_PARAMETERS"
|
||
}
|
||
},
|
||
{
|
||
"name": "✅ 发送验证码成功",
|
||
"type": "send_code",
|
||
"response_code": 200,
|
||
"response_data": {
|
||
"success": true,
|
||
"data": {"verification_code": "123456"},
|
||
"message": "验证码已发送"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 发送验证码-邮箱格式错误",
|
||
"type": "send_code",
|
||
"response_code": 400,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "邮箱格式错误",
|
||
"error_code": "INVALID_EMAIL"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 发送验证码-请求过频",
|
||
"type": "send_code",
|
||
"response_code": 429,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "请求过于频繁",
|
||
"error_code": "TOO_MANY_REQUESTS"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 发送验证码-服务器错误",
|
||
"type": "send_code",
|
||
"response_code": 500,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "服务器内部错误",
|
||
"error_code": "INTERNAL_ERROR"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 发送验证码-网络错误",
|
||
"type": "send_code",
|
||
"response_code": 0,
|
||
"response_data": {}
|
||
},
|
||
{
|
||
"name": "✅ 邮箱验证成功",
|
||
"type": "verify_email",
|
||
"response_code": 200,
|
||
"response_data": {
|
||
"success": true,
|
||
"message": "邮箱验证成功"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 邮箱验证-验证码错误",
|
||
"type": "verify_email",
|
||
"response_code": 400,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "验证码错误或已过期",
|
||
"error_code": "INVALID_CODE"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 邮箱验证-验证码不存在",
|
||
"type": "verify_email",
|
||
"response_code": 404,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "验证码不存在",
|
||
"error_code": "CODE_NOT_FOUND"
|
||
}
|
||
},
|
||
{
|
||
"name": "✅ 注册成功",
|
||
"type": "register",
|
||
"response_code": 201,
|
||
"response_data": {
|
||
"success": true,
|
||
"data": {
|
||
"user": {
|
||
"id": "123",
|
||
"username": "testuser",
|
||
"email": "test@example.com"
|
||
}
|
||
},
|
||
"message": "注册成功"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 注册失败-参数错误",
|
||
"type": "register",
|
||
"response_code": 400,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "用户名格式错误",
|
||
"error_code": "INVALID_USERNAME"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 注册失败-缺少验证码",
|
||
"type": "register",
|
||
"response_code": 400,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "提供邮箱时必须提供邮箱验证码",
|
||
"error_code": "REGISTER_FAILED"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 注册失败-用户已存在",
|
||
"type": "register",
|
||
"response_code": 409,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "用户名已存在",
|
||
"error_code": "USER_EXISTS"
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 注册失败-请求过频",
|
||
"type": "register",
|
||
"response_code": 429,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "注册请求过于频繁,请5分钟后再试",
|
||
"error_code": "TOO_MANY_REQUESTS",
|
||
"throttle_info": {
|
||
"limit": 3,
|
||
"window_seconds": 300,
|
||
"current_requests": 3,
|
||
"reset_time": "2025-12-24T11:26:41.136Z"
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"name": "❌ 注册失败-服务器错误",
|
||
"type": "register",
|
||
"response_code": 500,
|
||
"response_data": {
|
||
"success": false,
|
||
"message": "服务器内部错误",
|
||
"error_code": "INTERNAL_ERROR"
|
||
}
|
||
}
|
||
]
|
||
|
||
func _ready():
|
||
print("🧪 认证UI测试场景已加载")
|
||
|
||
# 初始化反馈样式
|
||
create_feedback_styles()
|
||
|
||
# 初始化反馈面板
|
||
show_feedback("🎯 测试场景已准备就绪", "info")
|
||
add_feedback_line("💡 使用说明:")
|
||
add_feedback_line("1️⃣ 点击下方测试按钮模拟后端响应")
|
||
add_feedback_line("2️⃣ 观察左侧认证界面的UI反馈")
|
||
add_feedback_line("3️⃣ 按ESC键退出测试")
|
||
add_feedback_line("")
|
||
|
||
# 确保auth_scene已准备好
|
||
if auth_scene == null:
|
||
show_feedback("❌ 错误:无法找到AuthScene节点", "error")
|
||
return
|
||
|
||
# 等待一帧确保所有节点都已初始化
|
||
await get_tree().process_frame
|
||
setup_test_buttons()
|
||
|
||
# 断开auth_scene的login_success信号,避免跳转到主场景
|
||
if auth_scene.has_signal("login_success"):
|
||
var connections = auth_scene.get_signal_connection_list("login_success")
|
||
for connection in connections:
|
||
auth_scene.disconnect("login_success", connection.callable)
|
||
add_feedback_line("🔗 已断开login_success信号连接")
|
||
|
||
# 创建反馈样式
|
||
func create_feedback_styles():
|
||
# 成功样式 - 绿色
|
||
var success_style = StyleBoxFlat.new()
|
||
success_style.bg_color = Color(0.2, 0.8, 0.3, 0.9)
|
||
success_style.border_color = Color(0.1, 0.6, 0.2, 1)
|
||
success_style.border_width_left = 2
|
||
success_style.border_width_top = 2
|
||
success_style.border_width_right = 2
|
||
success_style.border_width_bottom = 2
|
||
success_style.corner_radius_top_left = 8
|
||
success_style.corner_radius_top_right = 8
|
||
success_style.corner_radius_bottom_left = 8
|
||
success_style.corner_radius_bottom_right = 8
|
||
|
||
# 错误样式 - 红色
|
||
var error_style = StyleBoxFlat.new()
|
||
error_style.bg_color = Color(0.8, 0.2, 0.2, 0.9)
|
||
error_style.border_color = Color(0.6, 0.1, 0.1, 1)
|
||
error_style.border_width_left = 2
|
||
error_style.border_width_top = 2
|
||
error_style.border_width_right = 2
|
||
error_style.border_width_bottom = 2
|
||
error_style.corner_radius_top_left = 8
|
||
error_style.corner_radius_top_right = 8
|
||
error_style.corner_radius_bottom_left = 8
|
||
error_style.corner_radius_bottom_right = 8
|
||
|
||
# 信息样式 - 蓝色
|
||
var info_style = StyleBoxFlat.new()
|
||
info_style.bg_color = Color(0.2, 0.5, 0.8, 0.9)
|
||
info_style.border_color = Color(0.1, 0.4, 0.6, 1)
|
||
info_style.border_width_left = 2
|
||
info_style.border_width_top = 2
|
||
info_style.border_width_right = 2
|
||
info_style.border_width_bottom = 2
|
||
info_style.corner_radius_top_left = 8
|
||
info_style.corner_radius_top_right = 8
|
||
info_style.corner_radius_bottom_left = 8
|
||
info_style.corner_radius_bottom_right = 8
|
||
|
||
feedback_styles = {
|
||
"success": success_style,
|
||
"error": error_style,
|
||
"info": info_style
|
||
}
|
||
|
||
func setup_test_buttons():
|
||
# 创建测试按钮
|
||
for i in range(test_scenarios.size()):
|
||
var scenario = test_scenarios[i]
|
||
var button = Button.new()
|
||
button.text = scenario.name
|
||
button.custom_minimum_size.y = 35
|
||
button.pressed.connect(_on_test_button_pressed.bind(scenario))
|
||
|
||
# 为按钮添加样式
|
||
var style_normal = StyleBoxFlat.new()
|
||
style_normal.bg_color = Color(0.9, 0.9, 0.9, 1)
|
||
style_normal.border_color = Color(0.7, 0.7, 0.7, 1)
|
||
style_normal.border_width_left = 1
|
||
style_normal.border_width_top = 1
|
||
style_normal.border_width_right = 1
|
||
style_normal.border_width_bottom = 1
|
||
style_normal.corner_radius_top_left = 4
|
||
style_normal.corner_radius_top_right = 4
|
||
style_normal.corner_radius_bottom_left = 4
|
||
style_normal.corner_radius_bottom_right = 4
|
||
|
||
var style_hover = style_normal.duplicate()
|
||
style_hover.bg_color = Color(0.8, 0.8, 0.8, 1)
|
||
|
||
button.add_theme_stylebox_override("normal", style_normal)
|
||
button.add_theme_stylebox_override("hover", style_hover)
|
||
button.add_theme_color_override("font_color", Color(0.2, 0.2, 0.2, 1))
|
||
|
||
test_buttons.add_child(button)
|
||
|
||
# 添加分隔符(每4个按钮一组)
|
||
if (i + 1) % 4 == 0 and i < test_scenarios.size() - 1:
|
||
var separator = HSeparator.new()
|
||
separator.custom_minimum_size.y = 10
|
||
test_buttons.add_child(separator)
|
||
|
||
add_feedback_line("✨ 已创建 %d 个测试按钮" % test_scenarios.size())
|
||
|
||
func _on_test_button_pressed(scenario: Dictionary):
|
||
# 显示测试开始信息
|
||
show_feedback("🚀 执行测试: %s" % scenario.name, "info")
|
||
add_feedback_line("📡 请求类型: %s" % scenario.type)
|
||
add_feedback_line("📊 状态码: %d" % scenario.response_code)
|
||
|
||
# 确保auth_scene存在
|
||
if auth_scene == null:
|
||
show_feedback("❌ 错误:AuthScene节点不存在", "error")
|
||
return
|
||
|
||
# 模拟HTTP响应
|
||
simulate_http_response(scenario)
|
||
|
||
func simulate_http_response(scenario: Dictionary):
|
||
# 设置当前请求类型
|
||
auth_scene.current_request_type = scenario.type
|
||
|
||
# 准备模拟数据
|
||
var response_code = scenario.response_code
|
||
var response_data = scenario.response_data
|
||
var response_text = JSON.stringify(response_data)
|
||
var response_body = response_text.to_utf8_buffer()
|
||
var headers = PackedStringArray()
|
||
|
||
add_feedback_line("⚡ 模拟HTTP响应...")
|
||
|
||
# 模拟HTTP请求完成
|
||
auth_scene._on_http_request_completed(0, response_code, headers, response_body)
|
||
|
||
# 分析响应结果
|
||
analyze_response(scenario, response_data)
|
||
|
||
func analyze_response(scenario: Dictionary, response_data: Dictionary):
|
||
var response_code = scenario.response_code
|
||
var is_success = response_code >= 200 and response_code < 300
|
||
|
||
# 显示响应分析
|
||
if is_success:
|
||
show_feedback("✅ 测试完成 - 成功响应", "success")
|
||
else:
|
||
show_feedback("❌ 测试完成 - 错误响应", "error")
|
||
|
||
# 显示详细信息
|
||
if response_data.has("message"):
|
||
add_feedback_line("💬 响应消息: %s" % response_data.message)
|
||
|
||
if response_data.has("error_code"):
|
||
add_feedback_line("🏷️ 错误代码: %s" % response_data.error_code)
|
||
|
||
if response_data.has("data"):
|
||
add_feedback_line("📦 响应数据: %s" % str(response_data.data))
|
||
|
||
# 预期的UI反馈
|
||
var expected_feedback = get_expected_ui_feedback(scenario)
|
||
add_feedback_line("🎯 预期UI反馈: %s" % expected_feedback)
|
||
|
||
add_feedback_line("─────────────────────")
|
||
|
||
func get_expected_ui_feedback(scenario: Dictionary) -> String:
|
||
var response_code = scenario.response_code
|
||
var type = scenario.type
|
||
|
||
match type:
|
||
"login":
|
||
match response_code:
|
||
200:
|
||
return "绿色Toast: 登录成功,跳转到主场景"
|
||
400:
|
||
return "红色Toast: 登录信息格式错误"
|
||
401:
|
||
return "红色Toast: 用户名或密码错误"
|
||
404:
|
||
return "红色Toast: 用户不存在"
|
||
429:
|
||
return "红色Toast: 登录请求过于频繁"
|
||
500:
|
||
return "红色Toast: 服务器繁忙"
|
||
503:
|
||
return "红色Toast: 系统维护中"
|
||
"send_code":
|
||
match response_code:
|
||
200, 206:
|
||
return "绿色Toast: 验证码已发送"
|
||
400:
|
||
return "红色Toast: 邮箱格式错误"
|
||
429:
|
||
return "红色Toast: 请求过于频繁"
|
||
500:
|
||
return "红色Toast: 服务器繁忙"
|
||
503:
|
||
return "红色Toast: 系统维护中"
|
||
0:
|
||
return "红色Toast: 网络连接失败"
|
||
"send_login_code":
|
||
match response_code:
|
||
200, 206:
|
||
return "绿色Toast: 登录验证码已发送"
|
||
400:
|
||
return "红色Toast: 邮箱或手机号格式错误"
|
||
404:
|
||
return "红色Toast: 用户不存在"
|
||
429:
|
||
return "红色Toast: 请求过于频繁"
|
||
500:
|
||
return "红色Toast: 服务器繁忙"
|
||
503:
|
||
return "红色Toast: 系统维护中"
|
||
"verification_code_login":
|
||
match response_code:
|
||
200:
|
||
return "绿色Toast: 验证码登录成功,跳转到主场景"
|
||
401:
|
||
return "红色Toast: 验证码错误或已过期"
|
||
404:
|
||
return "红色Toast: 用户不存在"
|
||
429:
|
||
return "红色Toast: 请求过于频繁"
|
||
500:
|
||
return "红色Toast: 服务器繁忙"
|
||
503:
|
||
return "红色Toast: 系统维护中"
|
||
"verify_email":
|
||
match response_code:
|
||
200:
|
||
return "绿色Toast: 邮箱验证成功"
|
||
400:
|
||
return "红色Toast: 验证码错误"
|
||
404:
|
||
return "红色Toast: 请先获取验证码"
|
||
500:
|
||
return "红色Toast: 验证失败"
|
||
503:
|
||
return "红色Toast: 系统维护中"
|
||
"register":
|
||
match response_code:
|
||
201:
|
||
return "绿色Toast: 注册成功,切换到登录界面"
|
||
400:
|
||
return "红色Toast: 根据具体错误显示(验证码缺失、格式错误等)"
|
||
409:
|
||
return "红色Toast: 用户名或邮箱已存在"
|
||
429:
|
||
return "红色Toast: 注册请求过于频繁,请稍后再试"
|
||
500:
|
||
return "红色Toast: 注册失败"
|
||
503:
|
||
return "红色Toast: 系统维护中"
|
||
|
||
return "未知响应"
|
||
|
||
# 反馈面板功能
|
||
func show_feedback(message: String, type: String = "info"):
|
||
# 更改面板样式
|
||
if feedback_styles.has(type):
|
||
feedback_panel.add_theme_stylebox_override("panel", feedback_styles[type])
|
||
|
||
# 清空并显示新消息
|
||
feedback_text.text = "[b]%s[/b]" % message
|
||
|
||
func add_feedback_line(message: String):
|
||
feedback_text.text += "\n" + message
|
||
# 自动滚动到底部
|
||
await get_tree().process_frame
|
||
var scroll = feedback_text.get_parent()
|
||
if scroll is ScrollContainer:
|
||
scroll.scroll_vertical = scroll.get_v_scroll_bar().max_value
|
||
|
||
func _input(event):
|
||
if event.is_action_pressed("ui_cancel"):
|
||
show_feedback("👋 退出测试场景", "info")
|
||
await get_tree().create_timer(0.5).timeout
|
||
get_tree().quit()
|