Waline(安全) - item.html 的 path 从 window.location.href 改为剔除 ?t= 后的 URL。 私密题 /_/<domain>/<id>?t=<token> 的钥匙原本会整条发往 Waline 服务端 并落进其访问日志。只删 t、保留其他参数,公开题的评论线程键不变。 cwebp(可靠性) - ConvertGifToAnimatedWebP 改用 exec.CommandContext + 30s 上限。 原来裸 exec.Command 无超时,畸形/超大 GIF 会把子进程和上传 goroutine 一起挂住。 超时杀进程并记 Warn,调用方按既有逻辑回退为原 GIF,不影响上传成功。 投票选项长度(正确性) - vote_options.content 由 varchar(200) 放宽到 300,与配置默认值一致。 此前 201–300 字的选项通过校验后在写库阶段失败。 - 新增 db.MaxVoteOptionLen;voteOptionMaxLen() 取配置与存储上限的较小值, 校验与前端 maxlength 同源,避免配置调大后再次越界。 多选 checkbox 去重(正确性) - 抽出 appendUniqueValue,预置值与「其他」文本共用同一 seen 集合。 此前重复提交同名字段会让同一选项在统计里被计多次。 测试 - vote_dedupe_test.go:去重与顺序。 - vote_option_len_test.go:配置小于/等于/大于存储上限三种情形。 - TestVoteOptionMaxLengthRoundTrip:300 个多字节字符存回不截断。 - TestVoteOptionColumnWidens:把列改回 200 后 AutoMigrate 能扩回 300(老库升级路径)。 验证:WSL2 Debian + PostgreSQL 全量 go test ./... 27 个包全绿; 隔离实例渲染单题页确认新的 path 逻辑。
37 lines
1.0 KiB
Go
37 lines
1.0 KiB
Go
package user
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/tamakyi/TamaBox/internal/conf"
|
|
"github.com/tamakyi/TamaBox/internal/db"
|
|
)
|
|
|
|
// TestVoteOptionMaxLen 钉住「配置值不能超过存储上限」这条约束。
|
|
//
|
|
// 背景:conf 的 vote_option_len 只校验 ≥1,可以填得比 vote_options.content
|
|
// 的列宽还大;那样校验会放行,写库才失败(PostgreSQL 直接报错)。
|
|
func TestVoteOptionMaxLen(t *testing.T) {
|
|
original := conf.Limits.VoteOptionLen
|
|
t.Cleanup(func() { conf.Limits.VoteOptionLen = original })
|
|
|
|
cases := []struct {
|
|
name string
|
|
conf int
|
|
want int
|
|
}{
|
|
{"配置小于存储上限时以配置为准", 100, 100},
|
|
{"配置等于存储上限", db.MaxVoteOptionLen, db.MaxVoteOptionLen},
|
|
{"配置超过存储上限时截到上限", db.MaxVoteOptionLen + 500, db.MaxVoteOptionLen},
|
|
}
|
|
|
|
for _, c := range cases {
|
|
t.Run(c.name, func(t *testing.T) {
|
|
conf.Limits.VoteOptionLen = c.conf
|
|
if got := voteOptionMaxLen(); got != c.want {
|
|
t.Fatalf("voteOptionMaxLen() = %d, want %d", got, c.want)
|
|
}
|
|
})
|
|
}
|
|
}
|