github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/client/payloads/facade_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package payloads_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/testing" 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 "gopkg.in/juju/charm.v6" 12 "gopkg.in/juju/names.v2" 13 14 "github.com/juju/juju/apiserver/facades/client/payloads" 15 "github.com/juju/juju/apiserver/params" 16 "github.com/juju/juju/payload" 17 "github.com/juju/juju/payload/api" 18 ) 19 20 var _ = gc.Suite(&Suite{}) 21 22 type Suite struct { 23 testing.IsolationSuite 24 25 stub *testing.Stub 26 state *stubState 27 } 28 29 func (s *Suite) SetUpTest(c *gc.C) { 30 s.IsolationSuite.SetUpTest(c) 31 32 s.stub = &testing.Stub{} 33 s.state = &stubState{stub: s.stub} 34 } 35 36 func (Suite) newPayload(name string) (payload.FullPayloadInfo, params.Payload) { 37 ptype := "docker" 38 id := "id" + name 39 tags := []string{"a-tag"} 40 unit := "a-application/0" 41 machine := "1" 42 43 pl := payload.FullPayloadInfo{ 44 Payload: payload.Payload{ 45 PayloadClass: charm.PayloadClass{ 46 Name: name, 47 Type: ptype, 48 }, 49 ID: id, 50 Status: payload.StateRunning, 51 Labels: tags, 52 Unit: unit, 53 }, 54 Machine: machine, 55 } 56 apiPayload := params.Payload{ 57 Class: name, 58 Type: ptype, 59 ID: id, 60 Status: payload.StateRunning, 61 Labels: tags, 62 Unit: names.NewUnitTag(unit).String(), 63 Machine: names.NewMachineTag(machine).String(), 64 } 65 return pl, apiPayload 66 } 67 68 func (s *Suite) TestListNoPatterns(c *gc.C) { 69 payloadA, apiPayloadA := s.newPayload("spam") 70 payloadB, apiPayloadB := s.newPayload("eggs") 71 s.state.payloads = append(s.state.payloads, payloadA, payloadB) 72 73 facade := payloads.NewAPI(s.state) 74 args := params.PayloadListArgs{ 75 Patterns: []string{}, 76 } 77 results, err := facade.List(args) 78 c.Assert(err, jc.ErrorIsNil) 79 80 c.Check(results, jc.DeepEquals, params.PayloadListResults{ 81 Results: []params.Payload{ 82 apiPayloadA, 83 apiPayloadB, 84 }, 85 }) 86 } 87 88 func (s *Suite) TestListAllMatch(c *gc.C) { 89 payloadA, apiPayloadA := s.newPayload("spam") 90 payloadB, apiPayloadB := s.newPayload("eggs") 91 s.state.payloads = append(s.state.payloads, payloadA, payloadB) 92 93 facade := payloads.NewAPI(s.state) 94 args := params.PayloadListArgs{ 95 Patterns: []string{ 96 "a-application/0", 97 }, 98 } 99 results, err := facade.List(args) 100 c.Assert(err, jc.ErrorIsNil) 101 102 c.Check(results, jc.DeepEquals, params.PayloadListResults{ 103 Results: []params.Payload{ 104 apiPayloadA, 105 apiPayloadB, 106 }, 107 }) 108 } 109 110 func (s *Suite) TestListNoMatch(c *gc.C) { 111 payloadA, _ := s.newPayload("spam") 112 payloadB, _ := s.newPayload("eggs") 113 s.state.payloads = append(s.state.payloads, payloadA, payloadB) 114 115 facade := payloads.NewAPI(s.state) 116 args := params.PayloadListArgs{ 117 Patterns: []string{ 118 "a-application/1", 119 }, 120 } 121 results, err := facade.List(args) 122 c.Assert(err, jc.ErrorIsNil) 123 124 c.Check(results.Results, gc.HasLen, 0) 125 } 126 127 func (s *Suite) TestListNoPayloads(c *gc.C) { 128 facade := payloads.NewAPI(s.state) 129 args := params.PayloadListArgs{ 130 Patterns: []string{}, 131 } 132 results, err := facade.List(args) 133 c.Assert(err, jc.ErrorIsNil) 134 135 c.Check(results.Results, gc.HasLen, 0) 136 } 137 138 func (s *Suite) TestListMultiMatch(c *gc.C) { 139 payloadA, apiPayloadA := s.newPayload("spam") 140 payloadB, apiPayloadB := s.newPayload("eggs") 141 s.state.payloads = append(s.state.payloads, payloadA, payloadB) 142 143 facade := payloads.NewAPI(s.state) 144 args := params.PayloadListArgs{ 145 Patterns: []string{ 146 "spam", 147 "eggs", 148 }, 149 } 150 results, err := facade.List(args) 151 c.Assert(err, jc.ErrorIsNil) 152 153 c.Check(results, jc.DeepEquals, params.PayloadListResults{ 154 Results: []params.Payload{ 155 apiPayloadA, 156 apiPayloadB, 157 }, 158 }) 159 } 160 161 func (s *Suite) TestListPartialMatch(c *gc.C) { 162 payloadA, apiPayloadA := s.newPayload("spam") 163 payloadB, _ := s.newPayload("eggs") 164 s.state.payloads = append(s.state.payloads, payloadA, payloadB) 165 166 facade := payloads.NewAPI(s.state) 167 args := params.PayloadListArgs{ 168 Patterns: []string{ 169 "spam", 170 }, 171 } 172 results, err := facade.List(args) 173 c.Assert(err, jc.ErrorIsNil) 174 175 c.Check(results, jc.DeepEquals, params.PayloadListResults{ 176 Results: []params.Payload{ 177 apiPayloadA, 178 }, 179 }) 180 } 181 182 func (s *Suite) TestListPartialMultiMatch(c *gc.C) { 183 payloadA, apiPayloadA := s.newPayload("spam") 184 payloadB, _ := s.newPayload("eggs") 185 payloadC, apiPayloadC := s.newPayload("ham") 186 s.state.payloads = append(s.state.payloads, payloadA, payloadB, payloadC) 187 188 facade := payloads.NewAPI(s.state) 189 args := params.PayloadListArgs{ 190 Patterns: []string{ 191 "spam", 192 "ham", 193 }, 194 } 195 results, err := facade.List(args) 196 c.Assert(err, jc.ErrorIsNil) 197 198 c.Check(results, jc.DeepEquals, params.PayloadListResults{ 199 Results: []params.Payload{ 200 apiPayloadA, 201 apiPayloadC, 202 }, 203 }) 204 } 205 206 func (s *Suite) TestListAllFilters(c *gc.C) { 207 pl := payload.FullPayloadInfo{ 208 Payload: payload.Payload{ 209 PayloadClass: charm.PayloadClass{ 210 Name: "spam", 211 Type: "docker", 212 }, 213 ID: "idspam", 214 Status: payload.StateRunning, 215 Labels: []string{"a-tag"}, 216 Unit: "a-application/0", 217 }, 218 Machine: "1", 219 } 220 apiPayload := api.Payload2api(pl) 221 s.state.payloads = append(s.state.payloads, pl) 222 223 facade := payloads.NewAPI(s.state) 224 patterns := []string{ 225 "spam", // name 226 "docker", // type 227 "idspam", // ID 228 payload.StateRunning, // status 229 "a-application/0", // unit 230 "1", // machine 231 "a-tag", // tags 232 } 233 for _, pattern := range patterns { 234 c.Logf("trying pattern %q", pattern) 235 236 args := params.PayloadListArgs{ 237 Patterns: []string{ 238 pattern, 239 }, 240 } 241 results, err := facade.List(args) 242 c.Assert(err, jc.ErrorIsNil) 243 244 c.Check(results, jc.DeepEquals, params.PayloadListResults{ 245 Results: []params.Payload{ 246 apiPayload, 247 }, 248 }) 249 } 250 } 251 252 type stubState struct { 253 stub *testing.Stub 254 255 payloads []payload.FullPayloadInfo 256 } 257 258 func (s *stubState) ListAll() ([]payload.FullPayloadInfo, error) { 259 s.stub.AddCall("ListAll") 260 if err := s.stub.NextErr(); err != nil { 261 return nil, errors.Trace(err) 262 } 263 264 return s.payloads, nil 265 }