github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/charmstore/latest_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package charmstore
     5  
     6  import (
     7  	"sort"
     8  
     9  	"github.com/juju/errors"
    10  	"github.com/juju/testing"
    11  	jc "github.com/juju/testing/checkers"
    12  	gc "gopkg.in/check.v1"
    13  	"gopkg.in/juju/charm.v6-unstable"
    14  	charmresource "gopkg.in/juju/charm.v6-unstable/resource"
    15  	"gopkg.in/juju/charmrepo.v2-unstable/csclient/params"
    16  
    17  	"github.com/juju/juju/version"
    18  )
    19  
    20  type LatestCharmInfoSuite struct {
    21  	testing.IsolationSuite
    22  
    23  	lowLevel *fakeWrapper
    24  	cache    *fakeMacCache
    25  }
    26  
    27  var _ = gc.Suite(&LatestCharmInfoSuite{})
    28  
    29  func (s *LatestCharmInfoSuite) SetUpTest(c *gc.C) {
    30  	s.IsolationSuite.SetUpTest(c)
    31  
    32  	s.lowLevel = &fakeWrapper{
    33  		stub:       &testing.Stub{},
    34  		stableStub: &testing.Stub{},
    35  		devStub:    &testing.Stub{},
    36  	}
    37  
    38  	s.cache = &fakeMacCache{
    39  		stub: &testing.Stub{},
    40  	}
    41  }
    42  
    43  func (s *LatestCharmInfoSuite) TestSuccess(c *gc.C) {
    44  	spam := charm.MustParseURL("cs:quantal/spam-17")
    45  	eggs := charm.MustParseURL("cs:quantal/eggs-2")
    46  	ham := charm.MustParseURL("cs:quantal/ham-1")
    47  	charms := []CharmID{
    48  		{URL: spam, Channel: "stable"},
    49  		{URL: eggs, Channel: "stable"},
    50  		{URL: ham, Channel: "stable"},
    51  	}
    52  	notFound := errors.New("not found")
    53  	s.lowLevel.ReturnLatestStable = [][]params.CharmRevision{{{
    54  		Revision: 17,
    55  	}}, {{
    56  		Revision: 3,
    57  	}}, {{
    58  		Err: notFound,
    59  	}}}
    60  
    61  	fakeRes := fakeParamsResource("foo", nil)
    62  
    63  	s.lowLevel.ReturnListResourcesStable = []resourceResult{
    64  		oneResourceResult(fakeRes),
    65  		resourceResult{err: params.ErrNotFound},
    66  		resourceResult{err: params.ErrUnauthorized},
    67  	}
    68  
    69  	client, err := newCachingClient(s.cache, nil, s.lowLevel.makeWrapper)
    70  	c.Assert(err, jc.ErrorIsNil)
    71  
    72  	metadata := map[string]string{
    73  		"environment_uuid": "foouuid",
    74  		"cloud":            "foocloud",
    75  		"cloud_region":     "fooregion",
    76  		"provider":         "fooprovider",
    77  	}
    78  	results, err := LatestCharmInfo(client, charms, metadata)
    79  	c.Assert(err, jc.ErrorIsNil)
    80  
    81  	header := []string{"environment_uuid=foouuid", "cloud=foocloud", "cloud_region=fooregion", "provider=fooprovider", "controller_version=" + version.Current.String()}
    82  	s.lowLevel.stableStub.CheckCall(c, 0, "Latest", params.StableChannel, []*charm.URL{spam}, map[string][]string{"Juju-Metadata": header})
    83  	s.lowLevel.stableStub.CheckCall(c, 1, "Latest", params.StableChannel, []*charm.URL{eggs}, map[string][]string{"Juju-Metadata": header})
    84  	s.lowLevel.stableStub.CheckCall(c, 2, "Latest", params.StableChannel, []*charm.URL{ham}, map[string][]string{"Juju-Metadata": header})
    85  	s.lowLevel.stableStub.CheckCall(c, 3, "ListResources", params.StableChannel, spam)
    86  	s.lowLevel.stableStub.CheckCall(c, 4, "ListResources", params.StableChannel, eggs)
    87  	s.lowLevel.stableStub.CheckCall(c, 5, "ListResources", params.StableChannel, ham)
    88  
    89  	expectedRes, err := params.API2Resource(fakeRes)
    90  	c.Assert(err, jc.ErrorIsNil)
    91  
    92  	timestamp := results[0].Timestamp
    93  	results[2].Error = errors.Cause(results[2].Error)
    94  	expected := []CharmInfoResult{{
    95  		CharmInfo: CharmInfo{
    96  			OriginalURL:    charm.MustParseURL("cs:quantal/spam-17"),
    97  			Timestamp:      timestamp,
    98  			LatestRevision: 17,
    99  			LatestResources: []charmresource.Resource{
   100  				expectedRes,
   101  			},
   102  		},
   103  	}, {
   104  		CharmInfo: CharmInfo{
   105  			OriginalURL:    charm.MustParseURL("cs:quantal/eggs-2"),
   106  			Timestamp:      timestamp,
   107  			LatestRevision: 3,
   108  		},
   109  	}, {
   110  		CharmInfo: CharmInfo{
   111  			OriginalURL: charm.MustParseURL("cs:quantal/ham-1"),
   112  			Timestamp:   timestamp,
   113  		},
   114  		Error: notFound,
   115  	}}
   116  	sort.Sort(byURL(results))
   117  	sort.Sort(byURL(expected))
   118  	c.Check(results, jc.DeepEquals, expected)
   119  }
   120  
   121  type byURL []CharmInfoResult
   122  
   123  func (b byURL) Len() int           { return len(b) }
   124  func (b byURL) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }
   125  func (b byURL) Less(i, j int) bool { return b[i].OriginalURL.String() < b[j].OriginalURL.String() }