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 := ¶ms.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 }