github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/agent/credentialvalidator/credentialvalidator_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package credentialvalidator_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/testing" 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 "gopkg.in/juju/names.v2" 12 13 "github.com/juju/juju/apiserver/common" 14 "github.com/juju/juju/apiserver/facades/agent/credentialvalidator" 15 "github.com/juju/juju/apiserver/params" 16 apiservertesting "github.com/juju/juju/apiserver/testing" 17 "github.com/juju/juju/state" 18 coretesting "github.com/juju/juju/testing" 19 ) 20 21 type CredentialValidatorSuite struct { 22 coretesting.BaseSuite 23 24 resources *common.Resources 25 authorizer apiservertesting.FakeAuthorizer 26 backend *testBackend 27 28 api *credentialvalidator.CredentialValidatorAPI 29 } 30 31 var _ = gc.Suite(&CredentialValidatorSuite{}) 32 33 func (s *CredentialValidatorSuite) SetUpTest(c *gc.C) { 34 s.BaseSuite.SetUpTest(c) 35 s.backend = newMockBackend() 36 37 s.resources = common.NewResources() 38 s.authorizer = apiservertesting.FakeAuthorizer{ 39 Tag: names.NewMachineTag("0"), 40 } 41 s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() }) 42 43 api, err := credentialvalidator.NewCredentialValidatorAPIForTest(s.backend, s.resources, s.authorizer) 44 c.Assert(err, jc.ErrorIsNil) 45 s.api = api 46 } 47 48 func (s *CredentialValidatorSuite) TestModelCredential(c *gc.C) { 49 result, err := s.api.ModelCredential() 50 c.Assert(err, jc.ErrorIsNil) 51 c.Assert(result, gc.DeepEquals, params.ModelCredential{ 52 Model: names.NewModelTag(modelUUID).String(), 53 Exists: true, 54 CloudCredential: credentialTag.String(), 55 Valid: true, 56 }) 57 } 58 59 func (s *CredentialValidatorSuite) TestModelCredentialNotNeeded(c *gc.C) { 60 s.backend.mc.Exists = false 61 s.backend.mc.Credential = names.CloudCredentialTag{} 62 s.backend.mc.Valid = false 63 result, err := s.api.ModelCredential() 64 c.Assert(err, jc.ErrorIsNil) 65 c.Assert(result, gc.DeepEquals, params.ModelCredential{Model: names.NewModelTag(modelUUID).String()}) 66 } 67 68 func (s *CredentialValidatorSuite) TestWatchCredential(c *gc.C) { 69 result, err := s.api.WatchCredential(params.Entity{credentialTag.String()}) 70 c.Assert(err, jc.ErrorIsNil) 71 c.Assert(result, gc.DeepEquals, params.NotifyWatchResult{"1", nil}) 72 c.Assert(s.resources.Count(), gc.Equals, 1) 73 } 74 75 func (s *CredentialValidatorSuite) TestWatchCredentialNotUsedInThisModel(c *gc.C) { 76 s.backend.isUsed = false 77 _, err := s.api.WatchCredential(params.Entity{credentialTag.String()}) 78 c.Assert(err, gc.ErrorMatches, common.ErrPerm.Error()) 79 c.Assert(s.resources.Count(), gc.Equals, 0) 80 } 81 82 func (s *CredentialValidatorSuite) TestWatchCredentialInvalidTag(c *gc.C) { 83 _, err := s.api.WatchCredential(params.Entity{"my-tag"}) 84 c.Assert(err, gc.ErrorMatches, `"my-tag" is not a valid tag`) 85 c.Assert(s.resources.Count(), gc.Equals, 0) 86 } 87 88 func (s *CredentialValidatorSuite) TestInvalidateModelCredential(c *gc.C) { 89 result, err := s.api.InvalidateModelCredential(params.InvalidateCredentialArg{"not again"}) 90 c.Assert(err, jc.ErrorIsNil) 91 c.Assert(result, gc.DeepEquals, params.ErrorResult{}) 92 s.backend.CheckCalls(c, []testing.StubCall{ 93 {"InvalidateModelCredential", []interface{}{"not again"}}, 94 }) 95 } 96 97 func (s *CredentialValidatorSuite) TestInvalidateModelCredentialError(c *gc.C) { 98 expected := errors.New("boom") 99 s.backend.SetErrors(expected) 100 result, err := s.api.InvalidateModelCredential(params.InvalidateCredentialArg{"not again"}) 101 c.Assert(err, jc.ErrorIsNil) 102 c.Assert(result, gc.DeepEquals, params.ErrorResult{Error: common.ServerError(expected)}) 103 s.backend.CheckCalls(c, []testing.StubCall{ 104 {"InvalidateModelCredential", []interface{}{"not again"}}, 105 }) 106 } 107 108 func (s *CredentialValidatorSuite) TestWatchModelCredential(c *gc.C) { 109 result, err := s.api.WatchModelCredential() 110 c.Assert(err, jc.ErrorIsNil) 111 c.Assert(result, gc.DeepEquals, params.NotifyWatchResult{"1", nil}) 112 c.Assert(s.resources.Count(), gc.Equals, 1) 113 } 114 115 func (s *CredentialValidatorSuite) TestWatchModelCredentialError(c *gc.C) { 116 s.backend.SetErrors(errors.New("no nope niet")) 117 _, err := s.api.WatchModelCredential() 118 c.Assert(err, gc.ErrorMatches, "no nope niet") 119 c.Assert(s.resources.Count(), gc.Equals, 0) 120 } 121 122 // modelUUID is the model tag we're using in the tests. 123 var modelUUID = "01234567-89ab-cdef-0123-456789abcdef" 124 125 // credentialTag is the credential tag we're using in the tests. 126 // needs to fit fmt.Sprintf("%s/%s/%s", cloudName, userName, credentialName) 127 var credentialTag = names.NewCloudCredentialTag("cloud/user/credential") 128 129 func newMockBackend() *testBackend { 130 b := &testBackend{ 131 Stub: &testing.Stub{}, 132 isUsed: true, 133 mc: &credentialvalidator.ModelCredential{ 134 Model: names.NewModelTag(modelUUID), 135 Exists: true, 136 Credential: credentialTag, 137 Valid: true, 138 }, 139 } 140 return b 141 } 142 143 type testBackend struct { 144 *testing.Stub 145 146 mc *credentialvalidator.ModelCredential 147 isUsed bool 148 } 149 150 func (b *testBackend) ModelCredential() (*credentialvalidator.ModelCredential, error) { 151 b.AddCall("ModelCredential") 152 if err := b.NextErr(); err != nil { 153 return nil, err 154 } 155 return b.mc, nil 156 } 157 158 func (b *testBackend) ModelUsesCredential(tag names.CloudCredentialTag) (bool, error) { 159 b.AddCall("ModelUsesCredential", tag) 160 if err := b.NextErr(); err != nil { 161 return false, err 162 } 163 return b.isUsed, nil 164 } 165 166 func (b *testBackend) WatchCredential(t names.CloudCredentialTag) state.NotifyWatcher { 167 b.AddCall("WatchCredential", t) 168 return apiservertesting.NewFakeNotifyWatcher() 169 } 170 171 func (b *testBackend) InvalidateModelCredential(reason string) error { 172 b.AddCall("InvalidateModelCredential", reason) 173 return b.NextErr() 174 } 175 176 func (b *testBackend) WatchModelCredential() (state.NotifyWatcher, error) { 177 b.AddCall("WatchModelCredential") 178 if err := b.NextErr(); err != nil { 179 return nil, err 180 } 181 return apiservertesting.NewFakeNotifyWatcher(), nil 182 }