github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/featuretests/cmd_juju_user_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package featuretests
     5  
     6  import (
     7  	"fmt"
     8  	"strings"
     9  
    10  	"github.com/juju/cmd"
    11  	"github.com/juju/names"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/juju/cmd/juju/commands"
    16  	jujutesting "github.com/juju/juju/juju/testing"
    17  	"github.com/juju/juju/testing"
    18  	"github.com/juju/juju/testing/factory"
    19  )
    20  
    21  // UserSuite tests the connectivity of all the user subcommands. These tests
    22  // go from the command line, api client, api server, db. The db changes are
    23  // then checked.  Only one test for each command is done here to check
    24  // connectivity.  Exhaustive tests are at each layer.
    25  type UserSuite struct {
    26  	jujutesting.JujuConnSuite
    27  }
    28  
    29  var _ = gc.Suite(&UserSuite{})
    30  
    31  func (s *UserSuite) RunUserCommand(c *gc.C, stdin string, args ...string) (*cmd.Context, error) {
    32  	context := testing.Context(c)
    33  	if stdin != "" {
    34  		context.Stdin = strings.NewReader(stdin)
    35  	}
    36  	jujuCmd := commands.NewJujuCommand(context)
    37  	err := testing.InitCommand(jujuCmd, args)
    38  	c.Assert(err, jc.ErrorIsNil)
    39  	err = jujuCmd.Run(context)
    40  	return context, err
    41  }
    42  
    43  func (s *UserSuite) TestUserAdd(c *gc.C) {
    44  	ctx, err := s.RunUserCommand(c, "", "add-user", "test")
    45  	c.Assert(err, jc.ErrorIsNil)
    46  	c.Assert(testing.Stdout(ctx), jc.HasPrefix, `User "test" added`)
    47  	user, err := s.State.User(names.NewLocalUserTag("test"))
    48  	c.Assert(err, jc.ErrorIsNil)
    49  	c.Assert(user.IsDisabled(), jc.IsFalse)
    50  }
    51  
    52  func (s *UserSuite) TestUserAddGrantModel(c *gc.C) {
    53  	sharedModelState := s.Factory.MakeModel(c, &factory.ModelParams{
    54  		Name: "amodel",
    55  	})
    56  	defer sharedModelState.Close()
    57  
    58  	ctx, err := s.RunUserCommand(c, "", "add-user", "test", "--models", "amodel")
    59  	c.Assert(err, jc.ErrorIsNil)
    60  	c.Assert(testing.Stdout(ctx), jc.HasPrefix, `User "test" added`)
    61  	user, err := s.State.User(names.NewLocalUserTag("test"))
    62  	c.Assert(err, jc.ErrorIsNil)
    63  	c.Assert(user.IsDisabled(), jc.IsFalse)
    64  
    65  	// Check model is shared with expected users.
    66  	sharedModel, err := sharedModelState.Model()
    67  	c.Assert(err, jc.ErrorIsNil)
    68  	users, err := sharedModel.Users()
    69  	c.Assert(err, jc.ErrorIsNil)
    70  	var modelUserTags = make([]names.UserTag, len(users))
    71  	for i, u := range users {
    72  		modelUserTags[i] = u.UserTag()
    73  	}
    74  	c.Assert(modelUserTags, jc.SameContents, []names.UserTag{
    75  		user.Tag().(names.UserTag),
    76  		names.NewLocalUserTag("admin"),
    77  	})
    78  }
    79  
    80  func (s *UserSuite) TestUserChangePassword(c *gc.C) {
    81  	user, err := s.State.User(s.AdminUserTag(c))
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	c.Assert(user.PasswordValid("dummy-secret"), jc.IsTrue)
    84  	_, err = s.RunUserCommand(c, "not-dummy-secret\nnot-dummy-secret\n", "change-user-password")
    85  	c.Assert(err, jc.ErrorIsNil)
    86  	user.Refresh()
    87  	c.Assert(err, jc.ErrorIsNil)
    88  	c.Assert(user.PasswordValid("dummy-secret"), jc.IsFalse)
    89  	c.Assert(user.PasswordValid("not-dummy-secret"), jc.IsTrue)
    90  }
    91  
    92  func (s *UserSuite) TestUserInfo(c *gc.C) {
    93  	user, err := s.State.User(s.AdminUserTag(c))
    94  	c.Assert(err, jc.ErrorIsNil)
    95  	c.Assert(user.PasswordValid("dummy-secret"), jc.IsTrue)
    96  	ctx, err := s.RunUserCommand(c, "", "show-user")
    97  	c.Assert(err, jc.ErrorIsNil)
    98  	c.Assert(testing.Stdout(ctx), jc.Contains, "user-name: admin")
    99  }
   100  
   101  func (s *UserSuite) TestUserDisable(c *gc.C) {
   102  	user := s.Factory.MakeUser(c, &factory.UserParams{Name: "barbara"})
   103  	_, err := s.RunUserCommand(c, "", "disable-user", "barbara")
   104  	c.Assert(err, jc.ErrorIsNil)
   105  	user.Refresh()
   106  	c.Assert(err, jc.ErrorIsNil)
   107  	c.Assert(user.IsDisabled(), jc.IsTrue)
   108  }
   109  
   110  func (s *UserSuite) TestUserEnable(c *gc.C) {
   111  	user := s.Factory.MakeUser(c, &factory.UserParams{Name: "barbara", Disabled: true})
   112  	_, err := s.RunUserCommand(c, "", "enable-user", "barbara")
   113  	c.Assert(err, jc.ErrorIsNil)
   114  	user.Refresh()
   115  	c.Assert(err, jc.ErrorIsNil)
   116  	c.Assert(user.IsDisabled(), jc.IsFalse)
   117  }
   118  
   119  func (s *UserSuite) TestUserList(c *gc.C) {
   120  	ctx, err := s.RunUserCommand(c, "", "list-users")
   121  	c.Assert(err, jc.ErrorIsNil)
   122  	periodPattern := `(just now|\d+ \S+ ago)`
   123  	expected := fmt.Sprintf(`
   124  NAME\s+DISPLAY NAME\s+DATE CREATED\s+LAST CONNECTION
   125  admin\s+admin\s+%s\s+%s
   126  
   127  `[1:], periodPattern, periodPattern)
   128  	c.Assert(testing.Stdout(ctx), gc.Matches, expected)
   129  }