Skip to content

Commit ca97e5c

Browse files
redistest: Add test layer over miniredis
1 parent 7379bd7 commit ca97e5c

File tree

4 files changed

+74
-24
lines changed

4 files changed

+74
-24
lines changed

go.mod

+9-4
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
module github.com/upfluence/redis
22

3-
go 1.18
3+
go 1.21
4+
5+
toolchain go1.22.2
46

57
require (
8+
github.com/alicebob/miniredis/v2 v2.33.0
69
github.com/redis/go-redis/v9 v9.6.0
7-
github.com/stretchr/testify v1.8.0
8-
github.com/upfluence/log v0.0.3
10+
github.com/stretchr/testify v1.8.4
11+
github.com/upfluence/log v0.0.5
12+
github.com/upfluence/pkg v1.13.4
913
)
1014

1115
require (
16+
github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a // indirect
1217
github.com/cespare/xxhash/v2 v2.2.0 // indirect
1318
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
1419
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
1520
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
16-
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 // indirect
21+
github.com/yuin/gopher-lua v1.1.1 // indirect
1722
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
1823
gopkg.in/yaml.v3 v3.0.1 // indirect
1924
)

go.sum

+18-8
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,16 @@ github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMd
55
github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=
66
github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0=
77
github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
8+
github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk=
9+
github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc=
10+
github.com/alicebob/miniredis/v2 v2.33.0 h1:uvTF0EDeu9RLnUEG27Db5I68ESoIxTiXbNUiji6lZrA=
11+
github.com/alicebob/miniredis/v2 v2.33.0/go.mod h1:MhP4a3EU7aENRi9aO+tHfTBZicLqQevyi/DJpoj6mi0=
812
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
913
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=
1014
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
15+
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
1116
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
17+
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
1218
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
1319
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
1420
github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM=
@@ -126,21 +132,23 @@ github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb6
126132
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
127133
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
128134
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
129-
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
130135
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
131136
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
132137
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
133138
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
134-
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
135-
github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
136-
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
139+
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
140+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
137141
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
138142
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
139143
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
140144
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
141145
github.com/upfluence/errors v0.0.0-20210413181856-d161314a8a8c/go.mod h1:WWK5iZiYpEHoLYZV+MZSFsHrnYueCUMwsaEEko7aiTU=
142-
github.com/upfluence/log v0.0.3 h1:yikPvlErTFvDM3KLt6rz75GXNyRJ/PkL5aU1DNkVgm0=
143-
github.com/upfluence/log v0.0.3/go.mod h1:1uMfWKPiN8wDCUtENVcYC0bRrTqMeSyAP5R3P5yWXsc=
146+
github.com/upfluence/errors v0.2.9 h1:aX3Ij5yF7r9c6WdbjxhNiyG2ydrqC2+x3mNCU91poGM=
147+
github.com/upfluence/errors v0.2.9/go.mod h1:XmrnFoB1O343aOni1tqU1wZNQuRhWNDHXa/cqnFzDzE=
148+
github.com/upfluence/log v0.0.5 h1:OR7KY6NKfrqvWfXz1nWHEGLtwP+tw1a5x/6hfPBatHU=
149+
github.com/upfluence/log v0.0.5/go.mod h1:1uMfWKPiN8wDCUtENVcYC0bRrTqMeSyAP5R3P5yWXsc=
150+
github.com/upfluence/pkg v1.13.4 h1:4qV6cgI49ekOHN6tTMMI1DQ98Wd5xV7LUWe7doov1UQ=
151+
github.com/upfluence/pkg v1.13.4/go.mod h1:7Fn+mB7PRizHmtiEym3Wj91fSw0JsOaRo/ULmJuKnSk=
144152
github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4=
145153
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
146154
github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w=
@@ -154,6 +162,8 @@ github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmv
154162
github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=
155163
github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=
156164
github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc=
165+
github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
166+
github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
157167
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
158168
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
159169
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -177,8 +187,8 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
177187
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
178188
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
179189
golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
180-
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0=
181-
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
190+
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
191+
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
182192
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
183193
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
184194
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

redistest/test_case.go

