// 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. // +build !appengine package user import ( "fmt" "net/http" "testing" "github.com/golang/protobuf/proto" "google.golang.org/appengine/internal" "google.golang.org/appengine/internal/aetesting" pb "google.golang.org/appengine/internal/user" ) func baseReq() *http.Request { return &http.Request{ Header: http.Header{}, } } type basicUserTest struct { nickname, email, authDomain, admin string // expectations isNil, isAdmin bool displayName string } var basicUserTests = []basicUserTest{ {"", "", "", "0", true, false, ""}, {"ken", "ken@example.com", "example.com", "0", false, false, "ken"}, {"ken", "ken@example.com", "auth_domain.com", "1", false, true, "ken@example.com"}, } func TestBasicUserAPI(t *testing.T) { for i, tc := range basicUserTests { req := baseReq() req.Header.Set("X-AppEngine-User-Nickname", tc.nickname) req.Header.Set("X-AppEngine-User-Email", tc.email) req.Header.Set("X-AppEngine-Auth-Domain", tc.authDomain) req.Header.Set("X-AppEngine-User-Is-Admin", tc.admin) c := internal.ContextForTesting(req) if ga := IsAdmin(c); ga != tc.isAdmin { t.Errorf("test %d: expected IsAdmin(c) = %v, got %v", i, tc.isAdmin, ga) } u := Current(c) if tc.isNil { if u != nil { t.Errorf("test %d: expected u == nil, got %+v", i, u) } continue } if u == nil { t.Errorf("test %d: expected u != nil, got nil", i) continue } if u.Email != tc.email { t.Errorf("test %d: expected u.Email = %q, got %q", i, tc.email, u.Email) } if gs := u.String(); gs != tc.displayName { t.Errorf("test %d: expected u.String() = %q, got %q", i, tc.displayName, gs) } if u.Admin != tc.isAdmin { t.Errorf("test %d: expected u.Admin = %v, got %v", i, tc.isAdmin, u.Admin) } } } func TestLoginURL(t *testing.T) { expectedQuery := &pb.CreateLoginURLRequest{ DestinationUrl: proto.String("/destination"), } const expectedDest = "/redir/dest" c := aetesting.FakeSingleContext(t, "user", "CreateLoginURL", func(req *pb.CreateLoginURLRequest, res *pb.CreateLoginURLResponse) error { if !proto.Equal(req, expectedQuery) { return fmt.Errorf("got %v, want %v", req, expectedQuery) } res.LoginUrl = proto.String(expectedDest) return nil }) url, err := LoginURL(c, "/destination") if err != nil { t.Fatalf("LoginURL failed: %v", err) } if url != expectedDest { t.Errorf("got %v, want %v", url, expectedDest) } } // TODO(dsymonds): Add test for LogoutURL.