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})
}
|