+33-9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"testing"
99
"time"
1010

11+
"github.com/alicebob/miniredis/v2"
1112
"github.com/upfluence/log/record"
1213

1314
"github.com/upfluence/redis"
@@ -40,6 +41,8 @@ func (tl testLogger) Log(cmd string, vs []interface{}, _ error, d time.Duration,
4041
type TestCase struct {
4142
redisURL string
4243

44+
skipMiniredis bool
45+
4346
opts []redisutil.Option
4447
}
4548

@@ -57,11 +60,11 @@ func NewTestCase(opts ...TestCaseOption) *TestCase {
5760
return &tc
5861
}
5962

60-
func (tc *TestCase) buildDB(t *testing.T) redis.DB {
63+
func (tc *TestCase) buildDB(t *testing.T, url string) redis.DB {
6164
db, err := redisutil.Open(
6265
append(
6366
tc.opts,
64-
redisutil.WithURL(tc.redisURL),
67+
redisutil.WithURL(url),
6568
redisutil.WithMiddleware(logger.NewFactory(testLogger{t})),
6669
)...,
6770
)
@@ -76,15 +79,36 @@ func (tc *TestCase) buildDB(t *testing.T) redis.DB {
7679
func (tc *TestCase) Run(t *testing.T, fn func(t *testing.T, db redis.DB)) {
7780
t.Helper()
7881

79-
if tc.redisURL == "" {
80-
t.Skip("No redis url given, skipping test case")
81-
}
82+
for name, dbc := range map[string]func(testing.TB) string{
83+
"redis": func(t testing.TB) string {
84+
t.Helper()
85+
86+
if tc.redisURL == "" {
87+
t.Skip("No redis url given, skipping test case")
88+
}
89+
return tc.redisURL
90+
},
91+
"miniredis": func(t testing.TB) string {
92+
t.Helper()
8293

83-
db := tc.buildDB(t)
94+
if tc.skipMiniredis {
95+
t.Skip("miniredis is deactivated")
96+
}
8497

85-
defer db.Close()
98+
s := miniredis.RunT(t)
8699

87-
db.Do(context.Background(), "FLUSHDB")
100+
return fmt.Sprintf("redis://%s/0", s.Addr())
101+
},
102+
} {
103+
t.Run(name, func(t *testing.T) {
104+
url := dbc(t)
105+
db := tc.buildDB(t, url)
88106

89-
fn(t, db)
107+
defer db.Close()
108+
109+
db.Do(context.Background(), "FLUSHDB")
110+
111+
fn(t, db)
112+
})
113+
}
90114
}

redisutil/open.go

+14-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/upfluence/redis"
77
"github.com/upfluence/redis/backend"
8+
"github.com/upfluence/redis/middleware/prefix"
89
)
910

1011
type Option func(*builder)
@@ -23,13 +24,19 @@ func WithMiddleware(f redis.MiddlewareFactory) Option {
2324

2425
func WithURL(v string) Option {
2526
var (
26-
cfg backend.Config
27+
cfg backend.Config
28+
prefix string
2729

2830
u, err = url.Parse(v)
2931
)
3032

3133
if err == nil {
32-
cfg, err = backend.ParseURL(v)
34+
qs := u.Query()
35+
prefix = qs.Get("prefix")
36+
qs.Del("prefix")
37+
u.RawQuery = qs.Encode()
38+
39+
cfg, err = backend.ParseURL(u.String())
3340
}
3441

3542
return func(b *builder) {
@@ -38,7 +45,7 @@ func WithURL(v string) Option {
3845
return
3946
}
4047

41-
b.prefix = u.Query().Get("prefix")
48+
b.prefix = prefix
4249
b.cfg = cfg
4350

4451
}
@@ -72,6 +79,10 @@ func Open(opts ...Option) (redis.DB, error) {
7279

7380
db := backend.NewDBFromConfig(b.cfg)
7481

82+
if b.prefix != "" {
83+
db = prefix.NewFactory(b.prefix).Wrap(db)
84+
}
85+
7586
for _, m := range b.middlewares {
7687
db = m.Wrap(db)
7788
}

0 commit comments

Comments
 (0)