package database import "testing" // Init 靠 appendDSNParam 把 parseTime 和 clientFoundRows 补进 DSN。这里钉住拼接 // 规则:没有 ? 要用 ? 起头,已有 ? 要用 & 续接,已经写过的参数不再重复追加。 func TestAppendDSNParam(t *testing.T) { cases := []struct { name string dsn string key string value string want string }{ { name: "没有查询串时用问号起头", dsn: "root:pw@tcp(db:3306)/wmms", key: "parseTime", value: "true", want: "root:pw@tcp(db:3306)/wmms?parseTime=true", }, { name: "已有查询串时用与号续接", dsn: "root:pw@tcp(db:3306)/wmms?charset=utf8mb4", key: "parseTime", value: "true", want: "root:pw@tcp(db:3306)/wmms?charset=utf8mb4&parseTime=true", }, { name: "已经配过就不重复追加", dsn: "root:pw@tcp(db:3306)/wmms?parseTime=true", key: "parseTime", value: "true", want: "root:pw@tcp(db:3306)/wmms?parseTime=true", }, { // 按参数名判断,不按完整参数值:调用方显式关了 clientFoundRows, // 不能被当成"没配过"再追加一个 true 进去。 name: "显式配置的反值优先", dsn: "root:pw@tcp(db:3306)/wmms?clientFoundRows=false", key: "clientFoundRows", value: "true", want: "root:pw@tcp(db:3306)/wmms?clientFoundRows=false", }, } for _, c := range cases { t.Run(c.name, func(t *testing.T) { if got := appendDSNParam(c.dsn, c.key, c.value); got != c.want { t.Errorf("appendDSNParam(%q, %q, %q)\n got = %q\nwant = %q", c.dsn, c.key, c.value, got, c.want) } }) } } // Init 实际走的就是这条路径。两个参数缺一不可:漏了 clientFoundRows,Update* 的 // 存在性检查会把「编辑时一个字段都没改」误判成「记录不存在」,成了比原缺陷更糟的 // 回归——正常的保存会被拒绝。 func TestNormalizeDSNAddsBothParams(t *testing.T) { got := normalizeDSN("root:pw@tcp(db:3306)/wmms?charset=utf8mb4") want := "root:pw@tcp(db:3306)/wmms?charset=utf8mb4&parseTime=true&clientFoundRows=true" if got != want { t.Fatalf("normalizeDSN()\n got = %q\nwant = %q", got, want) } }