File: list_test.go

package info (click to toggle)
coyim 0.3.7-3
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 4,064 kB
  • ctags: 4,528
  • sloc: xml: 5,120; sh: 328; python: 286; makefile: 235; ruby: 51
file content (364 lines) | stat: -rw-r--r-- 10,668 bytes parent folder | download
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
package roster

import (
	"io/ioutil"
	"log"
	"testing"

	"github.com/twstrike/gotk3adapter/glib_mock"
	"github.com/twstrike/coyim/i18n"

	g "gopkg.in/check.v1"
)

func Test(t *testing.T) { g.TestingT(t) }

func init() {
	log.SetOutput(ioutil.Discard)
	i18n.InitLocalization(&glib_mock.Mock{})
}

type ListSuite struct{}

var _ = g.Suite(&ListSuite{})

func (s *ListSuite) Test_New_returnsANewList(c *g.C) {
	l := New()
	c.Assert(l, g.Not(g.IsNil))
	c.Assert(l.peers, g.Not(g.IsNil))
}

func (s *ListSuite) Test_Remove_doesNothingWhenAskedToRemoveEntryNotInList(c *g.C) {
	l := New()
	l.peers["foo@bar.com"] = &Peer{}

	res, rem := l.Remove("bar@foo.com")

	c.Assert(rem, g.Equals, false)
	c.Assert(res, g.IsNil)
	c.Assert(len(l.peers), g.Equals, 1)
}

func (s *ListSuite) Test_Remove_removesAnEntryIfInTheList(c *g.C) {
	l := New()
	l.peers["foo@bar.com"] = &Peer{}
	l.peers["bar@foo.com"] = &Peer{Name: "me"}

	res, rem := l.Remove("bar@foo.com/somewhere")

	c.Assert(rem, g.Equals, true)
	c.Assert(res.Name, g.Equals, "me")
	c.Assert(len(l.peers), g.Equals, 1)
}

func (s *ListSuite) Test_AddOrReplace_addsTheEntryIfNotInTheList(c *g.C) {
	l := New()
	p := &Peer{Jid: "somewhere", Name: "something"}

	res := l.AddOrReplace(p)

	c.Assert(res, g.Equals, true)
	c.Assert(len(l.peers), g.Equals, 1)
	c.Assert(l.peers["somewhere"], g.Equals, p)
}

func (s *ListSuite) Test_AddOrReplace_replacesTheEntryIfInTheList(c *g.C) {
	l := New()
	p1 := &Peer{Jid: "somewhere", Name: "something", Groups: toSet("hello"), Subscription: "from"}
	l.peers["somewhere"] = p1

	p2 := &Peer{Jid: "somewhere", Name: "something2", Groups: toSet("goodbye")}
	res := l.AddOrReplace(p2)

	c.Assert(res, g.Equals, false)
	c.Assert(len(l.peers), g.Equals, 1)
	c.Assert(l.peers["somewhere"], g.Equals, p2)
}

func (s *ListSuite) Test_AddOrMerge_addsTheEntryIfNotInTheList(c *g.C) {
	l := New()
	p := &Peer{Jid: "somewhere", Name: "something"}

	res := l.AddOrMerge(p)

	c.Assert(res, g.Equals, true)
	c.Assert(len(l.peers), g.Equals, 1)
	c.Assert(l.peers["somewhere"], g.Equals, p)
}

func (s *ListSuite) Test_AddOrReplace_mergesTheEntriesIfInTheList(c *g.C) {
	l := New()
	p1 := &Peer{Jid: "somewhere", Name: "something", Groups: toSet("hello"), Subscription: "from"}
	l.peers["somewhere"] = p1

	p2 := &Peer{Jid: "somewhere", Name: "something2", Groups: toSet("goodbye")}
	res := l.AddOrMerge(p2)

	c.Assert(res, g.Equals, false)
	c.Assert(len(l.peers), g.Equals, 1)
	c.Assert(*l.peers["somewhere"], g.DeepEquals, Peer{Jid: "somewhere", Name: "something2", Groups: toSet("goodbye"), Subscription: "from", resources: toSet()})
}

