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: &params.Error{Message: "foo"}},
    43  		{Error: &params.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, &params.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  }