Scert/backend/internal/cli/mysql_routines_test.go
xuans c4051c9166 保存MySQL例程备份整改检查点(验证未完成)
保留存储过程与函数导出、权限检查、编码处理、共享存储对象逻辑及正式测试,同步两份任务进度文档。

已知阻塞:已有MySQL 5.7实库记录中,两种恢复入口均存在Latin-1例程注释乱码;已有8.0编码与权限专项通过,但不能代替最终双版本全量复测。本次仅重新运行例程单元测试及相关包静态检查,均通过。

这是未完成整改的保存检查点,不是发布版本,不表示P0-05完成或生产验收通过。未纳入运行数据、构建产物、原始实库日志或凭据。
2026-09-27 22:16:23 +08:00

51 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cli
import (
"strings"
"testing"
)
func TestMySQLRoutineHeaderEnd(t *testing.T) {
for _, header := range []string{
"CREATE DEFINER=`user`@`host` FUNCTION `name`",
"CREATE DEFINER=`u(s``er`@`host` PROCEDURE `na(me`",
`CREATE DEFINER="u(ser"@"host" FUNCTION "na""me"`,
} {
end, err := mysqlRoutineHeaderEnd(header + "(IN value INT) BEGIN SELECT 1; END")
if err != nil || end != len(header) {
t.Fatalf("声明头边界不正确:%d,%v", end, err)
}
}
if _, err := mysqlRoutineHeaderEnd("CREATE FUNCTION `unterminated()"); err == nil || !strings.Contains(err.Error(), "参数列表") {
t.Fatal("不完整声明头必须失败")
}
}
func TestMySQLRoutineVisibilityGrants(t *testing.T) {
for _, item := range []struct {
name string
grants []string
foldCase bool
want bool
}{
{"show_routine", []string{"GRANT SHOW_ROUTINE ON *.* TO 'u'@'h'"}, false, true},
{"global_select", []string{"GRANT SELECT ON *.* TO 'u'@'h'", "GRANT BACKUP_ADMIN ON *.* TO 'u'@'h'"}, false, true},
{"static_all", []string{"GRANT ALL PRIVILEGES ON *.* TO 'u'@'h'"}, false, true},
{"schema_select", []string{"GRANT SELECT ON `sample`.* TO 'u'@'h'"}, false, false},
{"schema_all", []string{"GRANT ALL PRIVILEGES ON `sample`.* TO 'u'@'h'"}, false, false},
{"role_name", []string{"GRANT `SHOW_ROUTINE`@`%` TO 'u'@'h'"}, false, false},
{"execute_only", []string{"GRANT EXECUTE, CREATE ROUTINE ON *.* TO 'u'@'h'"}, false, false},
{"partial_revoke", []string{"GRANT SELECT ON *.* TO 'u'@'h'", "REVOKE SELECT ON `sample`.* FROM 'u'@'h'"}, false, false},
{"revoke_other_schema", []string{"GRANT SELECT ON *.* TO 'u'@'h'", "REVOKE SELECT ON `other`.* FROM 'u'@'h'"}, false, true},
{"show_not_revoked", []string{"GRANT SELECT ON *.* TO 'u'@'h'", "REVOKE SELECT ON `sample`.* FROM 'u'@'h'", "GRANT SHOW_ROUTINE ON *.* TO 'u'@'h'"}, false, true},
{"fold_revoke", []string{"GRANT SELECT ON *.* TO 'u'@'h'", "REVOKE SELECT ON `SAMPLE`.* FROM 'u'@'h'"}, true, false},
{"case_sensitive", []string{"GRANT SELECT ON *.* TO 'u'@'h'", "REVOKE SELECT ON `SAMPLE`.* FROM 'u'@'h'"}, false, true},
} {
t.Run(item.name, func(t *testing.T) {
if got := mysqlRoutineVisibilityGranted(item.grants, "sample", item.foldCase); got != item.want {
t.Fatalf("例程可见权限判定错误:得到 %t,期望 %t", got, item.want)
}
})
}
}