blob: c3030d36d90f73cb88437866b0b68fd144d2d543 [file] [log] [blame]
// Copyright 2011 Google Inc. All rights reserved.
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
package xmpp
import (
"fmt"
"reflect"
"testing"
"github.com/golang/protobuf/proto"
"google.golang.org/appengine"
"google.golang.org/appengine/internal/aetesting"
pb "google.golang.org/appengine/internal/xmpp"
)
func newPresenceResponse(isAvailable bool, presence pb.PresenceResponse_SHOW, valid bool) *pb.PresenceResponse {
return &pb.PresenceResponse{
IsAvailable: proto.Bool(isAvailable),
Presence: presence.Enum(),
Valid: proto.Bool(valid),
}
}
func setPresenceResponse(m *pb.PresenceResponse, isAvailable bool, presence pb.PresenceResponse_SHOW, valid bool) {
m.IsAvailable = &isAvailable
m.Presence = presence.Enum()
m.Valid = &valid
}
func TestGetPresence(t *testing.T) {
c := aetesting.FakeSingleContext(t, "xmpp", "GetPresence", func(in *pb.PresenceRequest, out *pb.PresenceResponse) error {
if jid := in.GetJid(); jid != "user@example.com" {
return fmt.Errorf("bad jid %q", jid)
}
setPresenceResponse(out, true, pb.PresenceResponse_CHAT, true)
return nil
})
presence, err := GetPresence(c, "user@example.com", "")
if err != nil {
t.Fatalf("GetPresence: %v", err)
}
if presence != "chat" {
t.Errorf("GetPresence: got %#v, want %#v", presence, pb.PresenceResponse_CHAT)
}
}
func TestGetPresenceMultiSingleJID(t *testing.T) {
c := aetesting.FakeSingleContext(t, "xmpp", "BulkGetPresence", func(in *pb.BulkPresenceRequest, out *pb.BulkPresenceResponse) error {
if !reflect.DeepEqual(in.Jid, []string{"user@example.com"}) {
return fmt.Errorf("bad request jids %#v", in.Jid)
}
out.PresenceResponse = []*pb.PresenceResponse{
newPresenceResponse(true, pb.PresenceResponse_NORMAL, true),
}
return nil
})
presence, err := GetPresenceMulti(c, []string{"user@example.com"}, "")
if err != nil {
t.Fatalf("GetPresenceMulti: %v", err)
}
if !reflect.DeepEqual(presence, []string{""}) {
t.Errorf("GetPresenceMulti: got %s, want %s", presence, []string{""})
}
}
func TestGetPresenceMultiJID(t *testing.T) {
c := aetesting.FakeSingleContext(t, "xmpp", "BulkGetPresence", func(in *pb.BulkPresenceRequest, out *pb.BulkPresenceResponse) error {
if !reflect.DeepEqual(in.Jid, []string{"user@example.com", "user2@example.com"}) {
return fmt.Errorf("bad request jids %#v", in.Jid)
}
out.PresenceResponse = []*pb.PresenceResponse{
newPresenceResponse(true, pb.PresenceResponse_NORMAL, true),
newPresenceResponse(true, pb.PresenceResponse_AWAY, true),
}
return nil
})
jids := []string{"user@example.com", "user2@example.com"}
presence, err := GetPresenceMulti(c, jids, "")
if err != nil {
t.Fatalf("GetPresenceMulti: %v", err)
}
want := []string{"", "away"}
if !reflect.DeepEqual(presence, want) {
t.Errorf("GetPresenceMulti: got %v, want %v", presence, want)
}
}
func TestGetPresenceMultiFromJID(t *testing.T) {
c := aetesting.FakeSingleContext(t, "xmpp", "BulkGetPresence", func(in *pb.BulkPresenceRequest, out *pb.BulkPresenceResponse) error {
if !reflect.DeepEqual(in.Jid, []string{"user@example.com", "user2@example.com"}) {
return fmt.Errorf("bad request jids %#v", in.Jid)
}
if jid := in.GetFromJid(); jid != "bot@appspot.com" {
return fmt.Errorf("bad from jid %q", jid)
}
out.PresenceResponse = []*pb.PresenceResponse{
newPresenceResponse(true, pb.PresenceResponse_NORMAL, true),
newPresenceResponse(true, pb.PresenceResponse_CHAT, true),
}
return nil
})
jids := []string{"user@example.com", "user2@example.com"}
presence, err := GetPresenceMulti(c, jids, "bot@appspot.com")
if err != nil {
t.Fatalf("GetPresenceMulti: %v", err)
}
want := []string{"", "chat"}
if !reflect.DeepEqual(presence, want) {
t.Errorf("GetPresenceMulti: got %v, want %v", presence, want)
}
}
func TestGetPresenceMultiInvalid(t *testing.T) {
c := aetesting.FakeSingleContext(t, "xmpp", "BulkGetPresence", func(in *pb.BulkPresenceRequest, out *pb.BulkPresenceResponse) error {
if !reflect.DeepEqual(in.Jid, []string{"user@example.com", "user2@example.com"}) {
return fmt.Errorf("bad request jids %#v", in.Jid)
}
out.PresenceResponse = []*pb.PresenceResponse{
newPresenceResponse(true, pb.PresenceResponse_EXTENDED_AWAY, true),
newPresenceResponse(true, pb.PresenceResponse_CHAT, false),
}
return nil
})
jids := []string{"user@example.com", "user2@example.com"}
presence, err := GetPresenceMulti(c, jids, "")
wantErr := appengine.MultiError{nil, ErrInvalidJID}
if !reflect.DeepEqual(err, wantErr) {
t.Fatalf("GetPresenceMulti: got %#v, want %#v", err, wantErr)
}
want := []string{"xa", ""}
if !reflect.DeepEqual(presence, want) {
t.Errorf("GetPresenceMulti: got %#v, want %#v", presence, want)
}
}
func TestGetPresenceMultiUnavailable(t *testing.T) {
c := aetesting.FakeSingleContext(t, "xmpp", "BulkGetPresence", func(in *pb.BulkPresenceRequest, out *pb.BulkPresenceResponse) error {
if !reflect.DeepEqual(in.Jid, []string{"user@example.com", "user2@example.com"}) {
return fmt.Errorf("bad request jids %#v", in.Jid)
}
out.PresenceResponse = []*pb.PresenceResponse{
newPresenceResponse(false, pb.PresenceResponse_AWAY, true),
newPresenceResponse(false, pb.PresenceResponse_DO_NOT_DISTURB, true),
}
return nil
})
jids := []string{"user@example.com", "user2@example.com"}
presence, err := GetPresenceMulti(c, jids, "")
wantErr := appengine.MultiError{
ErrPresenceUnavailable,
ErrPresenceUnavailable,
}
if !reflect.DeepEqual(err, wantErr) {
t.Fatalf("GetPresenceMulti: got %#v, want %#v", err, wantErr)
}
want := []string{"", ""}
if !reflect.DeepEqual(presence, want) {
t.Errorf("GetPresenceMulti: got %#v, want %#v", presence, want)
}
}