github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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/cmd/juju/user" 18 "github.com/juju/juju/testing" 19 ) 20 21 // All of the functionality of the AddUser api call is contained elsewhere. 22 // This suite provides basic tests for the "add-user" command 23 type UserAddCommandSuite struct { 24 BaseSuite 25 mockAPI *mockAddUserAPI 26 } 27 28 var _ = gc.Suite(&UserAddCommandSuite{}) 29 30 func (s *UserAddCommandSuite) SetUpTest(c *gc.C) { 31 s.BaseSuite.SetUpTest(c) 32 s.mockAPI = &mockAddUserAPI{} 33 s.mockAPI.secretKey = []byte(strings.Repeat("X", 32)) 34 } 35 36 func (s *UserAddCommandSuite) run(c *gc.C, args ...string) (*cmd.Context, error) { 37 addCommand, _ := user.NewAddCommandForTest(s.mockAPI, s.store, &mockModelAPI{}) 38 return testing.RunCommand(c, addCommand, args...) 39 } 40 41 func (s *UserAddCommandSuite) TestInit(c *gc.C) { 42 for i, test := range []struct { 43 args []string 44 user string 45 displayname string 46 models string 47 acl string 48 outPath string 49 errorString string 50 }{{ 51 errorString: "no username supplied", 52 }, { 53 args: []string{"foobar"}, 54 user: "foobar", 55 }, { 56 args: []string{"foobar", "Foo Bar"}, 57 user: "foobar", 58 displayname: "Foo Bar", 59 }, { 60 args: []string{"foobar", "Foo Bar", "extra"}, 61 errorString: `unrecognized args: \["extra"\]`, 62 }, { 63 args: []string{"foobar"}, 64 user: "foobar", 65 }, { 66 args: []string{"foobar"}, 67 user: "foobar", 68 }} { 69 c.Logf("test %d (%q)", i, test.args) 70 wrappedCommand, command := user.NewAddCommandForTest(s.mockAPI, s.store, &mockModelAPI{}) 71 err := testing.InitCommand(wrappedCommand, test.args) 72 if test.errorString == "" { 73 c.Check(err, jc.ErrorIsNil) 74 c.Check(command.User, gc.Equals, test.user) 75 c.Check(command.DisplayName, gc.Equals, test.displayname) 76 } else { 77 c.Check(err, gc.ErrorMatches, test.errorString) 78 } 79 } 80 } 81 82 func (s *UserAddCommandSuite) TestAddUserWithUsername(c *gc.C) { 83 context, err := s.run(c, "foobar") 84 c.Assert(err, jc.ErrorIsNil) 85 c.Assert(s.mockAPI.username, gc.Equals, "foobar") 86 c.Assert(s.mockAPI.displayname, gc.Equals, "") 87 expected := ` 88 User "foobar" added 89 Please send this command to foobar: 90 juju register MEYTBmZvb2JhcjAREw8xMjcuMC4wLjE6MTIzNDUEIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYEwd0ZXN0aW5n 91 92 "foobar" has not been granted access to any models. You can use "juju grant" to grant access. 93 `[1:] 94 c.Assert(testing.Stdout(context), gc.Equals, expected) 95 c.Assert(testing.Stderr(context), gc.Equals, "") 96 } 97 98 func (s *UserAddCommandSuite) TestAddUserWithUsernameAndDisplayname(c *gc.C) { 99 context, err := s.run(c, "foobar", "Foo Bar") 100 c.Assert(err, jc.ErrorIsNil) 101 c.Assert(s.mockAPI.username, gc.Equals, "foobar") 102 c.Assert(s.mockAPI.displayname, gc.Equals, "Foo Bar") 103 expected := ` 104 User "Foo Bar (foobar)" added 105 Please send this command to foobar: 106 juju register MEYTBmZvb2JhcjAREw8xMjcuMC4wLjE6MTIzNDUEIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYEwd0ZXN0aW5n 107 108 "Foo Bar (foobar)" has not been granted access to any models. You can use "juju grant" to grant access. 109 `[1:] 110 c.Assert(testing.Stdout(context), gc.Equals, expected) 111 c.Assert(testing.Stderr(context), gc.Equals, "") 112 } 113 114 type mockModelAPI struct{} 115 116 func (m *mockModelAPI) ListModels(user string) ([]base.UserModel, error) { 117 return []base.UserModel{{Name: "model", UUID: "modeluuid", Owner: "current-user@local"}}, nil 118 } 119 120 func (m *mockModelAPI) Close() error { 121 return nil 122 } 123 124 func (s *UserAddCommandSuite) TestBlockAddUser(c *gc.C) { 125 // Block operation 126 s.mockAPI.blocked = true 127 _, err := s.run(c, "foobar", "Foo Bar") 128 testing.AssertOperationWasBlocked(c, err, ".*To enable changes.*") 129 } 130 131 func (s *UserAddCommandSuite) TestAddUserErrorResponse(c *gc.C) { 132 s.mockAPI.failMessage = "failed to create user, chaos ensues" 133 _, err := s.run(c, "foobar") 134 c.Assert(err, gc.ErrorMatches, s.mockAPI.failMessage) 135 } 136 137 type mockAddUserAPI struct { 138 failMessage string 139 blocked bool 140 secretKey []byte 141 142 username string 143 displayname string 144 password string 145 } 146 147 func (m *mockAddUserAPI) AddUser(username, displayname, password string) (names.UserTag, []byte, error) { 148 if m.blocked { 149 return names.UserTag{}, nil, common.OperationBlockedError("the operation has been blocked") 150 } 151 m.username = username 152 m.displayname = displayname 153 m.password = password 154 if m.failMessage != "" { 155 return names.UserTag{}, nil, errors.New(m.failMessage) 156 } 157 return names.NewLocalUserTag(username), m.secretKey, nil 158 } 159 160 func (*mockAddUserAPI) Close() error { 161 return nil 162 }