fix bug
This commit is contained in:
1 parent
b55ceb1fdd
commit
a951e4aad3
6 files changed
+279
-44
No files matched your search
@@ -0,0 +1,46 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
// InsertSettingIfAbsent 是 auth.password_hash 的兜底:调用方的 GetSetting 检查可能
|
||||
// 因为数据库报错而失效,也可能被并发请求插队(bcrypt 要跑几十毫秒),所以"仅首次
|
||||
// 可设"的保证必须落在主键约束上,而不是上层的 if 判断。
|
||||
func TestInsertSettingIfAbsentDoesNotOverwrite(t *testing.T) {
|
||||
d, err := Open(testDSN(t))
|
||||
if err != nil {
|
||||
t.Skipf("postgres unavailable (%v)", err)
|
||||
}
|
||||
defer d.Close()
|
||||
|
||||
// 用测试专属 key,绝不碰开发库里真实的 auth.password_hash。
|
||||
key := fmt.Sprintf("test.insert_if_absent.%d", time.Now().UnixNano())
|
||||
defer func() { _, _ = d.Exec(`DELETE FROM settings WHERE key=$1`, key) }()
|
||||
|
||||
inserted, err := d.InsertSettingIfAbsent(key, "first")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !inserted {
|
||||
t.Fatal("首次写入应返回 inserted=true")
|
||||
}
|
||||
|
||||
inserted, err = d.InsertSettingIfAbsent(key, "second")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if inserted {
|
||||
t.Fatal("键已存在时应返回 inserted=false")
|
||||
}
|
||||
|
||||
got, ok, err := d.GetSetting(key)
|
||||
if err != nil || !ok {
|
||||
t.Fatalf("GetSetting: ok=%v err=%v", ok, err)
|
||||
}
|
||||
if got != "first" {
|
||||
t.Fatalf("值被覆盖成 %q,应保持 %q", got, "first")
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user