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 }