github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/resource/list_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package resource_test
     5  
     6  import (
     7  	"time"
     8  
     9  	jujucmd "github.com/juju/cmd"
    10  	"github.com/juju/errors"
    11  	"github.com/juju/testing"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  	charmresource "gopkg.in/juju/charm.v6/resource"
    15  	"gopkg.in/juju/names.v2"
    16  
    17  	resourcecmd "github.com/juju/juju/cmd/juju/resource"
    18  	"github.com/juju/juju/resource"
    19  )
    20  
    21  var _ = gc.Suite(&ShowApplicationSuite{})
    22  
    23  type ShowApplicationSuite struct {
    24  	testing.IsolationSuite
    25  
    26  	stubDeps *stubShowApplicationDeps
    27  }
    28  
    29  func (s *ShowApplicationSuite) SetUpTest(c *gc.C) {
    30  	s.IsolationSuite.SetUpTest(c)
    31  
    32  	stub := &testing.Stub{}
    33  	s.stubDeps = &stubShowApplicationDeps{
    34  		stub:   stub,
    35  		client: &stubApplicationClient{stub: stub},
    36  	}
    37  }
    38  
    39  func (*ShowApplicationSuite) TestInitEmpty(c *gc.C) {
    40  	s := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{})
    41  
    42  	err := s.Init([]string{})
    43  	c.Assert(err, jc.Satisfies, errors.IsBadRequest)
    44  }
    45  
    46  func (*ShowApplicationSuite) TestInitGood(c *gc.C) {
    47  	s := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{})
    48  	err := s.Init([]string{"foo"})
    49  	c.Assert(err, jc.ErrorIsNil)
    50  	c.Assert(resourcecmd.ListCommandTarget(s), gc.Equals, "foo")
    51  }
    52  
    53  func (*ShowApplicationSuite) TestInitTooManyArgs(c *gc.C) {
    54  	s := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{})
    55  
    56  	err := s.Init([]string{"foo", "bar"})
    57  	c.Assert(err, jc.Satisfies, errors.IsBadRequest)
    58  }
    59  
    60  func (s *ShowApplicationSuite) TestInfo(c *gc.C) {
    61  	var command resourcecmd.ListCommand
    62  	info := command.Info()
    63  
    64  	c.Check(info, jc.DeepEquals, &jujucmd.Info{
    65  		Name:    "resources",
    66  		Aliases: []string{"list-resources"},
    67  		Args:    "<application or unit>",
    68  		Purpose: "Show the resources for an application or unit.",
    69  		Doc: `
    70  This command shows the resources required by and those in use by an existing
    71  application or unit in your model.  When run for an application, it will also show any
    72  updates available for resources from the charmstore.
    73  `,
    74  		FlagKnownAs:    "option",
    75  		ShowSuperFlags: []string{"show-log", "debug", "logging-config", "verbose", "quiet", "h", "help"},
    76  	})
    77  }
    78  
    79  func (s *ShowApplicationSuite) TestRunNoResourcesForApplication(c *gc.C) {
    80  	data := []resource.ApplicationResources{{}}
    81  	s.stubDeps.client.ReturnResources = data
    82  
    83  	cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{
    84  		NewClient: s.stubDeps.NewClient,
    85  	})
    86  
    87  	code, stdout, stderr := runCmd(c, cmd, "svc")
    88  	c.Check(code, gc.Equals, 0)
    89  	c.Check(stderr, gc.Equals, "No resources to display.\n")
    90  	c.Check(stdout, gc.Equals, "")
    91  	s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"})
    92  }
    93  
    94  func (s *ShowApplicationSuite) TestRun(c *gc.C) {
    95  	data := []resource.ApplicationResources{
    96  		{
    97  			Resources: []resource.Resource{
    98  				{
    99  					Resource: charmresource.Resource{
   100  						Meta: charmresource.Meta{
   101  							Name:        "openjdk",
   102  							Description: "the java runtime",
   103  						},
   104  						Origin:   charmresource.OriginStore,
   105  						Revision: 7,
   106  					},
   107  				},
   108  				{
   109  					Resource: charmresource.Resource{
   110  						Meta: charmresource.Meta{
   111  							Name:        "website",
   112  							Description: "your website data",
   113  						},
   114  						Origin: charmresource.OriginUpload,
   115  					},
   116  				},
   117  				{
   118  					Resource: charmresource.Resource{
   119  						Meta: charmresource.Meta{
   120  							Name:        "rsc1234",
   121  							Description: "a big description",
   122  						},
   123  						Origin:   charmresource.OriginStore,
   124  						Revision: 15,
   125  					},
   126  					Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   127  				},
   128  				{
   129  					Resource: charmresource.Resource{
   130  						Meta: charmresource.Meta{
   131  							Name:        "website2",
   132  							Description: "awesome data",
   133  						},
   134  						Origin: charmresource.OriginUpload,
   135  					},
   136  					Username:  "Bill User",
   137  					Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   138  				},
   139  			},
   140  			CharmStoreResources: []charmresource.Resource{
   141  				{
   142  					// This resource has a higher revision than the corresponding one
   143  					// above.
   144  					Meta: charmresource.Meta{
   145  						Name:        "openjdk",
   146  						Description: "the java runtime",
   147  						Type:        charmresource.TypeFile,
   148  						Path:        "foobar",
   149  					},
   150  					Revision: 10,
   151  					Origin:   charmresource.OriginStore,
   152  				},
   153  				{
   154  					// This resource is the same revision as the corresponding one
   155  					// above.
   156  					Meta: charmresource.Meta{
   157  						Name:        "rsc1234",
   158  						Description: "a big description",
   159  						Type:        charmresource.TypeFile,
   160  						Path:        "foobar",
   161  					},
   162  					Revision: 15,
   163  					Origin:   charmresource.OriginStore,
   164  				},
   165  				{
   166  					Meta: charmresource.Meta{
   167  						Name:        "website",
   168  						Description: "your website data",
   169  					},
   170  					Origin: charmresource.OriginUpload,
   171  				},
   172  				{
   173  					Meta: charmresource.Meta{
   174  						Name:        "website2",
   175  						Description: "awesome data",
   176  					},
   177  					Origin: charmresource.OriginUpload,
   178  				},
   179  			},
   180  		},
   181  	}
   182  	s.stubDeps.client.ReturnResources = data
   183  
   184  	cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{
   185  		NewClient: s.stubDeps.NewClient,
   186  	})
   187  
   188  	code, stdout, stderr := runCmd(c, cmd, "svc")
   189  	c.Check(code, gc.Equals, 0)
   190  	c.Check(stderr, gc.Equals, "")
   191  
   192  	c.Check(stdout, gc.Equals, `
   193  Resource  Supplied by  Revision
   194  openjdk   charmstore   7
   195  rsc1234   charmstore   15
   196  website   upload       -
   197  website2  Bill User    2012-12-12T12:12
   198  
   199  [Updates Available]
   200  Resource  Revision
   201  openjdk   10
   202  
   203  `[1:])
   204  
   205  	s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"})
   206  }
   207  
   208  func (s *ShowApplicationSuite) TestRunNoResourcesForUnit(c *gc.C) {
   209  	data := []resource.ApplicationResources{{}}
   210  	s.stubDeps.client.ReturnResources = data
   211  
   212  	cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{
   213  		NewClient: s.stubDeps.NewClient,
   214  	})
   215  
   216  	code, stdout, stderr := runCmd(c, cmd, "svc/0")
   217  	c.Assert(code, gc.Equals, 0)
   218  	c.Check(stderr, gc.Equals, "No resources to display.\n")
   219  	c.Check(stdout, gc.Equals, "")
   220  	s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"})
   221  }
   222  
   223  func (s *ShowApplicationSuite) TestRunResourcesForAppButNoResourcesForUnit(c *gc.C) {
   224  	unitName := "svc/0"
   225  
   226  	data := []resource.ApplicationResources{{
   227  		Resources: []resource.Resource{
   228  			{
   229  				Resource: charmresource.Resource{
   230  					Meta: charmresource.Meta{
   231  						Name:        "openjdk",
   232  						Description: "the java runtime",
   233  					},
   234  					Origin:   charmresource.OriginStore,
   235  					Revision: 7,
   236  				},
   237  			},
   238  		},
   239  		CharmStoreResources: []charmresource.Resource{
   240  			{
   241  				// This resource has a higher revision than the corresponding one
   242  				// above.
   243  				Meta: charmresource.Meta{
   244  					Name:        "openjdk",
   245  					Description: "the java runtime",
   246  					Type:        charmresource.TypeFile,
   247  					Path:        "foobar",
   248  				},
   249  				Revision: 10,
   250  				Origin:   charmresource.OriginStore,
   251  			},
   252  		},
   253  		UnitResources: []resource.UnitResources{
   254  			{
   255  				Tag: names.NewUnitTag(unitName),
   256  			},
   257  		},
   258  	}}
   259  	s.stubDeps.client.ReturnResources = data
   260  
   261  	cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{
   262  		NewClient: s.stubDeps.NewClient,
   263  	})
   264  
   265  	code, stdout, stderr := runCmd(c, cmd, unitName)
   266  	c.Assert(code, gc.Equals, 0)
   267  	c.Check(stdout, gc.Equals, `
   268  Resource  Revision
   269  openjdk   -
   270  
   271  `[1:])
   272  	c.Check(stderr, gc.Equals, "")
   273  	s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"})
   274  }
   275  
   276  func (s *ShowApplicationSuite) TestRunUnit(c *gc.C) {
   277  	data := []resource.ApplicationResources{
   278  		{
   279  			Resources: []resource.Resource{
   280  				{
   281  					Resource: charmresource.Resource{
   282  						Meta: charmresource.Meta{
   283  							Name:        "rsc1234",
   284  							Description: "a big description",
   285  						},
   286  						Origin:   charmresource.OriginStore,
   287  						Revision: 20,
   288  					},
   289  					Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   290  					ID:        "one",
   291  				},
   292  				{
   293  					Resource: charmresource.Resource{
   294  						Meta: charmresource.Meta{
   295  							Name:        "website2",
   296  							Description: "awesome data",
   297  						},
   298  						Origin: charmresource.OriginUpload,
   299  						Size:   15,
   300  					},
   301  					Username:  "Bill User",
   302  					Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   303  					ID:        "two",
   304  				},
   305  			},
   306  			UnitResources: []resource.UnitResources{{
   307  				Tag: names.NewUnitTag("svc/0"),
   308  				Resources: []resource.Resource{
   309  					{
   310  						Resource: charmresource.Resource{
   311  							Meta: charmresource.Meta{
   312  								Name:        "rsc1234",
   313  								Description: "a big description",
   314  							},
   315  							Origin:   charmresource.OriginStore,
   316  							Revision: 15, // Note revision is different to the application resource
   317  						},
   318  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   319  						ID:        "one",
   320  					},
   321  					{
   322  						Resource: charmresource.Resource{
   323  							Meta: charmresource.Meta{
   324  								Name:        "website2",
   325  								Description: "awesome data",
   326  							},
   327  							Origin: charmresource.OriginUpload,
   328  							Size:   15,
   329  						},
   330  						Username:  "Bill User",
   331  						ID:        "two",
   332  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   333  					},
   334  				},
   335  				DownloadProgress: map[string]int64{
   336  					"website2": 12,
   337  				},
   338  			}},
   339  		}}
   340  	s.stubDeps.client.ReturnResources = data
   341  
   342  	cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{
   343  		NewClient: s.stubDeps.NewClient,
   344  	})
   345  
   346  	code, stdout, stderr := runCmd(c, cmd, "svc/0")
   347  	c.Assert(code, gc.Equals, 0)
   348  	c.Assert(stderr, gc.Equals, "")
   349  
   350  	c.Check(stdout, gc.Equals, `
   351  Resource  Revision
   352  rsc1234   15
   353  website2  2012-12-12T12:12
   354  
   355  `[1:])
   356  
   357  	s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"})
   358  }
   359  
   360  func (s *ShowApplicationSuite) TestRunDetails(c *gc.C) {
   361  	data := []resource.ApplicationResources{{
   362  		Resources: []resource.Resource{
   363  			{
   364  				Resource: charmresource.Resource{
   365  					Meta: charmresource.Meta{
   366  						Name:        "alpha",
   367  						Description: "a big comment",
   368  					},
   369  					Origin:   charmresource.OriginStore,
   370  					Revision: 15,
   371  					Size:     113,
   372  				},
   373  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   374  			},
   375  			{
   376  				Resource: charmresource.Resource{
   377  					Meta: charmresource.Meta{
   378  						Name:        "charlie",
   379  						Description: "awesome data",
   380  					},
   381  					Origin: charmresource.OriginUpload,
   382  					Size:   9835617,
   383  				},
   384  				Username:  "Bill User",
   385  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   386  			},
   387  			{
   388  				Resource: charmresource.Resource{
   389  					Meta: charmresource.Meta{
   390  						Name:        "beta",
   391  						Description: "more data",
   392  					},
   393  					Origin: charmresource.OriginUpload,
   394  				},
   395  				Username:  "Bill User",
   396  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   397  			},
   398  		},
   399  		CharmStoreResources: []charmresource.Resource{
   400  			{
   401  				Meta: charmresource.Meta{
   402  					Name:        "alpha",
   403  					Description: "a big comment",
   404  				},
   405  				Origin:   charmresource.OriginStore,
   406  				Revision: 15,
   407  			},
   408  			{
   409  				Meta: charmresource.Meta{
   410  					Name:        "charlie",
   411  					Description: "awesome data",
   412  				},
   413  				Origin: charmresource.OriginUpload,
   414  			},
   415  			{
   416  				Meta: charmresource.Meta{
   417  					Name:        "beta",
   418  					Description: "more data",
   419  				},
   420  				Origin: charmresource.OriginUpload,
   421  			},
   422  		},
   423  		UnitResources: []resource.UnitResources{
   424  			{
   425  				Tag: names.NewUnitTag("svc/10"),
   426  				Resources: []resource.Resource{
   427  					{
   428  						Resource: charmresource.Resource{
   429  							Meta: charmresource.Meta{
   430  								Name:        "alpha",
   431  								Description: "a big comment",
   432  							},
   433  							Origin:   charmresource.OriginStore,
   434  							Revision: 10, // note the reivision is different for this unit
   435  						},
   436  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   437  					},
   438  					{
   439  						Resource: charmresource.Resource{
   440  							Meta: charmresource.Meta{
   441  								Name:        "charlie",
   442  								Description: "awesome data",
   443  							},
   444  							Origin: charmresource.OriginUpload,
   445  						},
   446  						Username: "Bill User",
   447  						// note the different time
   448  						Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC),
   449  					},
   450  					// note we're missing the beta resource for this unit
   451  				},
   452  				DownloadProgress: map[string]int64{
   453  					"alpha":   17,
   454  					"charlie": 899937,
   455  				},
   456  			},
   457  			{
   458  				Tag: names.NewUnitTag("svc/5"),
   459  				Resources: []resource.Resource{
   460  					{
   461  						Resource: charmresource.Resource{
   462  							Meta: charmresource.Meta{
   463  								Name:        "alpha",
   464  								Description: "a big comment",
   465  							},
   466  							Origin:   charmresource.OriginStore,
   467  							Revision: 10, // note the reivision is different for this unit
   468  						},
   469  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   470  					},
   471  					{
   472  						Resource: charmresource.Resource{
   473  							Meta: charmresource.Meta{
   474  								Name:        "charlie",
   475  								Description: "awesome data",
   476  							},
   477  							Origin: charmresource.OriginUpload,
   478  						},
   479  						Username: "Bill User",
   480  						// note the different time
   481  						Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC),
   482  					},
   483  					{
   484  						Resource: charmresource.Resource{
   485  							Meta: charmresource.Meta{
   486  								Name:        "beta",
   487  								Description: "more data",
   488  							},
   489  							Origin: charmresource.OriginUpload,
   490  						},
   491  						Username:  "Bill User",
   492  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   493  					},
   494  				},
   495  				DownloadProgress: map[string]int64{
   496  					"charlie": 177331,
   497  				},
   498  			},
   499  		},
   500  	}}
   501  	s.stubDeps.client.ReturnResources = data
   502  
   503  	cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{
   504  		NewClient: s.stubDeps.NewClient,
   505  	})
   506  
   507  	code, stdout, stderr := runCmd(c, cmd, "svc", "--details")
   508  	c.Check(code, gc.Equals, 0)
   509  	c.Check(stderr, gc.Equals, "")
   510  
   511  	c.Check(stdout, gc.Equals, `
   512  Unit    Resource  Revision          Expected
   513  svc/5   alpha     10                15
   514  svc/5   beta      2012-12-12T12:12  2012-12-12T12:12
   515  svc/5   charlie   2011-11-11T11:11  2012-12-12T12:12 (fetching: 2%)
   516  svc/10  alpha     10                15 (fetching: 15%)
   517  svc/10  beta      -                 2012-12-12T12:12
   518  svc/10  charlie   2011-11-11T11:11  2012-12-12T12:12 (fetching: 9%)
   519  
   520  `[1:])
   521  
   522  	s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"})
   523  }
   524  
   525  func (s *ShowApplicationSuite) TestRunUnitDetails(c *gc.C) {
   526  	data := []resource.ApplicationResources{{
   527  		Resources: []resource.Resource{
   528  			{
   529  				Resource: charmresource.Resource{
   530  					Meta: charmresource.Meta{
   531  						Name:        "alpha",
   532  						Description: "a big comment",
   533  					},
   534  					Origin:   charmresource.OriginStore,
   535  					Revision: 15,
   536  					Size:     113,
   537  				},
   538  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   539  			},
   540  			{
   541  				Resource: charmresource.Resource{
   542  					Meta: charmresource.Meta{
   543  						Name:        "charlie",
   544  						Description: "awesome data",
   545  					},
   546  					Origin: charmresource.OriginUpload,
   547  					Size:   9835617,
   548  				},
   549  				Username:  "Bill User",
   550  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   551  			},
   552  			{
   553  				Resource: charmresource.Resource{
   554  					Meta: charmresource.Meta{
   555  						Name:        "beta",
   556  						Description: "more data",
   557  					},
   558  					Origin: charmresource.OriginUpload,
   559  				},
   560  				Username:  "Bill User",
   561  				Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   562  			},
   563  		},
   564  		UnitResources: []resource.UnitResources{
   565  			{
   566  				Tag: names.NewUnitTag("svc/10"),
   567  				Resources: []resource.Resource{
   568  					{
   569  						Resource: charmresource.Resource{
   570  							Meta: charmresource.Meta{
   571  								Name:        "alpha",
   572  								Description: "a big comment",
   573  							},
   574  							Origin:   charmresource.OriginStore,
   575  							Revision: 10, // note the reivision is different for this unit
   576  						},
   577  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   578  					},
   579  					{
   580  						Resource: charmresource.Resource{
   581  							Meta: charmresource.Meta{
   582  								Name:        "charlie",
   583  								Description: "awesome data",
   584  							},
   585  							Origin: charmresource.OriginUpload,
   586  						},
   587  						Username: "Bill User",
   588  						// note the different time
   589  						Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC),
   590  					},
   591  					// note we're missing the beta resource for this unit
   592  				},
   593  				DownloadProgress: map[string]int64{
   594  					"charlie": 17,
   595  				},
   596  			},
   597  			{
   598  				Tag: names.NewUnitTag("svc/5"),
   599  				Resources: []resource.Resource{
   600  					{
   601  						Resource: charmresource.Resource{
   602  							Meta: charmresource.Meta{
   603  								Name:        "alpha",
   604  								Description: "a big comment",
   605  							},
   606  							Origin:   charmresource.OriginStore,
   607  							Revision: 10, // note the reivision is different for this unit
   608  						},
   609  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   610  					},
   611  					{
   612  						Resource: charmresource.Resource{
   613  							Meta: charmresource.Meta{
   614  								Name:        "charlie",
   615  								Description: "awesome data",
   616  							},
   617  							Origin: charmresource.OriginUpload,
   618  						},
   619  						Username: "Bill User",
   620  						// note the different time
   621  						Timestamp: time.Date(2011, 11, 11, 11, 11, 11, 0, time.UTC),
   622  					},
   623  					{
   624  						Resource: charmresource.Resource{
   625  							Meta: charmresource.Meta{
   626  								Name:        "beta",
   627  								Description: "more data",
   628  							},
   629  							Origin: charmresource.OriginUpload,
   630  						},
   631  						Username:  "Bill User",
   632  						Timestamp: time.Date(2012, 12, 12, 12, 12, 12, 0, time.UTC),
   633  					},
   634  				},
   635  			},
   636  		},
   637  	}}
   638  	s.stubDeps.client.ReturnResources = data
   639  
   640  	cmd := resourcecmd.NewListCommandForTest(resourcecmd.ListDeps{
   641  		NewClient: s.stubDeps.NewClient,
   642  	})
   643  
   644  	code, stdout, stderr := runCmd(c, cmd, "svc/10", "--details")
   645  	c.Assert(code, gc.Equals, 0)
   646  	c.Assert(stderr, gc.Equals, "")
   647  
   648  	c.Check(stdout, gc.Equals, `
   649  Resource  Revision          Expected
   650  alpha     10                15
   651  beta      -                 2012-12-12T12:12
   652  charlie   2011-11-11T11:11  2012-12-12T12:12 (fetching: 0%)
   653  
   654  `[1:])
   655  
   656  	s.stubDeps.stub.CheckCall(c, 1, "ListResources", []string{"svc"})
   657  }
   658  
   659  type stubShowApplicationDeps struct {
   660  	stub   *testing.Stub
   661  	client *stubApplicationClient
   662  }
   663  
   664  func (s *stubShowApplicationDeps) NewClient(c *resourcecmd.ListCommand) (resourcecmd.ListClient, error) {
   665  	s.stub.AddCall("NewClient", c)
   666  	if err := s.stub.NextErr(); err != nil {
   667  		return nil, errors.Trace(err)
   668  	}
   669  
   670  	return s.client, nil
   671  }
   672  
   673  type stubApplicationClient struct {
   674  	stub            *testing.Stub
   675  	ReturnResources []resource.ApplicationResources
   676  }
   677  
   678  func (s *stubApplicationClient) ListResources(applications []string) ([]resource.ApplicationResources, error) {
   679  	s.stub.AddCall("ListResources", applications)
   680  	if err := s.stub.NextErr(); err != nil {
   681  		return nil, errors.Trace(err)
   682  	}
   683  	return s.ReturnResources, nil
   684  }
   685  
   686  func (s *stubApplicationClient) Close() error {
   687  	s.stub.AddCall("Close")
   688  	if err := s.stub.NextErr(); err != nil {
   689  		return errors.Trace(err)
   690  	}
   691  
   692  	return nil
   693  }