github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 11 apitesting "github.com/juju/juju/api/base/testing" 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.OpenControllerAPI(c)) 29 c.Assert(s.usermanager, gc.NotNil) 30 } 31 32 func (s *usermanagerSuite) TearDownTest(c *gc.C) { 33 s.usermanager.Close() 34 s.JujuConnSuite.TearDownTest(c) 35 } 36 37 func (s *usermanagerSuite) TestAddUser(c *gc.C) { 38 tag, _, err := s.usermanager.AddUser("foobar", "Foo Bar", "password") 39 c.Assert(err, jc.ErrorIsNil) 40 41 user, err := s.State.User(tag) 42 c.Assert(err, jc.ErrorIsNil) 43 c.Assert(user.Name(), gc.Equals, "foobar") 44 c.Assert(user.DisplayName(), gc.Equals, "Foo Bar") 45 c.Assert(user.PasswordValid("password"), jc.IsTrue) 46 } 47 48 func (s *usermanagerSuite) TestAddExistingUser(c *gc.C) { 49 s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar"}) 50 51 _, _, err := s.usermanager.AddUser("foobar", "Foo Bar", "password") 52 c.Assert(err, gc.ErrorMatches, "failed to create user: username unavailable") 53 } 54 55 func (s *usermanagerSuite) TestAddUserResponseError(c *gc.C) { 56 usermanager.PatchResponses(s, s.usermanager, 57 func(interface{}) error { 58 return errors.New("call error") 59 }, 60 ) 61 _, _, err := s.usermanager.AddUser("foobar", "Foo Bar", "password") 62 c.Assert(err, gc.ErrorMatches, "call error") 63 } 64 65 func (s *usermanagerSuite) TestAddUserResultCount(c *gc.C) { 66 usermanager.PatchResponses(s, s.usermanager, 67 func(result interface{}) error { 68 if result, ok := result.(*params.AddUserResults); ok { 69 result.Results = make([]params.AddUserResult, 2) 70 return nil 71 } 72 return errors.New("wrong result type") 73 }, 74 ) 75 _, _, err := s.usermanager.AddUser("foobar", "Foo Bar", "password") 76 c.Assert(err, gc.ErrorMatches, "expected 1 result, got 2") 77 } 78 79 func (s *usermanagerSuite) TestRemoveUser(c *gc.C) { 80 tag, _, err := s.usermanager.AddUser("jjam", "Jimmy Jam", "password") 81 c.Assert(err, jc.ErrorIsNil) 82 83 // Ensure the user exists. 84 user, err := s.State.User(tag) 85 c.Assert(err, jc.ErrorIsNil) 86 c.Assert(user.Name(), gc.Equals, "jjam") 87 c.Assert(user.DisplayName(), gc.Equals, "Jimmy Jam") 88 89 // Delete the user. 90 err = s.usermanager.RemoveUser(tag.Name()) 91 c.Assert(err, jc.ErrorIsNil) 92 93 // Assert that the user is gone. 94 _, err = s.State.User(tag) 95 c.Assert(err, gc.ErrorMatches, `user "jjam" is permanently deleted`) 96 97 err = user.Refresh() 98 c.Check(err, jc.ErrorIsNil) 99 c.Assert(user.IsDeleted(), jc.IsTrue) 100 } 101 102 func (s *usermanagerSuite) TestDisableUser(c *gc.C) { 103 user := s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar"}) 104 105 err := s.usermanager.DisableUser(user.Name()) 106 c.Assert(err, jc.ErrorIsNil) 107 108 err = user.Refresh() 109 c.Assert(err, jc.ErrorIsNil) 110 c.Assert(user.IsDisabled(), jc.IsTrue) 111 } 112 113 func (s *usermanagerSuite) TestDisableUserBadName(c *gc.C) { 114 err := s.usermanager.DisableUser("not!good") 115 c.Assert(err, gc.ErrorMatches, `"not!good" is not a valid username`) 116 } 117 118 func (s *usermanagerSuite) TestEnableUser(c *gc.C) { 119 user := s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar", Disabled: true}) 120 121 err := s.usermanager.EnableUser(user.Name()) 122 c.Assert(err, jc.ErrorIsNil) 123 124 err = user.Refresh() 125 c.Assert(err, jc.ErrorIsNil) 126 c.Assert(user.IsDisabled(), jc.IsFalse) 127 } 128 129 func (s *usermanagerSuite) TestEnableUserBadName(c *gc.C) { 130 err := s.usermanager.EnableUser("not!good") 131 c.Assert(err, gc.ErrorMatches, `"not!good" is not a valid username`) 132 } 133 134 func (s *usermanagerSuite) TestCantRemoveAdminUser(c *gc.C) { 135 err := s.usermanager.DisableUser(s.AdminUserTag(c).Name()) 136 c.Assert(err, gc.ErrorMatches, "failed to disable user: cannot disable controller model owner") 137 } 138 139 func (s *usermanagerSuite) TestUserInfo(c *gc.C) { 140 user := s.Factory.MakeUser(c, &factory.UserParams{ 141 Name: "foobar", DisplayName: "Foo Bar"}) 142 143 obtained, err := s.usermanager.UserInfo([]string{"foobar"}, usermanager.AllUsers) 144 c.Assert(err, jc.ErrorIsNil) 145 expected := []params.UserInfo{ 146 { 147 Username: "foobar", 148 DisplayName: "Foo Bar", 149 Access: "login", 150 CreatedBy: s.AdminUserTag(c).Name(), 151 DateCreated: user.DateCreated(), 152 }, 153 } 154 155 c.Assert(obtained, jc.DeepEquals, expected) 156 } 157 158 func (s *usermanagerSuite) TestUserInfoMoreThanOneResult(c *gc.C) { 159 usermanager.PatchResponses(s, s.usermanager, 160 func(result interface{}) error { 161 if result, ok := result.(*params.UserInfoResults); ok { 162 result.Results = make([]params.UserInfoResult, 2) 163 result.Results[0].Result = ¶ms.UserInfo{Username: "first"} 164 result.Results[1].Result = ¶ms.UserInfo{Username: "second"} 165 return nil 166 } 167 return errors.New("wrong result type") 168 }, 169 ) 170 obtained, err := s.usermanager.UserInfo(nil, usermanager.AllUsers) 171 c.Assert(err, jc.ErrorIsNil) 172 173 expected := []params.UserInfo{ 174 {Username: "first"}, 175 {Username: "second"}, 176 } 177 178 c.Assert(obtained, jc.DeepEquals, expected) 179 } 180 181 func (s *usermanagerSuite) TestUserInfoMoreThanOneError(c *gc.C) { 182 usermanager.PatchResponses(s, s.usermanager, 183 func(result interface{}) error { 184 if result, ok := result.(*params.UserInfoResults); ok { 185 result.Results = make([]params.UserInfoResult, 2) 186 result.Results[0].Error = ¶ms.Error{Message: "first error"} 187 result.Results[1].Error = ¶ms.Error{Message: "second error"} 188 return nil 189 } 190 return errors.New("wrong result type") 191 }, 192 ) 193 _, err := s.usermanager.UserInfo([]string{"foo", "bar"}, usermanager.AllUsers) 194 c.Assert(err, gc.ErrorMatches, "foo: first error, bar: second error") 195 } 196 197 func (s *usermanagerSuite) TestSetUserPassword(c *gc.C) { 198 tag := s.AdminUserTag(c) 199 err := s.usermanager.SetPassword(tag.Name(), "new-password") 200 c.Assert(err, jc.ErrorIsNil) 201 user, err := s.State.User(tag) 202 c.Assert(err, jc.ErrorIsNil) 203 c.Assert(user.PasswordValid("new-password"), jc.IsTrue) 204 } 205 206 func (s *usermanagerSuite) TestSetUserPasswordCanonical(c *gc.C) { 207 tag := s.AdminUserTag(c) 208 err := s.usermanager.SetPassword(tag.Id(), "new-password") 209 c.Assert(err, jc.ErrorIsNil) 210 user, err := s.State.User(tag) 211 c.Assert(err, jc.ErrorIsNil) 212 c.Assert(user.PasswordValid("new-password"), jc.IsTrue) 213 } 214 215 func (s *usermanagerSuite) TestSetUserPasswordBadName(c *gc.C) { 216 err := s.usermanager.SetPassword("not!good", "new-password") 217 c.Assert(err, gc.ErrorMatches, `"not!good" is not a valid username`) 218 } 219 220 func (s *usermanagerSuite) TestResetPasswordResponseError(c *gc.C) { 221 apiCaller := apitesting.APICallerFunc(func(string, int, string, string, interface{}, interface{}) error { 222 return errors.New("boom") 223 }) 224 client := usermanager.NewClient(apiCaller) 225 _, err := client.ResetPassword("foobar") 226 c.Assert(err, gc.ErrorMatches, "boom") 227 } 228 229 func (s *usermanagerSuite) TestResetPassword(c *gc.C) { 230 key := []byte("no cats or dragons here") 231 apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 232 c.Assert(objType, gc.Equals, "UserManager") 233 c.Assert(request, gc.Equals, "ResetPassword") 234 args, ok := arg.(params.Entities) 235 c.Assert(ok, jc.IsTrue) 236 c.Assert(args, gc.DeepEquals, params.Entities{ 237 Entities: []params.Entity{{Tag: "user-foobar"}}, 238 }) 239 240 if results, k := result.(*params.AddUserResults); k { 241 keys := []params.AddUserResult{ 242 { 243 Tag: "user-foobar", 244 SecretKey: key, 245 }, 246 } 247 results.Results = keys 248 } 249 return nil 250 }) 251 client := usermanager.NewClient(apiCaller) 252 result, err := client.ResetPassword("foobar") 253 c.Assert(err, jc.ErrorIsNil) 254 c.Assert(result, gc.DeepEquals, key) 255 } 256 257 func (s *usermanagerSuite) TestResetPasswordInvalidUsername(c *gc.C) { 258 _, err := s.usermanager.ResetPassword("not/valid") 259 c.Assert(err, gc.ErrorMatches, `invalid user name "not/valid"`) 260 } 261 262 func (s *usermanagerSuite) TestResetPasswordResultCount(c *gc.C) { 263 apiCaller := apitesting.APICallerFunc(func(objType string, version int, id, request string, arg, result interface{}) error { 264 if results, k := result.(*params.AddUserResults); k { 265 results.Results = make([]params.AddUserResult, 2) 266 } 267 return nil 268 }) 269 client := usermanager.NewClient(apiCaller) 270 _, err := client.ResetPassword("foobar") 271 c.Assert(err, gc.ErrorMatches, "expected 1 result, got 2") 272 }