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 }