github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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() }