github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/storage/detach_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package storage_test 5 6 import ( 7 "github.com/juju/cmd" 8 "github.com/juju/cmd/cmdtesting" 9 "github.com/juju/testing" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/apiserver/params" 14 "github.com/juju/juju/cmd/juju/storage" 15 "github.com/juju/juju/jujuclient/jujuclienttesting" 16 ) 17 18 type DetachStorageSuite struct { 19 testing.IsolationSuite 20 } 21 22 var _ = gc.Suite(&DetachStorageSuite{}) 23 24 func (s *DetachStorageSuite) TestDetach(c *gc.C) { 25 fake := fakeEntityDetacher{results: []params.ErrorResult{ 26 {}, 27 {}, 28 }} 29 cmd := storage.NewDetachStorageCommandForTest(fake.new, jujuclienttesting.MinimalStore()) 30 ctx, err := cmdtesting.RunCommand(c, cmd, "foo/0", "bar/1") 31 c.Assert(err, jc.ErrorIsNil) 32 fake.CheckCallNames(c, "NewEntityDetacherCloser", "Detach", "Close") 33 fake.CheckCall(c, 1, "Detach", []string{"foo/0", "bar/1"}) 34 c.Assert(cmdtesting.Stderr(ctx), gc.Equals, ` 35 detaching foo/0 36 detaching bar/1 37 `[1:]) 38 } 39 40 func (s *DetachStorageSuite) TestDetachError(c *gc.C) { 41 fake := fakeEntityDetacher{results: []params.ErrorResult{ 42 {Error: ¶ms.Error{Message: "foo"}}, 43 {Error: ¶ms.Error{Message: "bar"}}, 44 }} 45 detachCmd := storage.NewDetachStorageCommandForTest(fake.new, jujuclienttesting.MinimalStore()) 46 ctx, err := cmdtesting.RunCommand(c, detachCmd, "baz/0", "qux/1") 47 stderr := cmdtesting.Stderr(ctx) 48 c.Assert(stderr, gc.Equals, `failed to detach baz/0: foo 49 failed to detach qux/1: bar 50 `) 51 c.Assert(err, gc.Equals, cmd.ErrSilent) 52 } 53 54 func (s *DetachStorageSuite) TestDetachUnauthorizedError(c *gc.C) { 55 var fake fakeEntityDetacher 56 fake.SetErrors(nil, ¶ms.Error{Code: params.CodeUnauthorized, Message: "nope"}) 57 cmd := storage.NewDetachStorageCommandForTest(fake.new, jujuclienttesting.MinimalStore()) 58 ctx, err := cmdtesting.RunCommand(c, cmd, "foo/0") 59 c.Assert(err, gc.ErrorMatches, "nope") 60 c.Assert(cmdtesting.Stderr(ctx), gc.Equals, ` 61 You do not have permission to detach storage. 62 You may ask an administrator to grant you access with "juju grant". 63 64 `) 65 } 66 67 func (s *DetachStorageSuite) TestDetachInitErrors(c *gc.C) { 68 s.testDetachInitError(c, []string{}, "detach-storage requires at least one storage ID") 69 } 70 71 func (s *DetachStorageSuite) testDetachInitError(c *gc.C, args []string, expect string) { 72 cmd := storage.NewDetachStorageCommandForTest(nil, jujuclienttesting.MinimalStore()) 73 _, err := cmdtesting.RunCommand(c, cmd, args...) 74 c.Assert(err, gc.ErrorMatches, expect) 75 } 76 77 type fakeEntityDetacher struct { 78 testing.Stub 79 results []params.ErrorResult 80 } 81 82 func (f *fakeEntityDetacher) new() (storage.EntityDetacherCloser, error) { 83 f.MethodCall(f, "NewEntityDetacherCloser") 84 return f, f.NextErr() 85 } 86 87 func (f *fakeEntityDetacher) Close() error { 88 f.MethodCall(f, "Close") 89 return f.NextErr() 90 } 91 92 func (f *fakeEntityDetacher) Detach(ids []string) ([]params.ErrorResult, error) { 93 f.MethodCall(f, "Detach", ids) 94 return f.results, f.NextErr() 95 }