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