github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/cmd/juju/model/show_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for info.
     3  
     4  package model_test
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/cmd"
    10  	"github.com/juju/errors"
    11  	gitjujutesting "github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  	"gopkg.in/juju/names.v2"
    15  
    16  	"github.com/juju/juju/apiserver/params"
    17  	"github.com/juju/juju/cmd/juju/model"
    18  	"github.com/juju/juju/jujuclient"
    19  	"github.com/juju/juju/jujuclient/jujuclienttesting"
    20  	"github.com/juju/juju/status"
    21  	"github.com/juju/juju/testing"
    22  )
    23  
    24  type ShowCommandSuite struct {
    25  	testing.FakeJujuXDGDataHomeSuite
    26  	fake           fakeModelShowClient
    27  	store          *jujuclienttesting.MemStore
    28  	expectedOutput attrs
    29  }
    30  
    31  var _ = gc.Suite(&ShowCommandSuite{})
    32  
    33  type fakeModelShowClient struct {
    34  	gitjujutesting.Stub
    35  	info params.ModelInfo
    36  	err  *params.Error
    37  }
    38  
    39  func (f *fakeModelShowClient) Close() error {
    40  	f.MethodCall(f, "Close")
    41  	return f.NextErr()
    42  }
    43  
    44  func (f *fakeModelShowClient) ModelInfo(tags []names.ModelTag) ([]params.ModelInfoResult, error) {
    45  	f.MethodCall(f, "ModelInfo", tags)
    46  	if len(tags) != 1 {
    47  		return nil, errors.Errorf("expected 1 tag, got %d", len(tags))
    48  	}
    49  	if tags[0] != testing.ModelTag {
    50  		return nil, errors.Errorf("expected %s, got %s", testing.ModelTag.Id(), tags[0].Id())
    51  	}
    52  	return []params.ModelInfoResult{{Result: &f.info, Error: f.err}}, f.NextErr()
    53  }
    54  
    55  type attrs map[string]interface{}
    56  
    57  func (s *ShowCommandSuite) SetUpTest(c *gc.C) {
    58  	s.FakeJujuXDGDataHomeSuite.SetUpTest(c)
    59  	lastConnection := time.Date(2015, 3, 20, 0, 0, 0, 0, time.UTC)
    60  	statusSince := time.Date(2016, 4, 5, 0, 0, 0, 0, time.UTC)
    61  
    62  	users := []params.ModelUserInfo{{
    63  		UserName:       "admin",
    64  		LastConnection: &lastConnection,
    65  		Access:         "write",
    66  	}, {
    67  		UserName:    "bob",
    68  		DisplayName: "Bob",
    69  		Access:      "read",
    70  	}}
    71  
    72  	s.fake.ResetCalls()
    73  	s.fake.err = nil
    74  	s.fake.info = params.ModelInfo{
    75  		Name:           "mymodel",
    76  		UUID:           testing.ModelTag.Id(),
    77  		ControllerUUID: "1ca2293b-fdb9-4299-97d6-55583bb39364",
    78  		OwnerTag:       "user-admin",
    79  		CloudTag:       "cloud-some-cloud",
    80  		CloudRegion:    "some-region",
    81  		ProviderType:   "openstack",
    82  		Life:           params.Alive,
    83  		Status: params.EntityStatus{
    84  			Status: status.Active,
    85  			Since:  &statusSince,
    86  		},
    87  		Users: users,
    88  	}
    89  
    90  	s.expectedOutput = attrs{
    91  		"mymodel": attrs{
    92  			"name":            "mymodel",
    93  			"model-uuid":      "deadbeef-0bad-400d-8000-4b1d0d06f00d",
    94  			"controller-uuid": "1ca2293b-fdb9-4299-97d6-55583bb39364",
    95  			"controller-name": "testing",
    96  			"owner":           "admin",
    97  			"cloud":           "some-cloud",
    98  			"region":          "some-region",
    99  			"type":            "openstack",
   100  			"life":            "alive",
   101  			"status": attrs{
   102  				"current": "active",
   103  				"since":   "2016-04-05",
   104  			},
   105  			"users": attrs{
   106  				"admin": attrs{
   107  					"access":          "write",
   108  					"last-connection": "2015-03-20",
   109  				},
   110  				"bob": attrs{
   111  					"display-name":    "Bob",
   112  					"access":          "read",
   113  					"last-connection": "never connected",
   114  				},
   115  			},
   116  		},
   117  	}
   118  
   119  	s.store = jujuclienttesting.NewMemStore()
   120  	s.store.CurrentControllerName = "testing"
   121  	s.store.Controllers["testing"] = jujuclient.ControllerDetails{}
   122  	s.store.Accounts["testing"] = jujuclient.AccountDetails{
   123  		User: "admin",
   124  	}
   125  	err := s.store.UpdateModel("testing", "admin/mymodel", jujuclient.ModelDetails{
   126  		testing.ModelTag.Id(),
   127  	})
   128  	c.Assert(err, jc.ErrorIsNil)
   129  	s.store.Models["testing"].CurrentModel = "admin/mymodel"
   130  }
   131  
   132  func (s *ShowCommandSuite) newShowCommand() cmd.Command {
   133  	return model.NewShowCommandForTest(&s.fake, noOpRefresh, s.store)
   134  }
   135  
   136  func (s *ShowCommandSuite) TestShow(c *gc.C) {
   137  	_, err := testing.RunCommand(c, s.newShowCommand())
   138  	c.Assert(err, jc.ErrorIsNil)
   139  	s.fake.CheckCalls(c, []gitjujutesting.StubCall{
   140  		{"ModelInfo", []interface{}{[]names.ModelTag{testing.ModelTag}}},
   141  		{"Close", nil},
   142  	})
   143  }
   144  
   145  func (s *ShowCommandSuite) TestShowUnknownCallsRefresh(c *gc.C) {
   146  	called := false
   147  	refresh := func(jujuclient.ClientStore, string) error {
   148  		called = true
   149  		return nil
   150  	}
   151  	_, err := testing.RunCommand(c, model.NewShowCommandForTest(&s.fake, refresh, s.store), "unknown")
   152  	c.Check(called, jc.IsTrue)
   153  	c.Check(err, jc.Satisfies, errors.IsNotFound)
   154  }
   155  
   156  func (s *ShowCommandSuite) TestShowFormatYaml(c *gc.C) {
   157  	ctx, err := testing.RunCommand(c, s.newShowCommand(), "--format", "yaml")
   158  	c.Assert(err, jc.ErrorIsNil)
   159  	c.Assert(testing.Stdout(ctx), jc.YAMLEquals, s.expectedOutput)
   160  }
   161  
   162  func (s *ShowCommandSuite) TestShowFormatJson(c *gc.C) {
   163  	ctx, err := testing.RunCommand(c, s.newShowCommand(), "--format", "json")
   164  	c.Assert(err, jc.ErrorIsNil)
   165  	c.Assert(testing.Stdout(ctx), jc.JSONEquals, s.expectedOutput)
   166  }
   167  
   168  func (s *ShowCommandSuite) TestUnrecognizedArg(c *gc.C) {
   169  	_, err := testing.RunCommand(c, s.newShowCommand(), "admin", "whoops")
   170  	c.Assert(err, gc.ErrorMatches, `unrecognized args: \["whoops"\]`)
   171  }
   172  
   173  func noOpRefresh(jujuclient.ClientStore, string) error {
   174  	return nil
   175  }