package store import ( "context" "regexp" "testing" ) // 兑换码:固定形态 SDX-XXXX-XXXX-XXXX,字母表剔除易混字符(0/O、1/I/L)。 func TestNewRedeemCodeFormat(t *testing.T) { re := regexp.MustCompile(`^SDX(-[ABCDEFGHJKMNPQRSTUVWXYZ23456789]{4}){3}$`) seen := map[string]bool{} for i := 0; i < 200; i++ { code, err := newRedeemCode() if err != nil { t.Fatalf("生成失败: %v", err) } if !re.MatchString(code) { t.Fatalf("形态不符: %q", code) } if seen[code] { t.Fatalf("200 个样本内撞码: %q(crypto/rand 出问题了)", code) } seen[code] = true } } // 参数校验在 nil-db 之前生效——admin 手滑发 0 面额/超量不该打到数据库才被拒。 func TestGenerateRedeemCodesBounds(t *testing.T) { p := &Postgres{} // db==nil for _, tc := range []struct { n int credit int64 }{{0, 1e6}, {201, 1e6}, {1, 0}, {1, -5}} { if _, err := p.GenerateRedeemCodes(context.Background(), tc.n, tc.credit, ""); err == nil { t.Errorf("n=%d credit=%d 应被拒", tc.n, tc.credit) } } }