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 = &params.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  }