github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/romulus/createwallet/createwallet_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package createwallet_test
     5  
     6  import (
     7  	"github.com/juju/cmd"
     8  	"github.com/juju/cmd/cmdtesting"
     9  	"github.com/juju/errors"
    10  	"github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  
    14  	rcmd "github.com/juju/juju/cmd/juju/romulus"
    15  	"github.com/juju/juju/cmd/juju/romulus/createwallet"
    16  	"github.com/juju/juju/cmd/modelcmd"
    17  	"github.com/juju/juju/jujuclient"
    18  	coretesting "github.com/juju/juju/testing"
    19  )
    20  
    21  var _ = gc.Suite(&createWalletSuite{})
    22  
    23  type createWalletSuite struct {
    24  	coretesting.FakeJujuXDGDataHomeSuite
    25  	stub    *testing.Stub
    26  	mockAPI *mockapi
    27  }
    28  
    29  func (s *createWalletSuite) SetUpTest(c *gc.C) {
    30  	s.FakeJujuXDGDataHomeSuite.SetUpTest(c)
    31  	s.stub = &testing.Stub{}
    32  	s.mockAPI = newMockAPI(s.stub)
    33  	s.PatchValue(createwallet.NewAPIClient, createwallet.APIClientFnc(s.mockAPI))
    34  	s.PatchValue(&rcmd.GetMeteringURLForControllerCmd, func(c *modelcmd.ControllerCommandBase) (string, error) {
    35  		return "http://example.com", nil
    36  	})
    37  }
    38  
    39  func (s *createWalletSuite) TestCreateWallet(c *gc.C) {
    40  	s.mockAPI.resp = "name wallet set to 5"
    41  	ctx, err := s.runCommand(c, "name", "5")
    42  	c.Assert(err, jc.ErrorIsNil)
    43  	c.Assert(cmdtesting.Stdout(ctx), jc.DeepEquals, "name wallet set to 5\n")
    44  	s.mockAPI.CheckCall(c, 0, "CreateWallet", "name", "5")
    45  }
    46  
    47  func (s *createWalletSuite) TestCreateWalletAPIError(c *gc.C) {
    48  	s.mockAPI.SetErrors(errors.New("something failed"))
    49  	_, err := s.runCommand(c, "name", "5")
    50  	c.Assert(err, gc.ErrorMatches, "failed to create the wallet: something failed")
    51  	s.mockAPI.CheckCall(c, 0, "CreateWallet", "name", "5")
    52  }
    53  
    54  func (s *createWalletSuite) TestCreateWalletErrors(c *gc.C) {
    55  	tests := []struct {
    56  		about         string
    57  		args          []string
    58  		expectedError string
    59  	}{
    60  		{
    61  			about:         "test value needs to be a number",
    62  			args:          []string{"name", "badvalue"},
    63  			expectedError: "wallet value needs to be a whole number",
    64  		},
    65  		{
    66  			about:         "value is missing",
    67  			args:          []string{"name"},
    68  			expectedError: "name and value required",
    69  		},
    70  		{
    71  			about:         "no args",
    72  			args:          []string{},
    73  			expectedError: "name and value required",
    74  		},
    75  	}
    76  	for i, test := range tests {
    77  		c.Logf("test %d: %s", i, test.about)
    78  		if test.expectedError != "" {
    79  			s.mockAPI.SetErrors(errors.New(test.expectedError))
    80  		}
    81  		_, err := s.runCommand(c, test.args...)
    82  		c.Assert(err, gc.ErrorMatches, test.expectedError)
    83  		s.mockAPI.CheckNoCalls(c)
    84  	}
    85  }
    86  
    87  func (s *createWalletSuite) runCommand(c *gc.C, args ...string) (*cmd.Context, error) {
    88  	cmd := createwallet.NewCreateWalletCommand()
    89  	cmd.SetClientStore(newMockStore())
    90  	return cmdtesting.RunCommand(c, cmd, args...)
    91  }
    92  
    93  func newMockAPI(s *testing.Stub) *mockapi {
    94  	return &mockapi{Stub: s}
    95  }
    96  
    97  type mockapi struct {
    98  	*testing.Stub
    99  	resp string
   100  }
   101  
   102  func (api *mockapi) CreateWallet(name, value string) (string, error) {
   103  	api.MethodCall(api, "CreateWallet", name, value)
   104  	return api.resp, api.NextErr()
   105  }
   106  
   107  func newMockStore() *jujuclient.MemStore {
   108  	store := jujuclient.NewMemStore()
   109  	store.CurrentControllerName = "foo"
   110  	store.Controllers["foo"] = jujuclient.ControllerDetails{
   111  		APIEndpoints: []string{"0.1.2.3:1234"},
   112  	}
   113  	return store
   114  }