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

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package setwallet_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/setwallet"
    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(&setWalletSuite{})
    22  
    23  type setWalletSuite struct {
    24  	coretesting.FakeJujuXDGDataHomeSuite
    25  	stub    *testing.Stub
    26  	mockAPI *mockapi
    27  }
    28  
    29  func (s *setWalletSuite) SetUpTest(c *gc.C) {
    30  	s.FakeJujuXDGDataHomeSuite.SetUpTest(c)
    31  	s.stub = &testing.Stub{}
    32  	s.mockAPI = newMockAPI(s.stub)
    33  	s.PatchValue(setwallet.NewAPIClient, setwallet.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 *setWalletSuite) TestSetWallet(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, "SetWallet", "name", "5")
    45  }
    46  
    47  func (s *setWalletSuite) TestSetWalletAPIError(c *gc.C) {
    48  	s.stub.SetErrors(errors.New("something failed"))
    49  
    50  	_, err := s.runCommand(c, "name", "5")
    51  	c.Assert(err, gc.ErrorMatches, "failed to set the wallet: something failed")
    52  	s.mockAPI.CheckCall(c, 0, "SetWallet", "name", "5")
    53  }
    54  
    55  func (s *setWalletSuite) runCommand(c *gc.C, args ...string) (*cmd.Context, error) {
    56  	cmd := setwallet.NewSetWalletCommand()
    57  	cmd.SetClientStore(newMockStore())
    58  	return cmdtesting.RunCommand(c, cmd, args...)
    59  }
    60  
    61  func newMockStore() *jujuclient.MemStore {
    62  	store := jujuclient.NewMemStore()
    63  	store.CurrentControllerName = "foo"
    64  	store.Controllers["foo"] = jujuclient.ControllerDetails{
    65  		APIEndpoints: []string{"0.1.2.3:1234"},
    66  	}
    67  	return store
    68  }
    69  
    70  func (s *setWalletSuite) TestSetWalletErrors(c *gc.C) {
    71  	tests := []struct {
    72  		about         string
    73  		args          []string
    74  		expectedError string
    75  	}{
    76  		{
    77  			about:         "value needs to be a number",
    78  			args:          []string{"name", "badvalue"},
    79  			expectedError: "wallet value needs to be a whole number",
    80  		},
    81  		{
    82  			about:         "value is missing",
    83  			args:          []string{"name"},
    84  			expectedError: "name and value required",
    85  		},
    86  		{
    87  			about:         "no args",
    88  			args:          []string{},
    89  			expectedError: "name and value required",
    90  		},
    91  	}
    92  	for i, test := range tests {
    93  		c.Logf("test %d: %s", i, test.about)
    94  		s.stub.SetErrors(errors.New(test.expectedError))
    95  		defer s.mockAPI.ResetCalls()
    96  		_, err := s.runCommand(c, test.args...)
    97  		c.Assert(err, gc.ErrorMatches, test.expectedError)
    98  		s.mockAPI.CheckNoCalls(c)
    99  	}
   100  }
   101  
   102  func newMockAPI(s *testing.Stub) *mockapi {
   103  	return &mockapi{Stub: s}
   104  }
   105  
   106  type mockapi struct {
   107  	*testing.Stub
   108  	resp string
   109  }
   110  
   111  func (api *mockapi) SetWallet(name, value string) (string, error) {
   112  	api.MethodCall(api, "SetWallet", name, value)
   113  	return api.resp, api.NextErr()
   114  }