github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/applicationoffers/access_test.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package applicationoffers_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  	"gopkg.in/juju/names.v2"
    10  
    11  	"github.com/juju/juju/api/applicationoffers"
    12  	basetesting "github.com/juju/juju/api/base/testing"
    13  	"github.com/juju/juju/apiserver/params"
    14  	"github.com/juju/juju/testing"
    15  )
    16  
    17  type accessSuite struct {
    18  	testing.BaseSuite
    19  }
    20  
    21  type accessFunc func(string, string, ...string) error
    22  
    23  var _ = gc.Suite(&accessSuite{})
    24  
    25  const (
    26  	someOffer = "user/prod.hosted-mysql"
    27  )
    28  
    29  func accessCall(client *applicationoffers.Client, action params.OfferAction, user, access string, offerURLs ...string) error {
    30  	switch action {
    31  	case params.GrantOfferAccess:
    32  		return client.GrantOffer(user, access, offerURLs...)
    33  	case params.RevokeOfferAccess:
    34  		return client.RevokeOffer(user, access, offerURLs...)
    35  	default:
    36  		panic(action)
    37  	}
    38  }
    39  
    40  func (s *accessSuite) TestGrantOfferReadOnlyUser(c *gc.C) {
    41  	s.readOnlyUser(c, params.GrantOfferAccess)
    42  }
    43  
    44  func (s *accessSuite) TestRevokeOfferReadOnlyUser(c *gc.C) {
    45  	s.readOnlyUser(c, params.RevokeOfferAccess)
    46  }
    47  
    48  func checkCall(c *gc.C, objType string, id, request string) {
    49  	c.Check(objType, gc.Equals, "ApplicationOffers")
    50  	c.Check(id, gc.Equals, "")
    51  	c.Check(request, gc.Equals, "ModifyOfferAccess")
    52  }
    53  
    54  func assertRequest(c *gc.C, a interface{}) params.ModifyOfferAccessRequest {
    55  	req, ok := a.(params.ModifyOfferAccessRequest)
    56  	c.Assert(ok, jc.IsTrue, gc.Commentf("wrong request type"))
    57  	return req
    58  }
    59  
    60  func assertResponse(c *gc.C, result interface{}) *params.ErrorResults {
    61  	resp, ok := result.(*params.ErrorResults)
    62  	c.Assert(ok, jc.IsTrue, gc.Commentf("wrong response type"))
    63  	return resp
    64  }
    65  
    66  func (s *accessSuite) readOnlyUser(c *gc.C, action params.OfferAction) {
    67  	apiCaller := basetesting.APICallerFunc(
    68  		func(objType string, version int, id, request string, a, result interface{}) error {
    69  			checkCall(c, objType, id, request)
    70  
    71  			req := assertRequest(c, a)
    72  			c.Assert(req.Changes, gc.HasLen, 1)
    73  			c.Assert(string(req.Changes[0].Action), gc.Equals, string(action))
    74  			c.Assert(string(req.Changes[0].Access), gc.Equals, string(params.OfferReadAccess))
    75  			c.Assert(req.Changes[0].OfferURL, gc.Equals, someOffer)
    76  
    77  			resp := assertResponse(c, result)
    78  			*resp = params.ErrorResults{Results: []params.ErrorResult{{Error: nil}}}
    79  
    80  			return nil
    81  		})
    82  	client := applicationoffers.NewClient(apiCaller)
    83  	err := accessCall(client, action, "bob", "read", someOffer)
    84  	c.Assert(err, jc.ErrorIsNil)
    85  }
    86  
    87  func (s *accessSuite) TestGrantOfferAdminUser(c *gc.C) {
    88  	s.adminUser(c, params.GrantOfferAccess)
    89  }
    90  
    91  func (s *accessSuite) TestRevokeOfferAdminUser(c *gc.C) {
    92  	s.adminUser(c, params.RevokeOfferAccess)
    93  }
    94  
    95  func (s *accessSuite) adminUser(c *gc.C, action params.OfferAction) {
    96  	apiCaller := basetesting.APICallerFunc(
    97  		func(objType string, version int, id, request string, a, result interface{}) error {
    98  			checkCall(c, objType, id, request)
    99  
   100  			req := assertRequest(c, a)
   101  			c.Assert(req.Changes, gc.HasLen, 1)
   102  			c.Assert(string(req.Changes[0].Action), gc.Equals, string(action))
   103  			c.Assert(string(req.Changes[0].Access), gc.Equals, string(params.OfferConsumeAccess))
   104  			c.Assert(req.Changes[0].OfferURL, gc.Equals, someOffer)
   105  
   106  			resp := assertResponse(c, result)
   107  			*resp = params.ErrorResults{Results: []params.ErrorResult{{Error: nil}}}
   108  
   109  			return nil
   110  		})
   111  	client := applicationoffers.NewClient(apiCaller)
   112  	err := accessCall(client, action, "bob", "consume", someOffer)
   113  	c.Assert(err, jc.ErrorIsNil)
   114  }
   115  
   116  func (s *accessSuite) TestGrantThreeOffers(c *gc.C) {
   117  	s.threeOffers(c, params.GrantOfferAccess)
   118  }
   119  
   120  func (s *accessSuite) TestRevokeThreeOffers(c *gc.C) {
   121  	s.threeOffers(c, params.RevokeOfferAccess)
   122  }
   123  
   124  func (s *accessSuite) threeOffers(c *gc.C, action params.OfferAction) {
   125  	apiCaller := basetesting.APICallerFunc(
   126  		func(objType string, version int, id, request string, a, result interface{}) error {
   127  			checkCall(c, objType, id, request)
   128  
   129  			req := assertRequest(c, a)
   130  			c.Assert(req.Changes, gc.HasLen, 3)
   131  			for i := range req.Changes {
   132  				c.Assert(string(req.Changes[i].Action), gc.Equals, string(action))
   133  				c.Assert(string(req.Changes[i].Access), gc.Equals, string(params.OfferReadAccess))
   134  				c.Assert(req.Changes[i].OfferURL, gc.Equals, someOffer)
   135  			}
   136  
   137  			resp := assertResponse(c, result)
   138  			*resp = params.ErrorResults{Results: []params.ErrorResult{{Error: nil}, {Error: nil}, {Error: nil}}}
   139  
   140  			return nil
   141  		})
   142  	client := applicationoffers.NewClient(apiCaller)
   143  	err := accessCall(client, action, "carol", "read", someOffer, someOffer, someOffer)
   144  	c.Assert(err, jc.ErrorIsNil)
   145  }
   146  
   147  func (s *accessSuite) TestGrantErrorResult(c *gc.C) {
   148  	s.errorResult(c, params.GrantOfferAccess)
   149  }
   150  
   151  func (s *accessSuite) TestRevokeErrorResult(c *gc.C) {
   152  	s.errorResult(c, params.RevokeOfferAccess)
   153  }
   154  
   155  func (s *accessSuite) errorResult(c *gc.C, action params.OfferAction) {
   156  	apiCaller := basetesting.APICallerFunc(
   157  		func(objType string, version int, id, request string, a, result interface{}) error {
   158  			checkCall(c, objType, id, request)
   159  
   160  			req := assertRequest(c, a)
   161  			c.Assert(req.Changes, gc.HasLen, 1)
   162  			c.Assert(string(req.Changes[0].Action), gc.Equals, string(action))
   163  			c.Assert(req.Changes[0].UserTag, gc.Equals, names.NewUserTag("aaa").String())
   164  			c.Assert(req.Changes[0].OfferURL, gc.Equals, someOffer)
   165  
   166  			resp := assertResponse(c, result)
   167  			err := &params.Error{Message: "unfortunate mishap"}
   168  			*resp = params.ErrorResults{Results: []params.ErrorResult{{Error: err}}}
   169  
   170  			return nil
   171  		})
   172  	client := applicationoffers.NewClient(apiCaller)
   173  	err := accessCall(client, action, "aaa", "consume", someOffer)
   174  	c.Assert(err, gc.ErrorMatches, "unfortunate mishap")
   175  }
   176  
   177  func (s *accessSuite) TestInvalidResultCount(c *gc.C) {
   178  	apiCaller := basetesting.APICallerFunc(
   179  		func(objType string, version int, id, request string, a, result interface{}) error {
   180  			checkCall(c, objType, id, request)
   181  			assertRequest(c, a)
   182  
   183  			resp := assertResponse(c, result)
   184  			*resp = params.ErrorResults{Results: nil}
   185  
   186  			return nil
   187  		})
   188  	client := applicationoffers.NewClient(apiCaller)
   189  	err := client.GrantOffer("bob", "consume", someOffer, someOffer)
   190  	c.Assert(err, gc.ErrorMatches, "expected 2 results, got 0")
   191  }