chore(build): 新增 make test/lint/fmt 并修复 testdb 连接串缺陷
- make test 自动拉起并等待 PostgreSQL 就绪;测试用临时 schema 隔离,不污染开发库 - 新增 make test-db / lint / fmt - 修复 testdb.withSearchPath:原实现用 url.Values.Encode() 重编码整个查询串, 把 TimeZone=Asia/Shanghai 变成 Asia%2FShanghai,pgx 原样传给服务端后报 "unknown time zone Asia%2FShanghai",导致数据库起来后集成测试依然全挂。 改为只追加 search_path,并补测试锁定该行为。
This commit is contained in:
@@ -61,12 +61,20 @@ func New(t testing.TB, _ ...interface{}) *gorm.DB {
|
||||
return db
|
||||
}
|
||||
|
||||
// withSearchPath 给 DSN 追加 search_path,让每个测试用例落在自己的临时 schema 里。
|
||||
//
|
||||
// 注意:这里刻意只「追加」而不用 url.Values.Encode() 重新编码整个查询串。
|
||||
// 重新编码会把 TimeZone=Asia/Shanghai 变成 Asia%2FShanghai,pgx 会把这个值原样
|
||||
// 传给服务端并报错 "unknown time zone Asia%2FShanghai",导致所有集成测试连不上库。
|
||||
func withSearchPath(dsn, schema string) string {
|
||||
parsed, err := url.Parse(dsn)
|
||||
if err == nil && strings.HasPrefix(parsed.Scheme, "postgres") {
|
||||
query := parsed.Query()
|
||||
query.Set("search_path", schema)
|
||||
parsed.RawQuery = query.Encode()
|
||||
separator := "&"
|
||||
if parsed.RawQuery == "" {
|
||||
separator = "?"
|
||||
}
|
||||
// url.URL.String() 原样输出 RawQuery,不会再做一次百分号编码。
|
||||
parsed.RawQuery = parsed.RawQuery + separator + "search_path=" + url.QueryEscape(schema)
|
||||
return parsed.String()
|
||||
}
|
||||
if strings.TrimSpace(dsn) == "" {
|
||||
|
||||
Reference in New Issue
Block a user