github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/cloud/updateclouds_internal_test.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package cloud 5 6 import ( 7 gc "gopkg.in/check.v1" 8 9 jujucloud "github.com/juju/juju/cloud" 10 "github.com/juju/juju/testing" 11 ) 12 13 type cloudChangesSuite struct { 14 testing.BaseSuite 15 } 16 17 var _ = gc.Suite(&cloudChangesSuite{}) 18 19 func (s *cloudChangesSuite) TestPluralityNone(c *gc.C) { 20 c.Assert(adjustPlurality("item", 0), gc.Equals, "") 21 } 22 23 func (s *cloudChangesSuite) TestPluralitySingular(c *gc.C) { 24 c.Assert(adjustPlurality("item", 1), gc.Equals, "1 item") 25 } 26 27 func (s *cloudChangesSuite) TestPluralityPlural(c *gc.C) { 28 c.Assert(adjustPlurality("item", 2), gc.Equals, "2 items") 29 } 30 31 func (s *cloudChangesSuite) TestFormatSliceEmpty(c *gc.C) { 32 c.Assert(formatSlice(nil, "", ""), gc.Equals, "") 33 c.Assert(formatSlice([]string{}, "", ""), gc.Equals, "") 34 } 35 36 func (s *cloudChangesSuite) TestFormatSliceOne(c *gc.C) { 37 c.Assert(formatSlice([]string{"one"}, "", ""), gc.Equals, "one") 38 } 39 40 func (s *cloudChangesSuite) TestFormatSliceTwo(c *gc.C) { 41 c.Assert(formatSlice([]string{"one", "two"}, "", " and "), gc.Equals, "one and two") 42 } 43 44 func (s *cloudChangesSuite) TestFormatSliceMany(c *gc.C) { 45 c.Assert(formatSlice([]string{"one", "two", "three"}, ", ", " and "), gc.Equals, "one, two and three") 46 } 47 48 func (s *cloudChangesSuite) TestFormatSlices(c *gc.C) { 49 c.Assert(formatSlice( 50 []string{"one add", "two and three updates", "four, five and seven deletes"}, "; ", " as well as "), 51 gc.Equals, 52 "one add; two and three updates as well as four, five and seven deletes", 53 ) 54 } 55 56 var diffCloudsTests = []struct { 57 description string 58 new map[string]jujucloud.Cloud 59 old map[string]jujucloud.Cloud 60 expected string 61 }{ 62 { 63 description: "no clouds", 64 old: nil, 65 new: nil, 66 expected: "", 67 }, { 68 description: "empty new clouds, no old clouds", 69 old: nil, 70 new: map[string]jujucloud.Cloud{}, 71 expected: "", 72 }, { 73 description: "no new clouds, empty old clouds", 74 old: map[string]jujucloud.Cloud{}, 75 new: nil, 76 expected: "", 77 }, { 78 description: "both new and old clouds are empty", 79 old: map[string]jujucloud.Cloud{}, 80 new: map[string]jujucloud.Cloud{}, 81 expected: "", 82 }, { 83 description: "added 1 cloud", 84 old: map[string]jujucloud.Cloud{}, 85 new: map[string]jujucloud.Cloud{"one": {Name: "one"}}, 86 expected: ` 87 1 cloud added: 88 89 added cloud: 90 - one`[1:], 91 }, { 92 description: "added 2 cloud", 93 old: map[string]jujucloud.Cloud{}, 94 new: map[string]jujucloud.Cloud{ 95 "one": {Name: "one"}, 96 "two": {Name: "two"}, 97 }, 98 expected: ` 99 2 clouds added: 100 101 added cloud: 102 - one 103 - two`[1:], 104 }, { 105 description: "deleted 1 cloud", 106 old: map[string]jujucloud.Cloud{"one": {Name: "one"}}, 107 new: map[string]jujucloud.Cloud{}, 108 expected: ` 109 1 cloud deleted: 110 111 deleted cloud: 112 - one`[1:], 113 }, { 114 description: "deleted 2 cloud", 115 old: map[string]jujucloud.Cloud{ 116 "one": {Name: "one"}, 117 "two": {Name: "two"}, 118 }, 119 new: map[string]jujucloud.Cloud{}, 120 expected: ` 121 2 clouds deleted: 122 123 deleted cloud: 124 - one 125 - two`[1:], 126 }, { 127 description: "cloud attributes change: endpoint", 128 old: map[string]jujucloud.Cloud{"one": { 129 Name: "one", 130 }}, 131 new: map[string]jujucloud.Cloud{"one": { 132 Name: "one", 133 Endpoint: "old_endpoint", 134 }}, 135 expected: ` 136 1 cloud attribute changed: 137 138 changed cloud attribute: 139 - one`[1:], 140 }, { 141 description: "cloud attributes change: identity endpoint", 142 old: map[string]jujucloud.Cloud{"one": { 143 Name: "one", 144 }}, 145 new: map[string]jujucloud.Cloud{"one": { 146 Name: "one", 147 IdentityEndpoint: "old_endpoint"}, 148 }, 149 expected: ` 150 1 cloud attribute changed: 151 152 changed cloud attribute: 153 - one`[1:], 154 }, { 155 description: "cloud attributes change: storage endpoint", 156 old: map[string]jujucloud.Cloud{"one": { 157 Name: "one", 158 }}, 159 new: map[string]jujucloud.Cloud{"one": { 160 Name: "one", 161 StorageEndpoint: "old_endpoint"}, 162 }, 163 expected: ` 164 1 cloud attribute changed: 165 166 changed cloud attribute: 167 - one`[1:], 168 }, { 169 description: "cloud attributes change: type", 170 old: map[string]jujucloud.Cloud{"one": { 171 Name: "one", 172 }}, 173 new: map[string]jujucloud.Cloud{"one": { 174 Name: "one", 175 Type: "type", 176 }}, 177 expected: ` 178 1 cloud attribute changed: 179 180 changed cloud attribute: 181 - one`[1:], 182 }, { 183 description: "cloud attributes change: auth type added", 184 old: map[string]jujucloud.Cloud{"one": { 185 Name: "one", 186 }}, 187 new: map[string]jujucloud.Cloud{"one": { 188 Name: "one", 189 AuthTypes: []jujucloud.AuthType{jujucloud.AccessKeyAuthType}}, 190 }, 191 expected: ` 192 1 cloud attribute changed: 193 194 changed cloud attribute: 195 - one`[1:], 196 }, { 197 description: "cloud attributes change: auth type deleted", 198 old: map[string]jujucloud.Cloud{"one": { 199 Name: "one", 200 AuthTypes: []jujucloud.AuthType{jujucloud.AccessKeyAuthType}}, 201 }, 202 new: map[string]jujucloud.Cloud{"one": { 203 Name: "one", 204 }}, 205 expected: ` 206 1 cloud attribute changed: 207 208 changed cloud attribute: 209 - one`[1:], 210 }, { 211 description: "cloud attributes change: auth type changed", 212 old: map[string]jujucloud.Cloud{"one": { 213 Name: "one", 214 AuthTypes: []jujucloud.AuthType{jujucloud.AccessKeyAuthType}}, 215 }, 216 new: map[string]jujucloud.Cloud{"one": { 217 Name: "one", 218 AuthTypes: []jujucloud.AuthType{jujucloud.JSONFileAuthType}}, 219 }, 220 expected: ` 221 1 cloud attribute changed: 222 223 changed cloud attribute: 224 - one`[1:], 225 }, { 226 description: "cloud attributes change: region added", 227 old: map[string]jujucloud.Cloud{"one": { 228 Name: "one", 229 }}, 230 new: map[string]jujucloud.Cloud{"one": { 231 Name: "one", 232 Regions: []jujucloud.Region{{Name: "a"}}}, 233 }, 234 expected: ` 235 1 cloud region added: 236 237 added cloud region: 238 - one/a`[1:], 239 }, { 240 description: "cloud attributes change: region deleted", 241 old: map[string]jujucloud.Cloud{"one": { 242 Name: "one", 243 Regions: []jujucloud.Region{{Name: "a"}}}, 244 }, 245 new: map[string]jujucloud.Cloud{"one": { 246 Name: "one", 247 }}, 248 expected: ` 249 1 cloud region deleted: 250 251 deleted cloud region: 252 - one/a`[1:], 253 }, { 254 description: "cloud attributes change: region changed", 255 old: map[string]jujucloud.Cloud{"one": { 256 Name: "one", 257 Regions: []jujucloud.Region{{Name: "a"}}}, 258 }, 259 new: map[string]jujucloud.Cloud{"one": { 260 Name: "one", 261 Regions: []jujucloud.Region{{Name: "a", Endpoint: "old_endpoint"}}}, 262 }, 263 expected: ` 264 1 cloud region changed: 265 266 changed cloud region: 267 - one/a`[1:], 268 }, { 269 description: "cloud attributes change: region changed", 270 old: map[string]jujucloud.Cloud{"one": { 271 Name: "one", 272 Regions: []jujucloud.Region{{Name: "a", Endpoint: "old_endpoint"}}}, 273 }, 274 new: map[string]jujucloud.Cloud{"one": { 275 Name: "one", 276 Regions: []jujucloud.Region{{Name: "a"}}}, 277 }, 278 expected: ` 279 1 cloud region changed: 280 281 changed cloud region: 282 - one/a`[1:], 283 }, { 284 description: "cloud attributes change: region changed", 285 old: map[string]jujucloud.Cloud{"one": { 286 Name: "one", 287 Regions: []jujucloud.Region{{Name: "a", Endpoint: "old_endpoint"}}}, 288 }, 289 new: map[string]jujucloud.Cloud{"one": { 290 Name: "one", 291 Regions: []jujucloud.Region{{Name: "a", Endpoint: "new_endpoint"}}}, 292 }, 293 expected: ` 294 1 cloud region changed: 295 296 changed cloud region: 297 - one/a`[1:], 298 }, { 299 description: "cloud attributes change: region changed", 300 old: map[string]jujucloud.Cloud{"one": { 301 Name: "one", 302 Regions: []jujucloud.Region{{Name: "a"}}}, 303 }, 304 new: map[string]jujucloud.Cloud{"one": { 305 Name: "one", 306 Regions: []jujucloud.Region{{Name: "a", StorageEndpoint: "old_endpoint"}}}, 307 }, 308 expected: ` 309 1 cloud region changed: 310 311 changed cloud region: 312 - one/a`[1:], 313 }, { 314 description: "cloud attributes change: region changed", 315 old: map[string]jujucloud.Cloud{"one": { 316 Name: "one", 317 Regions: []jujucloud.Region{{Name: "a", StorageEndpoint: "old_endpoint"}}}, 318 }, 319 new: map[string]jujucloud.Cloud{"one": { 320 Name: "one", 321 Regions: []jujucloud.Region{{Name: "a"}}}, 322 }, 323 expected: ` 324 1 cloud region changed: 325 326 changed cloud region: 327 - one/a`[1:], 328 }, { 329 description: "cloud attributes change: region changed", 330 old: map[string]jujucloud.Cloud{"one": { 331 Name: "one", 332 Regions: []jujucloud.Region{{Name: "a", StorageEndpoint: "old_endpoint"}}}, 333 }, 334 new: map[string]jujucloud.Cloud{"one": { 335 Name: "one", 336 Regions: []jujucloud.Region{{Name: "a", StorageEndpoint: "new_endpoint"}}}, 337 }, 338 expected: ` 339 1 cloud region changed: 340 341 changed cloud region: 342 - one/a`[1:], 343 }, { 344 description: "cloud details changed", 345 old: map[string]jujucloud.Cloud{"one": { 346 Name: "one", 347 Type: "type", Regions: []jujucloud.Region{{Name: "a"}}}, 348 }, 349 new: map[string]jujucloud.Cloud{"one": { 350 Name: "one", 351 }}, 352 expected: ` 353 1 cloud attribute changed as well as 1 cloud region deleted: 354 355 changed cloud attribute: 356 - one 357 deleted cloud region: 358 - one/a`[1:], 359 }, { 360 description: "cloud details changed, another way", 361 old: map[string]jujucloud.Cloud{"one": { 362 Name: "one", 363 }}, 364 new: map[string]jujucloud.Cloud{"one": { 365 Name: "one", 366 Type: "type", Regions: []jujucloud.Region{{Name: "a"}}}, 367 }, 368 expected: ` 369 1 cloud region added as well as 1 cloud attribute changed: 370 371 added cloud region: 372 - one/a 373 changed cloud attribute: 374 - one`[1:], 375 }, { 376 description: "all cloud change types", 377 old: map[string]jujucloud.Cloud{ 378 "one": { 379 Name: "one", 380 Type: "type", Regions: []jujucloud.Region{{Name: "a"}}, 381 }, 382 "three": {Name: "three"}, // deleting 383 }, 384 new: map[string]jujucloud.Cloud{ 385 "one": {Name: "one"}, // updating 386 "two": {Name: "two"}, // adding 387 }, 388 expected: ` 389 1 cloud added; 1 cloud attribute changed as well as 1 cloud and 1 cloud region deleted: 390 391 added cloud: 392 - two 393 changed cloud attribute: 394 - one 395 deleted cloud: 396 - three 397 deleted cloud region: 398 - one/a`[1:], 399 }, { 400 description: "all cloud change types, another way", 401 old: map[string]jujucloud.Cloud{ 402 "one": {Name: "one"}, // updating 403 "two": {Name: "two"}, // deleting 404 }, 405 new: map[string]jujucloud.Cloud{ 406 "one": { 407 Name: "three", 408 Type: "type", 409 Regions: []jujucloud.Region{{Name: "a"}}, 410 }, 411 "three": { 412 Name: "three", 413 }, // adding 414 }, 415 expected: ` 416 1 cloud and 1 cloud region added; 1 cloud attribute changed as well as 1 cloud deleted: 417 418 added cloud: 419 - three 420 added cloud region: 421 - one/a 422 changed cloud attribute: 423 - one 424 deleted cloud: 425 - two`[1:], 426 }, 427 } 428 429 func (s *cloudChangesSuite) TestDiffClouds(c *gc.C) { 430 for i, test := range diffCloudsTests { 431 c.Logf("%d: %v", i, test.description) 432 c.Check(diffClouds(test.new, test.old), gc.Equals, test.expected) 433 } 434 }