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