func (s *ListSuite) Test_ToSlice_createsASliceOfTheContentSortedAlphabetically(c *g.C) {
	l := New()
	l.AddOrMerge(&Peer{Jid: "foo@somewhere.com"})
	l.AddOrMerge(&Peer{Jid: "foo@somewhen.com"})
	l.AddOrMerge(&Peer{Jid: "bar@somewhere.com"})

	c.Assert(l.ToSlice(), g.DeepEquals, []*Peer{
		&Peer{Jid: "bar@somewhere.com"},
		&Peer{Jid: "foo@somewhen.com"},
		&Peer{Jid: "foo@somewhere.com"},
	})
}

func (s *ListSuite) Test_Iter_yieldsEachEntry(c *g.C) {
	l := New()
	l.AddOrMerge(&Peer{Jid: "foo@somewhere.com"})
	l.AddOrMerge(&Peer{Jid: "foo@somewhen.com"})
	l.AddOrMerge(&Peer{Jid: "bar@somewhere.com"})

	called := 0

	l.Iter(func(ix int, p *Peer) {
		called++

		switch ix {
		case 0:
			c.Assert(p, g.DeepEquals, &Peer{Jid: "bar@somewhere.com"})
		case 1:
			c.Assert(p, g.DeepEquals, &Peer{Jid: "foo@somewhen.com"})
		case 2:
			c.Assert(p, g.DeepEquals, &Peer{Jid: "foo@somewhere.com"})
		}
	})

	c.Assert(called, g.DeepEquals, 3)
}

func (s *ListSuite) Test_Unsubscribed_whenDoesntExist(c *g.C) {
	l := New()
	l.Unsubscribed("foo@bar.com")
}

func (s *ListSuite) Test_Unsubscribed_whenExist(c *g.C) {
	l := New()
	l.AddOrMerge(&Peer{Jid: "foo@bar.com", Subscription: "both", Asked: true, PendingSubscribeID: "foo"})
	l.AddOrMerge(&Peer{Jid: "foo2@bar.com", Subscription: "to"})
	l.AddOrMerge(&Peer{Jid: "foo3@bar.com", Subscription: "from"})

	l.Unsubscribed("foo@bar.com/123")
	c.Assert(l.peers["foo@bar.com"].Subscription, g.Equals, "from")
	c.Assert(l.peers["foo@bar.com"].Asked, g.Equals, false)
	c.Assert(l.peers["foo@bar.com"].PendingSubscribeID, g.Equals, "")

	l.Unsubscribed("foo2@bar.com/123")
	c.Assert(l.peers["foo2@bar.com"].Subscription, g.Equals, "none")

	l.Unsubscribed("foo3@bar.com/123")
	c.Assert(l.peers["foo3@bar.com"].Subscription, g.Equals, "from")
}

func (s *ListSuite) Test_Subscribed_whenDoesntExist(c *g.C) {
	l := New()
	l.Subscribed("foo@bar.com")
	c.Assert(len(l.peers), g.Equals, 0)
}

func (s *ListSuite) Test_Subscribed_whenExist(c *g.C) {
	l := New()
	l.AddOrMerge(&Peer{Jid: "foo@bar.com", Subscription: "from", Asked: true, PendingSubscribeID: "foo"})
	l.AddOrMerge(&Peer{Jid: "foo2@bar.com", Subscription: "none"})
	l.AddOrMerge(&Peer{Jid: "foo3@bar.com", Subscription: ""})
	l.AddOrMerge(&Peer{Jid: "foo4@bar.com", Subscription: "both"})

	l.Subscribed("foo@bar.com/123")
	c.Assert(l.peers["foo@bar.com"].Subscription, g.Equals, "both")
	c.Assert(l.peers["foo@bar.com"].Asked, g.Equals, false)
	c.Assert(l.peers["foo@bar.com"].PendingSubscribeID, g.Equals, "")

	l.Subscribed("foo2@bar.com/123")
	c.Assert(l.peers["foo2@bar.com"].Subscription, g.Equals, "to")

	l.Subscribed("foo3@bar.com/123")
	c.Assert(l.peers["foo3@bar.com"].Subscription, g.Equals, "to")

	l.Subscribed("foo4@bar.com/123")
	c.Assert(l.peers["foo4@bar.com"].Subscription, g.Equals, "both")
}

