github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/cmd/juju/user/add_test.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package user_test 5 6 import ( 7 "strings" 8 9 "github.com/juju/cmd" 10 "github.com/juju/errors" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 "gopkg.in/juju/names.v2" 14 15 "github.com/juju/juju/api/base" 16 "github.com/juju/juju/apiserver/common" 17 "github.com/juju/juju/apiserver/params" 18 "github.com/juju/juju/cmd/juju/user" 19 "github.com/juju/juju/testing" 20 ) 21 22 // All of the functionality of the AddUser api call is contained elsewhere. 23 // This suite provides basic tests for the "add-user" command 24 type UserAddCommandSuite struct { 25 BaseSuite 26 mockAPI *mockAddUserAPI 27 } 28 29 var _ = gc.Suite(&UserAddCommandSuite{}) 30 31 func (s *UserAddCommandSuite) SetUpTest(c *gc.C) { 32 s.BaseSuite.SetUpTest(c) 33 s.mockAPI = &mockAddUserAPI{} 34 s.mockAPI.secretKey = []byte(strings.Repeat("X", 32)) 35 } 36 37 func (s *UserAddCommandSuite) run(c *gc.C, args ...string) (*cmd.Context, error) { 38 addCommand, _ := user.NewAddCommandForTest(s.mockAPI, s.store, &mockModelAPI{}) 39 return testing.RunCommand(c, addCommand, args...) 40 } 41 42 func (s *UserAddCommandSuite) TestInit(c *gc.C) { 43 for i, test := range []struct { 44 args []string 45 user string 46 displayname string 47 models string 48 acl string 49 outPath string 50 errorString string 51 }{{ 52 errorString: "no username supplied", 53 }, { 54 args: []string{"foobar"}, 55 user: "foobar", 56 }, { 57 args: []string{"foobar", "Foo Bar"}, 58 user: "foobar", 59 displayname: "Foo Bar", 60 }, { 61 args: []string{"foobar", "Foo Bar", "extra"}, 62 errorString: `unrecognized args: \["extra"\]`, 63 }, { 64 args: []string{"foobar"}, 65 user: "foobar", 66 }, { 67 args: []string{"foobar"}, 68 user: "foobar", 69 }} { 70 c.Logf("test %d (%q)", i, test.args) 71 wrappedCommand, command := user.NewAddCommandForTest(s.mockAPI, s.store, &mockModelAPI{}) 72 err := testing.InitCommand(wrappedCommand, test.args) 73 if test.errorString == "" { 74 c.Check(err, jc.ErrorIsNil) 75 c.Check(command.User, gc.Equals, test.user) 76 c.Check(command.DisplayName, gc.Equals, test.displayname) 77 } else { 78 c.Check(err, gc.ErrorMatches, test.errorString) 79 } 80 } 81 } 82 83 func (s *UserAddCommandSuite) TestAddUserWithUsername(c *gc.C) { 84 context, err := s.run(c, "foobar") 85 c.Assert(err, jc.ErrorIsNil) 86 c.Assert(s.mockAPI.username, gc.Equals, "foobar") 87 c.Assert(s.mockAPI.displayname, gc.Equals, "") 88 expected := ` 89 User "foobar" added 90 Please send this command to foobar: 91 juju register MEYTBmZvb2JhcjAREw8xMjcuMC4wLjE6MTIzNDUEIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYEwd0ZXN0aW5n 92 93 "foobar" has not been granted access to any models. You can use "juju grant" to grant access. 94 `[1:] 95 c.Assert(testing.Stdout(context), gc.Equals, expected) 96 c.Assert(testing.Stderr(context), gc.Equals, "") 97 } 98 99 func (s *UserAddCommandSuite) TestAddUserWithUsernameAndDisplayname(c *gc.C) { 100 context, err := s.run(c, "foobar", "Foo Bar") 101 c.Assert(err, jc.ErrorIsNil) 102 c.Assert(s.mockAPI.username, gc.Equals, "foobar") 103 c.Assert(s.mockAPI.displayname, gc.Equals, "Foo Bar") 104 expected := ` 105 User "Foo Bar (foobar)" added 106 Please send this command to foobar: 107 juju register MEYTBmZvb2JhcjAREw8xMjcuMC4wLjE6MTIzNDUEIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYEwd0ZXN0aW5n 108 109 "Foo Bar (foobar)" has not been granted access to any models. You can use "juju grant" to grant access. 110 `[1:] 111 c.Assert(testing.Stdout(context), gc.Equals, expected) 112 c.Assert(testing.Stderr(context), gc.Equals, "") 113 } 114 115 type mockModelAPI struct{} 116 117 func (m *mockModelAPI) ListModels(user string) ([]base.UserModel, error) { 118 return []base.UserModel{{Name: "model", UUID: "modeluuid", Owner: "current-user"}}, nil 119 } 120 121 func (m *mockModelAPI) Close() error { 122 return nil 123 } 124 125 func (s *UserAddCommandSuite) TestBlockAddUser(c *gc.C) { 126 // Block operation 127 s.mockAPI.blocked = true 128 _, err := s.run(c, "foobar", "Foo Bar") 129 testing.AssertOperationWasBlocked(c, err, ".*To enable changes.*") 130 } 131 132 func (s *UserAddCommandSuite) TestAddUserErrorResponse(c *gc.C) { 133 s.mockAPI.failMessage = "failed to create user, chaos ensues" 134 _, err := s.run(c, "foobar") 135 c.Assert(err, gc.ErrorMatches, s.mockAPI.failMessage) 136 } 137 138 func (s *UserAddCommandSuite) TestAddUserUnauthorizedMentionsJujuGrant(c *gc.C) { 139 s.mockAPI.addError = ¶ms.Error{ 140 Message: "permission denied", 141 Code: params.CodeUnauthorized, 142 } 143 ctx, _ := s.run(c, "foobar") 144 errString := strings.Replace(testing.Stderr(ctx), "\n", " ", -1) 145 c.Assert(errString, gc.Matches, `.*juju grant.*`) 146 } 147 148 type mockAddUserAPI struct { 149 addError error 150 failMessage string 151 blocked bool 152 secretKey []byte 153 154 username string 155 displayname string 156 password string 157 } 158 159 func (m *mockAddUserAPI) AddUser(username, displayname, password string) (names.UserTag, []byte, error) { 160 if m.blocked { 161 return names.UserTag{}, nil, common.OperationBlockedError("the operation has been blocked") 162 } 163 if m.addError != nil { 164 return names.UserTag{}, nil, m.addError 165 } 166 m.username = username 167 m.displayname = displayname 168 m.password = password 169 if m.failMessage != "" { 170 return names.UserTag{}, nil, errors.New(m.failMessage) 171 } 172 return names.NewLocalUserTag(username), m.secretKey, nil 173 } 174 175 func (*mockAddUserAPI) Close() error { 176 return nil 177 }