github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/resource/api/client/client_listresources_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package client_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/apiserver/params"
    12  	"github.com/juju/juju/resource"
    13  	"github.com/juju/juju/resource/api"
    14  	"github.com/juju/juju/resource/api/client"
    15  )
    16  
    17  var _ = gc.Suite(&ListResourcesSuite{})
    18  
    19  type ListResourcesSuite struct {
    20  	BaseSuite
    21  }
    22  
    23  func (s *ListResourcesSuite) TestOkay(c *gc.C) {
    24  	expected, apiResult := newResourceResult(c, "a-application", "spam")
    25  	s.facade.apiResults["a-application"] = apiResult
    26  
    27  	cl := client.NewClient(s.facade, s, s.facade)
    28  
    29  	services := []string{"a-application"}
    30  	results, err := cl.ListResources(services)
    31  	c.Assert(err, jc.ErrorIsNil)
    32  
    33  	c.Check(results, jc.DeepEquals, []resource.ServiceResources{
    34  		{Resources: expected},
    35  	})
    36  	c.Check(s.stub.Calls(), gc.HasLen, 1)
    37  	s.stub.CheckCall(c, 0, "FacadeCall",
    38  		"ListResources",
    39  		&api.ListResourcesArgs{[]params.Entity{{
    40  			Tag: "application-a-application",
    41  		}}},
    42  		&api.ResourcesResults{
    43  			Results: []api.ResourcesResult{
    44  				apiResult,
    45  			},
    46  		},
    47  	)
    48  }
    49  
    50  func (s *ListResourcesSuite) TestBulk(c *gc.C) {
    51  	expected1, apiResult1 := newResourceResult(c, "a-application", "spam")
    52  	s.facade.apiResults["a-application"] = apiResult1
    53  	expected2, apiResult2 := newResourceResult(c, "other-application", "eggs", "ham")
    54  	s.facade.apiResults["other-application"] = apiResult2
    55  
    56  	cl := client.NewClient(s.facade, s, s.facade)
    57  
    58  	services := []string{"a-application", "other-application"}
    59  	results, err := cl.ListResources(services)
    60  	c.Assert(err, jc.ErrorIsNil)
    61  
    62  	c.Check(results, jc.DeepEquals, []resource.ServiceResources{
    63  		{Resources: expected1},
    64  		{Resources: expected2},
    65  	})
    66  	c.Check(s.stub.Calls(), gc.HasLen, 1)
    67  	s.stub.CheckCall(c, 0, "FacadeCall",
    68  		"ListResources",
    69  		&api.ListResourcesArgs{[]params.Entity{
    70  			{
    71  				Tag: "application-a-application",
    72  			}, {
    73  				Tag: "application-other-application",
    74  			},
    75  		}},
    76  		&api.ResourcesResults{
    77  			Results: []api.ResourcesResult{
    78  				apiResult1,
    79  				apiResult2,
    80  			},
    81  		},
    82  	)
    83  }
    84  
    85  func (s *ListResourcesSuite) TestNoServices(c *gc.C) {
    86  	cl := client.NewClient(s.facade, s, s.facade)
    87  
    88  	var services []string
    89  	results, err := cl.ListResources(services)
    90  	c.Assert(err, jc.ErrorIsNil)
    91  
    92  	c.Check(results, gc.HasLen, 0)
    93  	s.stub.CheckCallNames(c, "FacadeCall")
    94  }
    95  
    96  func (s *ListResourcesSuite) TestBadServices(c *gc.C) {
    97  	cl := client.NewClient(s.facade, s, s.facade)
    98  
    99  	services := []string{"???"}
   100  	_, err := cl.ListResources(services)
   101  
   102  	c.Check(err, gc.ErrorMatches, `.*invalid application.*`)
   103  	s.stub.CheckNoCalls(c)
   104  }
   105  
   106  func (s *ListResourcesSuite) TestServiceNotFound(c *gc.C) {
   107  	cl := client.NewClient(s.facade, s, s.facade)
   108  
   109  	services := []string{"a-application"}
   110  	_, err := cl.ListResources(services)
   111  
   112  	c.Check(err, jc.Satisfies, errors.IsNotFound)
   113  	s.stub.CheckCallNames(c, "FacadeCall")
   114  }
   115  
   116  func (s *ListResourcesSuite) TestServiceEmpty(c *gc.C) {
   117  	s.facade.apiResults["a-application"] = api.ResourcesResult{}
   118  
   119  	cl := client.NewClient(s.facade, s, s.facade)
   120  
   121  	services := []string{"a-application"}
   122  	results, err := cl.ListResources(services)
   123  	c.Assert(err, jc.ErrorIsNil)
   124  
   125  	c.Check(results, jc.DeepEquals, []resource.ServiceResources{
   126  		{},
   127  	})
   128  	s.stub.CheckCallNames(c, "FacadeCall")
   129  }
   130  
   131  func (s *ListResourcesSuite) TestServerError(c *gc.C) {
   132  	failure := errors.New("<failure>")
   133  	s.facade.FacadeCallFn = func(_ string, _, _ interface{}) error {
   134  		return failure
   135  	}
   136  
   137  	cl := client.NewClient(s.facade, s, s.facade)
   138  
   139  	services := []string{"a-application"}
   140  	_, err := cl.ListResources(services)
   141  
   142  	c.Check(err, gc.ErrorMatches, `<failure>`)
   143  	s.stub.CheckCallNames(c, "FacadeCall")
   144  }
   145  
   146  func (s *ListResourcesSuite) TestTooFew(c *gc.C) {
   147  	s.facade.FacadeCallFn = func(_ string, _, response interface{}) error {
   148  		typedResponse, ok := response.(*api.ResourcesResults)
   149  		c.Assert(ok, jc.IsTrue)
   150  
   151  		typedResponse.Results = []api.ResourcesResult{{
   152  			Resources: nil,
   153  		}}
   154  
   155  		return nil
   156  	}
   157  
   158  	cl := client.NewClient(s.facade, s, s.facade)
   159  
   160  	services := []string{"a-application", "other-application"}
   161  	results, err := cl.ListResources(services)
   162  
   163  	c.Check(results, gc.HasLen, 0)
   164  	c.Check(err, gc.ErrorMatches, `.*got invalid data from server \(expected 2 results, got 1\).*`)
   165  	s.stub.CheckCallNames(c, "FacadeCall")
   166  }
   167  
   168  func (s *ListResourcesSuite) TestTooMany(c *gc.C) {
   169  	s.facade.FacadeCallFn = func(_ string, _, response interface{}) error {
   170  		typedResponse, ok := response.(*api.ResourcesResults)
   171  		c.Assert(ok, jc.IsTrue)
   172  
   173  		typedResponse.Results = []api.ResourcesResult{{
   174  			Resources: nil,
   175  		}, {
   176  			Resources: nil,
   177  		}, {
   178  			Resources: nil,
   179  		}}
   180  
   181  		return nil
   182  	}
   183  
   184  	cl := client.NewClient(s.facade, s, s.facade)
   185  
   186  	services := []string{"a-application", "other-application"}
   187  	results, err := cl.ListResources(services)
   188  
   189  	c.Check(results, gc.HasLen, 0)
   190  	c.Check(err, gc.ErrorMatches, `.*got invalid data from server \(expected 2 results, got 3\).*`)
   191  	s.stub.CheckCallNames(c, "FacadeCall")
   192  }
   193  
   194  func (s *ListResourcesSuite) TestConversionFailed(c *gc.C) {
   195  	s.facade.FacadeCallFn = func(_ string, _, response interface{}) error {
   196  		typedResponse, ok := response.(*api.ResourcesResults)
   197  		c.Assert(ok, jc.IsTrue)
   198  
   199  		var res api.Resource
   200  		res.Name = "spam"
   201  		typedResponse.Results = []api.ResourcesResult{{
   202  			Resources: []api.Resource{
   203  				res,
   204  			},
   205  		}}
   206  
   207  		return nil
   208  	}
   209  
   210  	cl := client.NewClient(s.facade, s, s.facade)
   211  
   212  	services := []string{"a-application"}
   213  	_, err := cl.ListResources(services)
   214  
   215  	c.Check(err, gc.ErrorMatches, `.*got bad data.*`)
   216  	s.stub.CheckCallNames(c, "FacadeCall")
   217  }