Skip to content

Commit 1ab7be9

Browse files
committed
tests: added test for Body() methods of requests using golden files
1 parent 57d71e8 commit 1ab7be9

8 files changed

+173
-0
lines changed

golden_test.go

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package tarantool_test
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"fmt"
7+
"github.com/tarantool/go-iproto"
8+
"github.com/tarantool/go-tarantool/v2"
9+
"os"
10+
"path"
11+
"testing"
12+
"time"
13+
14+
"github.com/stretchr/testify/assert"
15+
"github.com/stretchr/testify/require"
16+
"github.com/vmihailenco/msgpack/v5"
17+
)
18+
19+
var (
20+
DEBUG = false
21+
)
22+
23+
func setDebug() {
24+
DEBUG = true
25+
}
26+
27+
func logMsgpackAsJsonConvert(t *testing.T, data []byte) {
28+
var decodedMsgpack map[int]interface{}
29+
30+
decoder := msgpack.NewDecoder(bytes.NewReader(data))
31+
require.NoError(t, decoder.Decode(&decodedMsgpack))
32+
33+
var encodedJson []byte
34+
if DEBUG {
35+
decodedConvertedMsgpack := map[string]interface{}{}
36+
for k, v := range decodedMsgpack {
37+
decodedConvertedMsgpack[fmt.Sprintf("%s[%d]", iproto.Key(k).String(), k)] = v
38+
}
39+
40+
var err error
41+
encodedJson, err = json.MarshalIndent(decodedConvertedMsgpack, "", " ")
42+
require.NoError(t, err, "failed to convert msgpack to json")
43+
} else {
44+
var err error
45+
encodedJson, err = json.MarshalIndent(decodedMsgpack, "", " ")
46+
require.NoError(t, err)
47+
}
48+
49+
for _, line := range bytes.Split(encodedJson, []byte("\n")) {
50+
t.Log(string(line))
51+
}
52+
}
53+
54+
func compareGoldenMsgpack(t *testing.T, name string, data []byte) bool {
55+
t.Helper()
56+
57+
testContent, err := os.ReadFile(name)
58+
require.NoError(t, err, "failed to read golden file", name)
59+
60+
if assert.Equal(t, testContent, data, "golden file content is not equal to actual") {
61+
if DEBUG {
62+
logMsgpackAsJsonConvert(t, data)
63+
}
64+
return true
65+
}
66+
67+
t.Logf("expected:\n")
68+
logMsgpackAsJsonConvert(t, testContent)
69+
t.Logf("actual:\n")
70+
logMsgpackAsJsonConvert(t, data)
71+
72+
return false
73+
}
74+
75+
func fileExists(name string) bool {
76+
_, err := os.Stat(name)
77+
return !os.IsNotExist(err)
78+
}
79+
80+
func executeGoldenTest(t *testing.T, name string, f func(t *testing.T, enc *msgpack.Encoder)) {
81+
t.Helper()
82+
83+
t.Run(name, func(t *testing.T) {
84+
var out bytes.Buffer
85+
encoder := msgpack.NewEncoder(&out)
86+
87+
switch f(t, encoder); {
88+
case !fileExists(name):
89+
t.Logf("writing golden file %s", name)
90+
err := os.WriteFile(name, out.Bytes(), 0644)
91+
assert.NoError(t, err, "failed to write golden file", name)
92+
case !compareGoldenMsgpack(t, name, out.Bytes()):
93+
// ???
94+
}
95+
})
96+
}
97+
98+
func TestGolden(t *testing.T) {
99+
setDebug()
100+
101+
var pathPrefix = "testdata/requests"
102+
103+
var testCases = []struct {
104+
name string
105+
getter func(t *testing.T, enc *msgpack.Encoder)
106+
}{
107+
{
108+
name: "commit-raw.msgpack",
109+
getter: func(t *testing.T, enc *msgpack.Encoder) {
110+
commit := tarantool.NewCommitRequest()
111+
require.NoError(t, commit.Body(nil, enc), "failed to encode request")
112+
},
113+
},
114+
{
115+
name: "commit-with-sync.msgpack",
116+
getter: func(t *testing.T, enc *msgpack.Encoder) {
117+
commit := tarantool.NewCommitRequest().IsSync(true)
118+
require.NoError(t, commit.Body(nil, enc), "failed to encode request")
119+
},
120+
},
121+
{
122+
name: "commit-with-sync-false.msgpack",
123+
getter: func(t *testing.T, enc *msgpack.Encoder) {
124+
commit := tarantool.NewCommitRequest().IsSync(false)
125+
require.NoError(t, commit.Body(nil, enc), "failed to encode request")
126+
},
127+
},
128+
{
129+
name: "begin.msgpack",
130+
getter: func(t *testing.T, enc *msgpack.Encoder) {
131+
begin := tarantool.NewBeginRequest()
132+
require.NoError(t, begin.Body(nil, enc), "failed to encode request")
133+
},
134+
},
135+
{
136+
name: "begin-with-txn-isolation.msgpack",
137+
getter: func(t *testing.T, enc *msgpack.Encoder) {
138+
begin := tarantool.NewBeginRequest().
139+
TxnIsolation(tarantool.ReadCommittedLevel)
140+
require.NoError(t, begin.Body(nil, enc), "failed to encode request")
141+
},
142+
},
143+
{
144+
name: "begin-with-txn-isolation-is-sync.msgpack",
145+
getter: func(t *testing.T, enc *msgpack.Encoder) {
146+
begin := tarantool.NewBeginRequest().
147+
TxnIsolation(tarantool.ReadCommittedLevel).
148+
IsSync(true)
149+
require.NoError(t, begin.Body(nil, enc), "failed to encode request")
150+
},
151+
},
152+
{
153+
name: "begin-with-txn-isolation-is-sync-timeout.msgpack",
154+
getter: func(t *testing.T, enc *msgpack.Encoder) {
155+
begin := tarantool.NewBeginRequest().
156+
TxnIsolation(tarantool.ReadCommittedLevel).
157+
IsSync(true).
158+
Timeout(2 * time.Second)
159+
require.NoError(t, begin.Body(nil, enc), "failed to encode request")
160+
},
161+
},
162+
}
163+
164+
for _, tc := range testCases {
165+
executeGoldenTest(t, path.Join(pathPrefix, tc.name), tc.getter)
166+
}
167+
}
15 Bytes
Binary file not shown.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
�Ya�
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
�Y

testdata/requests/begin.msgpack

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
�a�
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
�a�

0 commit comments

Comments
 (0)