func (s *ListSuite) Test_GetPendingSubscribe_returnsThePendingSubscribeIfExists(c *g.C) {
	l := New()
	l.AddOrMerge(&Peer{Jid: "foo@bar.com", PendingSubscribeID: "foo"})
	l.AddOrMerge(&Peer{Jid: "foo2@bar.com"})

	v, k := l.GetPendingSubscribe("none@foo.com")
	c.Assert(k, g.Equals, false)

	v, k = l.GetPendingSubscribe("foo@bar.com/bar")
	c.Assert(k, g.Equals, true)
	c.Assert(v, g.Equals, "foo")

	v, k = l.GetPendingSubscribe("foo2@bar.com/bar")
	c.Assert(k, g.Equals, false)
	c.Assert(v, g.Equals, "")
}

func (s *ListSuite) Test_RemovePendingSubscribe_removesThePendingSubscribe(c *g.C) {
	l := New()
	l.AddOrMerge(&Peer{Jid: "foo@bar.com", PendingSubscribeID: "foo"})
	l.AddOrMerge(&Peer{Jid: "foo2@bar.com"})

	v, k := l.RemovePendingSubscribe("none@foo.com")
	c.Assert(k, g.Equals, false)

	v, k = l.RemovePendingSubscribe("foo@bar.com/bar")
	c.Assert(k, g.Equals, true)
	c.Assert(v, g.Equals, "foo")
	c.Assert(l.peers["foo@bar.com"].PendingSubscribeID, g.Equals, "")

	v, k = l.RemovePendingSubscribe("foo2@bar.com/bar")
	c.Assert(k, g.Equals, false)
	c.Assert(v, g.Equals, "")
}

func (s *ListSuite) Test_SubscribeRequest_addsTheSubscribeID(c *g.C) {
	l := New()
	l.AddOrMerge(&Peer{Jid: "foo@bar.com"})

	l.SubscribeRequest("fox@bar.com/hmm", "something", "")
	c.Assert(l.peers["fox@bar.com"].PendingSubscribeID, g.Equals, "something")

	l.SubscribeRequest("foo@bar.com/hmm2", "something3", "")
	c.Assert(l.peers["foo@bar.com"].PendingSubscribeID, g.Equals, "something3")
}

func (s *ListSuite) Test_StateOf_returnsState(c *g.C) {
	l := New()
	l.AddOrMerge(&Peer{Jid: "foo@bar.com", Status: "bla", StatusMsg: "hmm"})

	st, sm, k := l.StateOf("hmm.bar@bar.com")
	c.Assert(k, g.Equals, false)

	st, sm, k = l.StateOf("foo@bar.com/aha")
	c.Assert(k, g.Equals, true)
	c.Assert(st, g.Equals, "bla")
	c.Assert(sm, g.Equals, "hmm")
}

func (s *ListSuite) Test_PeerBecameUnavailable_setsTheOfflineState(c *g.C) {
	l := New()
	l.AddOrMerge(&Peer{Jid: "foo@bar.com", Online: true})

	res := l.PeerBecameUnavailable("hmm@bar.com/foo")
	c.Assert(res, g.Equals, false)

	res = l.PeerBecameUnavailable("foo@bar.com/foo2")
	c.Assert(res, g.Equals, true)
	c.Assert(l.peers["foo@bar.com"].Online, g.Equals, false)
}

