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