github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/api/usermanager/client_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package usermanager_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/names" 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/api/usermanager" 13 "github.com/juju/juju/apiserver/params" 14 jujutesting "github.com/juju/juju/juju/testing" 15 "github.com/juju/juju/testing/factory" 16 ) 17 18 type usermanagerSuite struct { 19 jujutesting.JujuConnSuite 20 21 usermanager *usermanager.Client 22 } 23 24 var _ = gc.Suite(&usermanagerSuite{}) 25 26 func (s *usermanagerSuite) SetUpTest(c *gc.C) { 27 s.JujuConnSuite.SetUpTest(c) 28 s.usermanager = usermanager.NewClient(s.APIState) 29 c.Assert(s.usermanager, gc.NotNil) 30 } 31 32 func (s *usermanagerSuite) TestAddUser(c *gc.C) { 33 tag, _, err := s.usermanager.AddUser("foobar", "Foo Bar", "password", "") 34 c.Assert(err, jc.ErrorIsNil) 35 36 user, err := s.State.User(tag) 37 c.Assert(err, jc.ErrorIsNil) 38 c.Assert(user.Name(), gc.Equals, "foobar") 39 c.Assert(user.DisplayName(), gc.Equals, "Foo Bar") 40 c.Assert(user.PasswordValid("password"), jc.IsTrue) 41 } 42 43 func (s *usermanagerSuite) TestAddUserWithModelAccess(c *gc.C) { 44 sharedModelState := s.Factory.MakeModel(c, nil) 45 defer sharedModelState.Close() 46 47 foobarTag, _, err := s.usermanager.AddUser("foobar", "Foo Bar", "password", "read", sharedModelState.ModelUUID()) 48 c.Assert(err, jc.ErrorIsNil) 49 50 altAdminTag, _, err := s.usermanager.AddUser("altadmin", "Alt Admin", "password", "write", sharedModelState.ModelUUID()) 51 c.Assert(err, jc.ErrorIsNil) 52 53 // Check model is shared with expected users. 54 sharedModel, err := sharedModelState.Model() 55 c.Assert(err, jc.ErrorIsNil) 56 users, err := sharedModel.Users() 57 c.Assert(err, jc.ErrorIsNil) 58 c.Assert(users, gc.HasLen, 3) 59 var modelUserTags = make([]names.UserTag, len(users)) 60 for i, u := range users { 61 modelUserTags[i] = u.UserTag() 62 if u.UserTag().Name() == "foobar" { 63 c.Assert(u.ReadOnly(), jc.IsTrue) 64 } else { 65 c.Assert(u.ReadOnly(), jc.IsFalse) 66 } 67 } 68 c.Assert(modelUserTags, jc.SameContents, []names.UserTag{ 69 foobarTag, 70 altAdminTag, 71 names.NewLocalUserTag("admin"), 72 }) 73 } 74 75 func (s *usermanagerSuite) TestAddExistingUser(c *gc.C) { 76 s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar"}) 77 78 _, _, err := s.usermanager.AddUser("foobar", "Foo Bar", "password", "read") 79 c.Assert(err, gc.ErrorMatches, "failed to create user: user already exists") 80 } 81 82 func (s *usermanagerSuite) TestAddUserResponseError(c *gc.C) { 83 usermanager.PatchResponses(s, s.usermanager, 84 func(interface{}) error { 85 return errors.New("call error") 86 }, 87 ) 88 _, _, err := s.usermanager.AddUser("foobar", "Foo Bar", "password", "write") 89 c.Assert(err, gc.ErrorMatches, "call error") 90 } 91 92 func (s *usermanagerSuite) TestAddUserResultCount(c *gc.C) { 93 usermanager.PatchResponses(s, s.usermanager, 94 func(result interface{}) error { 95 if result, ok := result.(*params.AddUserResults); ok { 96 result.Results = make([]params.AddUserResult, 2) 97 return nil 98 } 99 return errors.New("wrong result type") 100 }, 101 ) 102 _, _, err := s.usermanager.AddUser("foobar", "Foo Bar", "password", "read") 103 c.Assert(err, gc.ErrorMatches, "expected 1 result, got 2") 104 } 105 106 func (s *usermanagerSuite) TestDisableUser(c *gc.C) { 107 user := s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar"}) 108 109 err := s.usermanager.DisableUser(user.Name()) 110 c.Assert(err, jc.ErrorIsNil) 111 112 err = user.Refresh() 113 c.Assert(err, jc.ErrorIsNil) 114 c.Assert(user.IsDisabled(), jc.IsTrue) 115 } 116 117 func (s *usermanagerSuite) TestDisableUserBadName(c *gc.C) { 118 err := s.usermanager.DisableUser("not!good") 119 c.Assert(err, gc.ErrorMatches, `"not!good" is not a valid username`) 120 } 121 122 func (s *usermanagerSuite) TestEnableUser(c *gc.C) { 123 user := s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar", Disabled: true}) 124 125 err := s.usermanager.EnableUser(user.Name()) 126 c.Assert(err, jc.ErrorIsNil) 127 128 err = user.Refresh() 129 c.Assert(err, jc.ErrorIsNil) 130 c.Assert(user.IsDisabled(), jc.IsFalse) 131 } 132 133 func (s *usermanagerSuite) TestEnableUserBadName(c *gc.C) { 134 err := s.usermanager.EnableUser("not!good") 135 c.Assert(err, gc.ErrorMatches, `"not!good" is not a valid username`) 136 } 137 138 func (s *usermanagerSuite) TestCantRemoveAdminUser(c *gc.C) { 139 err := s.usermanager.DisableUser(s.AdminUserTag(c).Name()) 140 c.Assert(err, gc.ErrorMatches, "failed to disable user: cannot disable controller model owner") 141 } 142 143 func (s *usermanagerSuite) TestUserInfo(c *gc.C) { 144 user := s.Factory.MakeUser(c, &factory.UserParams{ 145 Name: "foobar", DisplayName: "Foo Bar"}) 146 147 obtained, err := s.usermanager.UserInfo([]string{"foobar"}, usermanager.AllUsers) 148 c.Assert(err, jc.ErrorIsNil) 149 expected := []params.UserInfo{ 150 { 151 Username: "foobar", 152 DisplayName: "Foo Bar", 153 CreatedBy: s.AdminUserTag(c).Name(), 154 DateCreated: user.DateCreated(), 155 }, 156 } 157 158 c.Assert(obtained, jc.DeepEquals, expected) 159 } 160 161 func (s *usermanagerSuite) TestUserInfoMoreThanOneResult(c *gc.C) { 162 usermanager.PatchResponses(s, s.usermanager, 163 func(result interface{}) error { 164 if result, ok := result.(*params.UserInfoResults); ok { 165 result.Results = make([]params.UserInfoResult, 2) 166 result.Results[0].Result = ¶ms.UserInfo{Username: "first"} 167 result.Results[1].Result = ¶ms.UserInfo{Username: "second"} 168 return nil 169 } 170 return errors.New("wrong result type") 171 }, 172 ) 173 obtained, err := s.usermanager.UserInfo(nil, usermanager.AllUsers) 174 c.Assert(err, jc.ErrorIsNil) 175 176 expected := []params.UserInfo{ 177 {Username: "first"}, 178 {Username: "second"}, 179 } 180 181 c.Assert(obtained, jc.DeepEquals, expected) 182 } 183 184 func (s *usermanagerSuite) TestUserInfoMoreThanOneError(c *gc.C) { 185 usermanager.PatchResponses(s, s.usermanager, 186 func(result interface{}) error { 187 if result, ok := result.(*params.UserInfoResults); ok { 188 result.Results = make([]params.UserInfoResult, 2) 189 result.Results[0].Error = ¶ms.Error{Message: "first error"} 190 result.Results[1].Error = ¶ms.Error{Message: "second error"} 191 return nil 192 } 193 return errors.New("wrong result type") 194 }, 195 ) 196 _, err := s.usermanager.UserInfo([]string{"foo", "bar"}, usermanager.AllUsers) 197 c.Assert(err, gc.ErrorMatches, "foo: first error, bar: second error") 198 } 199 200 func (s *usermanagerSuite) TestSetUserPassword(c *gc.C) { 201 tag := s.AdminUserTag(c) 202 err := s.usermanager.SetPassword(tag.Name(), "new-password") 203 c.Assert(err, jc.ErrorIsNil) 204 user, err := s.State.User(tag) 205 c.Assert(err, jc.ErrorIsNil) 206 c.Assert(user.PasswordValid("new-password"), jc.IsTrue) 207 } 208 209 func (s *usermanagerSuite) TestSetUserPasswordCanonical(c *gc.C) { 210 tag := s.AdminUserTag(c) 211 err := s.usermanager.SetPassword(tag.Canonical(), "new-password") 212 c.Assert(err, jc.ErrorIsNil) 213 user, err := s.State.User(tag) 214 c.Assert(err, jc.ErrorIsNil) 215 c.Assert(user.PasswordValid("new-password"), jc.IsTrue) 216 } 217 218 func (s *usermanagerSuite) TestSetUserPasswordBadName(c *gc.C) { 219 err := s.usermanager.SetPassword("not!good", "new-password") 220 c.Assert(err, gc.ErrorMatches, `"not!good" is not a valid username`) 221 }