package gateway import ( "encoding/xml" "strings" "testing" "gosrc.io/xmpp/stanza" ) func testPresence(t *testing.T, presence stanza.Presence, reference string) { byteXML, err := xml.Marshal(presence) if err != nil { t.Errorf("XML parse error: %v", err) } xmlText := string(byteXML) if xmlText != reference { t.Errorf("%v does not match %v", xmlText, reference) } } func TestPresenceFrom(t *testing.T) { presence := newPresence("from@test", "to@test", SPFrom("test")) testPresence(t, presence, "") } func TestPresenceNoFrom(t *testing.T) { presence := newPresence("from@test", "to@test") testPresence(t, presence, "") } func TestPresenceType(t *testing.T) { presence := newPresence("from@test", "to@test", SPType("subscribe")) testPresence(t, presence, "") } func TestPresenceShow(t *testing.T) { presence := newPresence("from@test", "to@test", SPShow("dnd")) testPresence(t, presence, "dnd") } func TestPresenceStatus(t *testing.T) { presence := newPresence("from@test", "to@test", SPStatus("cooking")) testPresence(t, presence, "cooking") } func TestPresenceNickname(t *testing.T) { presence := newPresence("from@test", "to@test", SPNickname("Ishmael")) testPresence(t, presence, "Ishmael") } func TestPresencePhoto(t *testing.T) { presence := newPresence("from@test", "to@test", SPPhoto("01b87fcd030b72895ff8e88db57ec525450f000d")) testPresence(t, presence, "01b87fcd030b72895ff8e88db57ec525450f000d") } func TestPresenceCaps(t *testing.T) { presence := newPresence("from@test", "to@test", SPCaps("QgayPKawpkPSDYmwT/WM94uAlu0=")) testPresence(t, presence, "") } // Canonical XEP-0115 S5.1 worked examples (Exodus, Psi, BombusMod). func testDiscoVer(t *testing.T, disco *stanza.DiscoInfo, reference string) { ver := DiscoVer(disco) if ver != reference { var sb strings.Builder discoToCaps(disco, &sb) t.Errorf("%v does not match %v\nRaw string: %v", ver, reference, sb.String()) } } func TestDiscoVerExodus(t *testing.T) { disco := stanza.DiscoInfo{ Identity: []stanza.Identity{ {Name: "Exodus 0.9.1", Category: "client", Type: "pc"}, }, Features: []stanza.Feature{ {Var: "http://jabber.org/protocol/disco#info"}, {Var: "http://jabber.org/protocol/disco#items"}, {Var: "http://jabber.org/protocol/muc"}, {Var: "http://jabber.org/protocol/caps"}, }, } testDiscoVer(t, &disco, "QgayPKawpkPSDYmwT/WM94uAlu0=") } func TestDiscoVerPsi(t *testing.T) { disco := stanza.DiscoInfo{ Identity: []stanza.Identity{ {Name: "Psi 0.11", Category: "client", Type: "pc"}, {Name: "Ψ 0.11", Category: "client", Type: "pc"}, }, Features: []stanza.Feature{ {Var: "http://jabber.org/protocol/disco#info"}, {Var: "http://jabber.org/protocol/disco#items"}, {Var: "http://jabber.org/protocol/muc"}, {Var: "http://jabber.org/protocol/caps"}, }, Form: &stanza.Form{ Type: "result", Fields: []*stanza.Field{ {Var: "FORM_TYPE", Type: "hidden", ValuesList: []string{"urn:xmpp:dataforms:softwareinfo"}}, {Var: "ip_version", Type: "text-multi", ValuesList: []string{"ipv4", "ipv6"}}, {Var: "os", ValuesList: []string{"Mac"}}, {Var: "os_version", ValuesList: []string{"10.5.1"}}, {Var: "software", ValuesList: []string{"Psi"}}, {Var: "software_version", ValuesList: []string{"0.11"}}, }, }, } testDiscoVer(t, &disco, "MxdZjNKNku1+SiM9N92yqIK2HTQ=") } func TestDiscoVerBombusMod(t *testing.T) { disco := stanza.DiscoInfo{ Identity: []stanza.Identity{ {Name: "BombusMod", Category: "client", Type: "mobile"}, }, Features: []stanza.Feature{ {Var: "http://jabber.org/protocol/activity"}, {Var: "http://jabber.org/protocol/activity+notify"}, {Var: "http://jabber.org/protocol/caps"}, {Var: "http://jabber.org/protocol/commands"}, {Var: "http://jabber.org/protocol/disco#info"}, {Var: "http://jabber.org/protocol/disco#items"}, {Var: "http://jabber.org/protocol/rosterx"}, {Var: "jabber:iq:last"}, {Var: "jabber:iq:privacy"}, {Var: "jabber:iq:roster"}, {Var: "jabber:iq:time"}, {Var: "jabber:iq:version"}, {Var: "jabber:x:oob"}, {Var: "urn:xmpp:ping"}, {Var: "urn:xmpp:time"}, }, } testDiscoVer(t, &disco, "7Awj7pIUiI5UW/L2fdtzXZFQHsw=") }