-
Notifications
You must be signed in to change notification settings - Fork 4
/
pubcontrol_test.go
172 lines (148 loc) · 4.73 KB
/
pubcontrol_test.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
// pubcontrol_test.go
// ~~~~~~~~~
// This module implements the PubControl tests.
// :authors: Konstantin Bokarius.
// :copyright: (c) 2015 by Fanout, Inc.
// :license: MIT, see LICENSE for more details.
package pubcontrol
import (
"errors"
"github.com/stretchr/testify/assert"
"strings"
"testing"
)
func TestPcInitialize(t *testing.T) {
pc := NewPubControl(nil)
assert.Equal(t, len(pc.clients), 0)
pc = NewPubControl([]map[string]interface{}{
map[string]interface{}{
"uri": "uri",
"iss": "hello",
"key": "key"}})
assert.Equal(t, len(pc.clients), 1)
}
func TestPcAddAndRemoveAllClients(t *testing.T) {
pc := NewPubControl(nil)
pcc := NewPubControlClient("uri")
pc.AddClient(pcc)
pc.AddClient(pcc)
assert.Equal(t, len(pc.clients), 2)
assert.Equal(t, pc.clients[0], pcc)
assert.Equal(t, pc.clients[1], pcc)
pc.RemoveAllClients()
assert.Equal(t, len(pc.clients), 0)
}
func TestApplyConfig(t *testing.T) {
pc := NewPubControl(nil)
pc.ApplyConfig([]map[string]interface{}{
map[string]interface{}{
"uri": "uri",
"iss": "hello",
"key": "key"},
map[string]interface{}{
"uri": "uri2",
"iss": "hello2",
"key": "key2"}})
claim := make(map[string]interface{})
claim["iss"] = "hello"
claim2 := make(map[string]interface{})
claim2["iss"] = "hello2"
assert.Equal(t, pc.clients[0].uri, "uri")
assert.Equal(t, pc.clients[0].authJwtClaim, claim)
assert.Equal(t, pc.clients[0].authJwtKey, []byte("key"))
assert.Equal(t, pc.clients[1].uri, "uri2")
assert.Equal(t, pc.clients[1].authJwtClaim, claim2)
assert.Equal(t, pc.clients[1].authJwtKey, []byte("key2"))
pc = NewPubControl(nil)
pc.ApplyConfig([]map[string]interface{}{
map[string]interface{}{
"uri": "uri"}})
assert.Equal(t, pc.clients[0].uri, "uri")
assert.Equal(t, pc.clients[0].authJwtClaim, map[string]interface{}(nil))
assert.Equal(t, pc.clients[0].authJwtKey, []byte(nil))
}
var publishResults1 []interface{} = nil
func publish1(pcc *PubControlClient, channel string, item *Item) error {
publishResults1 = append(publishResults1, channel, item)
return nil
}
var publishResults2 []interface{} = nil
func publish2(pcc *PubControlClient, channel string, item *Item) error {
publishResults2 = append(publishResults2, channel, item)
return nil
}
func TestPcPublish(t *testing.T) {
publishResults1 = nil
publishResults2 = nil
formats := make([]Formatter, 0)
formats = append(formats, fmt1a)
item := NewItem(formats, "id", "prev-id")
pc := NewPubControl(nil)
pcc := NewPubControlClient("uri")
pcc.publish = publish1
pc.AddClient(pcc)
pcc = NewPubControlClient("uri")
pcc.publish = publish2
pc.AddClient(pcc)
err := pc.Publish("chan", item)
assert.NoError(t, err)
assert.Equal(t, publishResults1[0], "chan")
assert.Equal(t, publishResults1[1], item)
assert.Equal(t, publishResults2[0], "chan")
assert.Equal(t, publishResults2[1], item)
}
func publishError(pcc *PubControlClient, channel string, item *Item) error {
return errors.New("Intentional error for tests")
}
func TestPcPublishPartialError(t *testing.T) {
publishResults1 = nil
publishResults2 = nil
formats := make([]Formatter, 0)
formats = append(formats, fmt1a)
item := NewItem(formats, "id", "prev-id")
pc := NewPubControl(nil)
pcc := NewPubControlClient("uri")
pcc.publish = publish1
pc.AddClient(pcc)
pcc = NewPubControlClient("errorUri")
pcc.publish = publishError
pc.AddClient(pcc)
pcc = NewPubControlClient("uri")
pcc.publish = publish2
pc.AddClient(pcc)
err := pc.Publish("chan", item)
assert.Error(t, err)
assert.Equal(t, "1/3 client(s) failed to publish to channel: chan Errors: [errorUri: Intentional error for tests]", err.Error())
assert.Equal(t, publishResults1[0], "chan")
assert.Equal(t, publishResults1[1], item)
assert.Equal(t, publishResults2[0], "chan")
assert.Equal(t, publishResults2[1], item)
}
func publishPanic(pcc *PubControlClient, channel string, item *Item) error {
panic("Intentional panic for tests")
}
func TestPcPublishPartialPanic(t *testing.T) {
publishResults1 = nil
publishResults2 = nil
formats := make([]Formatter, 0)
formats = append(formats, fmt1a)
item := NewItem(formats, "id", "prev-id")
pc := NewPubControl(nil)
pcc := NewPubControlClient("uri")
pcc.publish = publish1
pc.AddClient(pcc)
pcc = NewPubControlClient("panicUri")
pcc.publish = publishPanic
pc.AddClient(pcc)
pcc = NewPubControlClient("uri")
pcc.publish = publish2
pc.AddClient(pcc)
err := pc.Publish("chan", item)
assert.Error(t, err)
assert.True(t, strings.Contains(err.Error(),
"1/3 client(s) failed to publish to channel: chan Errors: [panicUri: PANIC: Intentional panic for tests"))
assert.Equal(t, publishResults1[0], "chan")
assert.Equal(t, publishResults1[1], item)
assert.Equal(t, publishResults2[0], "chan")
assert.Equal(t, publishResults2[1], item)
}