-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathtests.go
112 lines (93 loc) · 2.76 KB
/
tests.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package tests
import (
"context"
"reflect"
"testing"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/code-payments/code-server/pkg/code/data/messaging"
)
func RunTests(t *testing.T, s messaging.Store, teardown func()) {
for _, tf := range []func(t *testing.T, s messaging.Store){
testHappyPath,
testDuplicateMessage,
testGetMultipleMessages,
testDeleteNonExistantMessage,
} {
tf(t, s)
teardown()
}
}
func testHappyPath(t *testing.T, s messaging.Store) {
t.Run("testHappyPath", func(t *testing.T) {
ctx := context.Background()
record := makeUniqueRecordForAccount("account")
require.NoError(t, s.Insert(ctx, record))
actual, err := s.Get(ctx, record.Account)
require.NoError(t, err)
require.Len(t, actual, 1)
assertEquivalentRecords(t, record, actual[0])
require.NoError(t, s.Delete(ctx, record.Account, record.MessageID))
actual, err = s.Get(ctx, record.Account)
require.NoError(t, err)
assert.Empty(t, actual)
})
}
func testDuplicateMessage(t *testing.T, s messaging.Store) {
t.Run("testDuplicateMessage", func(t *testing.T) {
ctx := context.Background()
record := makeUniqueRecordForAccount("account")
require.NoError(t, s.Insert(ctx, record))
assert.Equal(t, messaging.ErrDuplicateMessageID, s.Insert(ctx, record))
})
}
func testGetMultipleMessages(t *testing.T, s messaging.Store) {
t.Run("testGetMultipleMessages", func(t *testing.T) {
ctx := context.Background()
records := []*messaging.Record{
makeUniqueRecordForAccount("account"),
makeUniqueRecordForAccount("account"),
makeUniqueRecordForAccount("account"),
}
for _, record := range records {
require.NoError(t, s.Insert(ctx, record))
}
actual, err := s.Get(ctx, records[0].Account)
require.NoError(t, err)
require.Len(t, actual, len(records))
for _, record := range records {
var found bool
for _, other := range actual {
if reflect.DeepEqual(other, record) {
found = true
break
}
}
assert.True(t, found)
}
})
}
func testDeleteNonExistantMessage(t *testing.T, s messaging.Store) {
t.Run("testDeleteNonExistantMessage", func(t *testing.T) {
ctx := context.Background()
require.NoError(t, s.Delete(ctx, "account", uuid.New()))
})
}
func makeUniqueRecordForAccount(account string) *messaging.Record {
var message []byte
for i := 0; i < 10; i++ {
messagePart, _ := uuid.New().MarshalBinary()
message = append(message, messagePart...)
}
return &messaging.Record{
Account: account,
MessageID: uuid.New(),
Message: message,
}
}
func assertEquivalentRecords(t *testing.T, obj1, obj2 *messaging.Record) {
assert.Equal(t, obj1.Account, obj2.Account)
assert.Equal(t, obj1.MessageID, obj2.MessageID)
assert.Equal(t, obj1.Message, obj2.Message)
}