github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/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  	"github.com/juju/juju/api/usermanager"
    12  	"github.com/juju/juju/apiserver/params"
    13  	jujutesting "github.com/juju/juju/juju/testing"
    14  	"github.com/juju/juju/testing/factory"
    15  )
    16  
    17  type usermanagerSuite struct {
    18  	jujutesting.JujuConnSuite
    19  
    20  	usermanager *usermanager.Client
    21  }
    22  
    23  var _ = gc.Suite(&usermanagerSuite{})
    24  
    25  func (s *usermanagerSuite) SetUpTest(c *gc.C) {
    26  	s.JujuConnSuite.SetUpTest(c)
    27  	s.usermanager = usermanager.NewClient(s.APIState)
    28  	c.Assert(s.usermanager, gc.NotNil)
    29  }
    30  
    31  func (s *usermanagerSuite) TestAddUser(c *gc.C) {
    32  	tag, err := s.usermanager.AddUser("foobar", "Foo Bar", "password")
    33  	c.Assert(err, jc.ErrorIsNil)
    34  
    35  	user, err := s.State.User(tag)
    36  	c.Assert(err, jc.ErrorIsNil)
    37  	c.Assert(user.Name(), gc.Equals, "foobar")
    38  	c.Assert(user.DisplayName(), gc.Equals, "Foo Bar")
    39  	c.Assert(user.PasswordValid("password"), jc.IsTrue)
    40  }
    41  
    42  func (s *usermanagerSuite) TestAddExistingUser(c *gc.C) {
    43  	s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar"})
    44  
    45  	_, err := s.usermanager.AddUser("foobar", "Foo Bar", "password")
    46  	c.Assert(err, gc.ErrorMatches, "failed to create user: user already exists")
    47  }
    48  
    49  func (s *usermanagerSuite) TestAddUserResponseError(c *gc.C) {
    50  	usermanager.PatchResponses(s, s.usermanager,
    51  		func(interface{}) error {
    52  			return errors.New("call error")
    53  		},
    54  	)
    55  	_, err := s.usermanager.AddUser("foobar", "Foo Bar", "password")
    56  	c.Assert(err, gc.ErrorMatches, "call error")
    57  }
    58  
    59  func (s *usermanagerSuite) TestAddUserResultCount(c *gc.C) {
    60  	usermanager.PatchResponses(s, s.usermanager,
    61  		func(result interface{}) error {
    62  			if result, ok := result.(*params.AddUserResults); ok {
    63  				result.Results = make([]params.AddUserResult, 2)
    64  				return nil
    65  			}
    66  			return errors.New("wrong result type")
    67  		},
    68  	)
    69  	_, err := s.usermanager.AddUser("foobar", "Foo Bar", "password")
    70  	c.Assert(err, gc.ErrorMatches, "expected 1 result, got 2")
    71  }
    72  
    73  func (s *usermanagerSuite) TestDisableUser(c *gc.C) {
    74  	user := s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar"})
    75  
    76  	err := s.usermanager.DisableUser(user.Name())
    77  	c.Assert(err, jc.ErrorIsNil)
    78  
    79  	err = user.Refresh()
    80  	c.Assert(err, jc.ErrorIsNil)
    81  	c.Assert(user.IsDisabled(), jc.IsTrue)
    82  }
    83  
    84  func (s *usermanagerSuite) TestDisableUserBadName(c *gc.C) {
    85  	err := s.usermanager.DisableUser("not@home")
    86  	c.Assert(err, gc.ErrorMatches, `"not@home" is not a valid username`)
    87  }
    88  
    89  func (s *usermanagerSuite) TestEnableUser(c *gc.C) {
    90  	user := s.Factory.MakeUser(c, &factory.UserParams{Name: "foobar", Disabled: true})
    91  
    92  	err := s.usermanager.EnableUser(user.Name())
    93  	c.Assert(err, jc.ErrorIsNil)
    94  
    95  	err = user.Refresh()
    96  	c.Assert(err, jc.ErrorIsNil)
    97  	c.Assert(user.IsDisabled(), jc.IsFalse)
    98  }
    99  
   100  func (s *usermanagerSuite) TestEnableUserBadName(c *gc.C) {
   101  	err := s.usermanager.EnableUser("not@home")
   102  	c.Assert(err, gc.ErrorMatches, `"not@home" is not a valid username`)
   103  }
   104  
   105  func (s *usermanagerSuite) TestCantRemoveAdminUser(c *gc.C) {
   106  	err := s.usermanager.DisableUser(s.AdminUserTag(c).Name())
   107  	c.Assert(err, gc.ErrorMatches, "failed to disable user: cannot disable state server environment owner")
   108  }
   109  
   110  func (s *usermanagerSuite) TestUserInfo(c *gc.C) {
   111  	user := s.Factory.MakeUser(c, &factory.UserParams{
   112  		Name: "foobar", DisplayName: "Foo Bar"})
   113  
   114  	obtained, err := s.usermanager.UserInfo([]string{"foobar"}, usermanager.AllUsers)
   115  	c.Assert(err, jc.ErrorIsNil)
   116  	expected := []params.UserInfo{
   117  		{
   118  			Username:    "foobar",
   119  			DisplayName: "Foo Bar",
   120  			CreatedBy:   s.AdminUserTag(c).Name(),
   121  			DateCreated: user.DateCreated(),
   122  		},
   123  	}
   124  
   125  	c.Assert(obtained, jc.DeepEquals, expected)
   126  }
   127  
   128  func (s *usermanagerSuite) TestUserInfoMoreThanOneResult(c *gc.C) {
   129  	usermanager.PatchResponses(s, s.usermanager,
   130  		func(result interface{}) error {
   131  			if result, ok := result.(*params.UserInfoResults); ok {
   132  				result.Results = make([]params.UserInfoResult, 2)
   133  				result.Results[0].Result = &params.UserInfo{Username: "first"}
   134  				result.Results[1].Result = &params.UserInfo{Username: "second"}
   135  				return nil
   136  			}
   137  			return errors.New("wrong result type")
   138  		},
   139  	)
   140  	obtained, err := s.usermanager.UserInfo(nil, usermanager.AllUsers)
   141  	c.Assert(err, jc.ErrorIsNil)
   142  
   143  	expected := []params.UserInfo{
   144  		{Username: "first"},
   145  		{Username: "second"},
   146  	}
   147  
   148  	c.Assert(obtained, jc.DeepEquals, expected)
   149  }
   150  
   151  func (s *usermanagerSuite) TestUserInfoMoreThanOneError(c *gc.C) {
   152  	usermanager.PatchResponses(s, s.usermanager,
   153  		func(result interface{}) error {
   154  			if result, ok := result.(*params.UserInfoResults); ok {
   155  				result.Results = make([]params.UserInfoResult, 2)
   156  				result.Results[0].Error = &params.Error{Message: "first error"}
   157  				result.Results[1].Error = &params.Error{Message: "second error"}
   158  				return nil
   159  			}
   160  			return errors.New("wrong result type")
   161  		},
   162  	)
   163  	_, err := s.usermanager.UserInfo([]string{"foo", "bar"}, usermanager.AllUsers)
   164  	c.Assert(err, gc.ErrorMatches, "foo: first error, bar: second error")
   165  }
   166  
   167  func (s *usermanagerSuite) TestSetUserPassword(c *gc.C) {
   168  	tag := s.AdminUserTag(c)
   169  	err := s.usermanager.SetPassword(tag.Name(), "new-password")
   170  	c.Assert(err, jc.ErrorIsNil)
   171  	user, err := s.State.User(tag)
   172  	c.Assert(err, jc.ErrorIsNil)
   173  	c.Assert(user.PasswordValid("new-password"), jc.IsTrue)
   174  }
   175  
   176  func (s *usermanagerSuite) TestSetUserPasswordBadName(c *gc.C) {
   177  	err := s.usermanager.SetPassword("not@home", "new-password")
   178  	c.Assert(err, gc.ErrorMatches, `"not@home" is not a valid username`)
   179  }