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  }