1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
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"
18
type LatestCharmInfoSuite struct {
19
testing.IsolationSuite
25
var _ = gc.Suite(&LatestCharmInfoSuite{})
27
func (s *LatestCharmInfoSuite) SetUpTest(c *gc.C) {
28
s.IsolationSuite.SetUpTest(c)
30
s.lowLevel = &fakeWrapper{
31
stub: &testing.Stub{},
32
stableStub: &testing.Stub{},
33
devStub: &testing.Stub{},
36
s.cache = &fakeMacCache{
37
stub: &testing.Stub{},
41
func (s *LatestCharmInfoSuite) TestSuccess(c *gc.C) {
42
spam := charm.MustParseURL("cs:quantal/spam-17")
43
eggs := charm.MustParseURL("cs:quantal/eggs-2")
44
ham := charm.MustParseURL("cs:quantal/ham-1")
46
{URL: spam, Channel: "stable"},
47
{URL: eggs, Channel: "stable"},
48
{URL: ham, Channel: "stable"},
50
notFound := errors.New("not found")
51
s.lowLevel.ReturnLatestStable = [][]params.CharmRevision{{{
59
fakeRes := fakeParamsResource("foo", nil)
61
s.lowLevel.ReturnListResourcesStable = []resourceResult{
62
oneResourceResult(fakeRes),
63
resourceResult{err: params.ErrNotFound},
64
resourceResult{err: params.ErrUnauthorized},
67
client, err := newCachingClient(s.cache, nil, s.lowLevel.makeWrapper)
68
c.Assert(err, jc.ErrorIsNil)
70
results, err := LatestCharmInfo(client, charms, "foobar")
71
c.Assert(err, jc.ErrorIsNil)
73
s.lowLevel.stableStub.CheckCall(c, 0, "Latest", params.StableChannel, []*charm.URL{spam}, map[string][]string{"Juju-Metadata": []string{"environment_uuid=foobar"}})
74
s.lowLevel.stableStub.CheckCall(c, 1, "Latest", params.StableChannel, []*charm.URL{eggs}, map[string][]string{"Juju-Metadata": []string{"environment_uuid=foobar"}})
75
s.lowLevel.stableStub.CheckCall(c, 2, "Latest", params.StableChannel, []*charm.URL{ham}, map[string][]string{"Juju-Metadata": []string{"environment_uuid=foobar"}})
76
s.lowLevel.stableStub.CheckCall(c, 3, "ListResources", params.StableChannel, spam)
77
s.lowLevel.stableStub.CheckCall(c, 4, "ListResources", params.StableChannel, eggs)
78
s.lowLevel.stableStub.CheckCall(c, 5, "ListResources", params.StableChannel, ham)
80
expectedRes, err := params.API2Resource(fakeRes)
81
c.Assert(err, jc.ErrorIsNil)
83
timestamp := results[0].Timestamp
84
results[2].Error = errors.Cause(results[2].Error)
85
expected := []CharmInfoResult{{
87
OriginalURL: charm.MustParseURL("cs:quantal/spam-17"),
90
LatestResources: []charmresource.Resource{
96
OriginalURL: charm.MustParseURL("cs:quantal/eggs-2"),
101
CharmInfo: CharmInfo{
102
OriginalURL: charm.MustParseURL("cs:quantal/ham-1"),
103
Timestamp: timestamp,
107
sort.Sort(byURL(results))
108
sort.Sort(byURL(expected))
109
c.Check(results, jc.DeepEquals, expected)
112
type byURL []CharmInfoResult
114
func (b byURL) Len() int { return len(b) }
115
func (b byURL) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
116
func (b byURL) Less(i, j int) bool { return b[i].OriginalURL.String() < b[j].OriginalURL.String() }