func (s *ListSuite) Test_PeerPresenceUpdate_sometimesUpdatesNonExistantPeers(c *g.C) {
	l := New()

	res := l.PeerPresenceUpdate("foo@bar.com/hmm", "hello", "goodbye", "")
	c.Assert(res, g.Equals, true)
	c.Assert(l.peers["foo@bar.com"].Status, g.Equals, "hello")
	c.Assert(l.peers["foo@bar.com"].StatusMsg, g.Equals, "goodbye")

	res = l.PeerPresenceUpdate("foo2@bar.com/hmm", "xa", "goodbye", "")
	c.Assert(res, g.Equals, true)
	c.Assert(l.peers["foo2@bar.com"].Status, g.Equals, "xa")
	c.Assert(l.peers["foo2@bar.com"].StatusMsg, g.Equals, "goodbye")

	res = l.PeerPresenceUpdate("foo3@bar.com/hmm", "away", "goodbye", "")
	c.Assert(res, g.Equals, true)
	c.Assert(l.peers["foo3@bar.com"].Status, g.Equals, "away")
	c.Assert(l.peers["foo3@bar.com"].StatusMsg, g.Equals, "goodbye")

}

func (s *ListSuite) Test_PeerPresenceUpdate_updatesPreviouslyKnownPeer(c *g.C) {
	l := New()
	l.AddOrMerge(&Peer{Jid: "foo@bar.com", Online: false, resources: toSet()})
	l.AddOrMerge(&Peer{Jid: "foo2@bar.com", Online: true, Status: "dnd", StatusMsg: "working", resources: toSet()})

	res := l.PeerPresenceUpdate("foo@bar.com/hmm", "hello", "goodbye", "")
	c.Assert(res, g.Equals, true)
	c.Assert(l.peers["foo@bar.com"].Status, g.Equals, "hello")
	c.Assert(l.peers["foo@bar.com"].StatusMsg, g.Equals, "goodbye")
	c.Assert(l.peers["foo@bar.com"].Online, g.Equals, true)

	res = l.PeerPresenceUpdate("foo2@bar.com/hmm", "dnd", "working", "")
	c.Assert(res, g.Equals, false)
	c.Assert(l.peers["foo2@bar.com"].Status, g.Equals, "dnd")
	c.Assert(l.peers["foo2@bar.com"].StatusMsg, g.Equals, "working")
	c.Assert(l.peers["foo2@bar.com"].Online, g.Equals, true)
}

func (s *ListSuite) Test_Clear_clearsTheList(c *g.C) {
	l := New()
	l.AddOrMerge(&Peer{Jid: "foo@bar.com"})

	l.Clear()

	c.Assert(len(l.peers), g.Equals, 0)
}

func (s *ListSuite) Test_Peers_sortsByNameForPresentation(c *g.C) {
	expectedPeers := []*Peer{
		&Peer{
			Jid: "ba", Name: "ab",
		},
		&Peer{
			Jid: "ac", Name: "",
		},
		&Peer{
			Jid: "aa", Name: "bb",
		},
		&Peer{
			Jid: "aa", Name: "cb",
		},
	}

	group := &Group{
		peers: []*Peer{
			expectedPeers[2],
			expectedPeers[0],
			expectedPeers[3],
			expectedPeers[1],
		},
	}

	c.Assert(group.Peers(), g.DeepEquals, expectedPeers)
}

func (s *ListSuite) Test_LatestError_setsLatestErrorWhenExists(c *g.C) {
	l := New()
	pp := &Peer{Jid: "foo@bar.com"}
	l.AddOrMerge(pp)
	l.LatestError("foo@bar.com/foo", "tow", "frou", "sxi")

	c.Assert(pp.LatestError, g.DeepEquals, &PeerError{"tow", "frou", "sxi"})
}

func (s *ListSuite) Test_LatestError_doesntDoAnythingForUnexistingPeer(c *g.C) {
	l := New()
	l.LatestError("foo@bar.com/foo", "tow", "frou", "sxi")
}

func (s *ListSuite) Test_IterAll_willIterateOverAllTheListsGivenAndYieldTheirPeers(c *g.C) {
	l := New()
	l2 := New()
	pp := &Peer{Jid: "foo@bar.com"}
	pp2 := &Peer{Jid: "foo2@bar.com"}
	l.AddOrMerge(pp)
	l2.AddOrMerge(pp2)

	result := []*Peer{}
	IterAll(func(_ int, p *Peer) {
		result = append(result, p)
	}, l, l2)

	c.Assert(result, g.DeepEquals, []*Peer{pp2, pp})
}