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  }