github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/resource/api/client/client_listresources_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package client_test 5 6 import ( 7 "github.com/juju/errors" 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/apiserver/params" 12 "github.com/juju/juju/resource" 13 "github.com/juju/juju/resource/api" 14 "github.com/juju/juju/resource/api/client" 15 ) 16 17 var _ = gc.Suite(&ListResourcesSuite{}) 18 19 type ListResourcesSuite struct { 20 BaseSuite 21 } 22 23 func (s *ListResourcesSuite) TestOkay(c *gc.C) { 24 expected, apiResult := newResourceResult(c, "a-application", "spam") 25 s.facade.apiResults["a-application"] = apiResult 26 27 cl := client.NewClient(s.facade, s, s.facade) 28 29 services := []string{"a-application"} 30 results, err := cl.ListResources(services) 31 c.Assert(err, jc.ErrorIsNil) 32 33 c.Check(results, jc.DeepEquals, []resource.ServiceResources{ 34 {Resources: expected}, 35 }) 36 c.Check(s.stub.Calls(), gc.HasLen, 1) 37 s.stub.CheckCall(c, 0, "FacadeCall", 38 "ListResources", 39 &api.ListResourcesArgs{[]params.Entity{{ 40 Tag: "application-a-application", 41 }}}, 42 &api.ResourcesResults{ 43 Results: []api.ResourcesResult{ 44 apiResult, 45 }, 46 }, 47 ) 48 } 49 50 func (s *ListResourcesSuite) TestBulk(c *gc.C) { 51 expected1, apiResult1 := newResourceResult(c, "a-application", "spam") 52 s.facade.apiResults["a-application"] = apiResult1 53 expected2, apiResult2 := newResourceResult(c, "other-application", "eggs", "ham") 54 s.facade.apiResults["other-application"] = apiResult2 55 56 cl := client.NewClient(s.facade, s, s.facade) 57 58 services := []string{"a-application", "other-application"} 59 results, err := cl.ListResources(services) 60 c.Assert(err, jc.ErrorIsNil) 61 62 c.Check(results, jc.DeepEquals, []resource.ServiceResources{ 63 {Resources: expected1}, 64 {Resources: expected2}, 65 }) 66 c.Check(s.stub.Calls(), gc.HasLen, 1) 67 s.stub.CheckCall(c, 0, "FacadeCall", 68 "ListResources", 69 &api.ListResourcesArgs{[]params.Entity{ 70 { 71 Tag: "application-a-application", 72 }, { 73 Tag: "application-other-application", 74 }, 75 }}, 76 &api.ResourcesResults{ 77 Results: []api.ResourcesResult{ 78 apiResult1, 79 apiResult2, 80 }, 81 }, 82 ) 83 } 84 85 func (s *ListResourcesSuite) TestNoServices(c *gc.C) { 86 cl := client.NewClient(s.facade, s, s.facade) 87 88 var services []string 89 results, err := cl.ListResources(services) 90 c.Assert(err, jc.ErrorIsNil) 91 92 c.Check(results, gc.HasLen, 0) 93 s.stub.CheckCallNames(c, "FacadeCall") 94 } 95 96 func (s *ListResourcesSuite) TestBadServices(c *gc.C) { 97 cl := client.NewClient(s.facade, s, s.facade) 98 99 services := []string{"???"} 100 _, err := cl.ListResources(services) 101 102 c.Check(err, gc.ErrorMatches, `.*invalid application.*`) 103 s.stub.CheckNoCalls(c) 104 } 105 106 func (s *ListResourcesSuite) TestServiceNotFound(c *gc.C) { 107 cl := client.NewClient(s.facade, s, s.facade) 108 109 services := []string{"a-application"} 110 _, err := cl.ListResources(services) 111 112 c.Check(err, jc.Satisfies, errors.IsNotFound) 113 s.stub.CheckCallNames(c, "FacadeCall") 114 } 115 116 func (s *ListResourcesSuite) TestServiceEmpty(c *gc.C) { 117 s.facade.apiResults["a-application"] = api.ResourcesResult{} 118 119 cl := client.NewClient(s.facade, s, s.facade) 120 121 services := []string{"a-application"} 122 results, err := cl.ListResources(services) 123 c.Assert(err, jc.ErrorIsNil) 124 125 c.Check(results, jc.DeepEquals, []resource.ServiceResources{ 126 {}, 127 }) 128 s.stub.CheckCallNames(c, "FacadeCall") 129 } 130 131 func (s *ListResourcesSuite) TestServerError(c *gc.C) { 132 failure := errors.New("<failure>") 133 s.facade.FacadeCallFn = func(_ string, _, _ interface{}) error { 134 return failure 135 } 136 137 cl := client.NewClient(s.facade, s, s.facade) 138 139 services := []string{"a-application"} 140 _, err := cl.ListResources(services) 141 142 c.Check(err, gc.ErrorMatches, `<failure>`) 143 s.stub.CheckCallNames(c, "FacadeCall") 144 } 145 146 func (s *ListResourcesSuite) TestTooFew(c *gc.C) { 147 s.facade.FacadeCallFn = func(_ string, _, response interface{}) error { 148 typedResponse, ok := response.(*api.ResourcesResults) 149 c.Assert(ok, jc.IsTrue) 150 151 typedResponse.Results = []api.ResourcesResult{{ 152 Resources: nil, 153 }} 154 155 return nil 156 } 157 158 cl := client.NewClient(s.facade, s, s.facade) 159 160 services := []string{"a-application", "other-application"} 161 results, err := cl.ListResources(services) 162 163 c.Check(results, gc.HasLen, 0) 164 c.Check(err, gc.ErrorMatches, `.*got invalid data from server \(expected 2 results, got 1\).*`) 165 s.stub.CheckCallNames(c, "FacadeCall") 166 } 167 168 func (s *ListResourcesSuite) TestTooMany(c *gc.C) { 169 s.facade.FacadeCallFn = func(_ string, _, response interface{}) error { 170 typedResponse, ok := response.(*api.ResourcesResults) 171 c.Assert(ok, jc.IsTrue) 172 173 typedResponse.Results = []api.ResourcesResult{{ 174 Resources: nil, 175 }, { 176 Resources: nil, 177 }, { 178 Resources: nil, 179 }} 180 181 return nil 182 } 183 184 cl := client.NewClient(s.facade, s, s.facade) 185 186 services := []string{"a-application", "other-application"} 187 results, err := cl.ListResources(services) 188 189 c.Check(results, gc.HasLen, 0) 190 c.Check(err, gc.ErrorMatches, `.*got invalid data from server \(expected 2 results, got 3\).*`) 191 s.stub.CheckCallNames(c, "FacadeCall") 192 } 193 194 func (s *ListResourcesSuite) TestConversionFailed(c *gc.C) { 195 s.facade.FacadeCallFn = func(_ string, _, response interface{}) error { 196 typedResponse, ok := response.(*api.ResourcesResults) 197 c.Assert(ok, jc.IsTrue) 198 199 var res api.Resource 200 res.Name = "spam" 201 typedResponse.Results = []api.ResourcesResult{{ 202 Resources: []api.Resource{ 203 res, 204 }, 205 }} 206 207 return nil 208 } 209 210 cl := client.NewClient(s.facade, s, s.facade) 211 212 services := []string{"a-application"} 213 _, err := cl.ListResources(services) 214 215 c.Check(err, gc.ErrorMatches, `.*got bad data.*`) 216 s.stub.CheckCallNames(c, "FacadeCall") 217 }