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  }