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 }