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 }