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 = &params.UserInfo{Username: "first"}
   164  				result.Results[1].Result = &params.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 = &params.Error{Message: "first error"}
   187  				result.Results[1].Error = &params.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  }