github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/jujuclient/credentials_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package jujuclient_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/juju/cloud"
    11  	"github.com/juju/juju/jujuclient"
    12  	"github.com/juju/juju/testing"
    13  )
    14  
    15  type CredentialsSuite struct {
    16  	testing.FakeJujuXDGDataHomeSuite
    17  	store       jujuclient.CredentialStore
    18  	cloudName   string
    19  	credentials cloud.CloudCredential
    20  }
    21  
    22  var _ = gc.Suite(&CredentialsSuite{})
    23  
    24  func (s *CredentialsSuite) SetUpTest(c *gc.C) {
    25  	s.FakeJujuXDGDataHomeSuite.SetUpTest(c)
    26  	s.store = jujuclient.NewFileCredentialStore()
    27  	s.cloudName = "testcloud"
    28  	s.credentials = cloud.CloudCredential{
    29  		DefaultCredential: "peter",
    30  		DefaultRegion:     "east",
    31  		AuthCredentials: map[string]cloud.Credential{
    32  			"peter": cloud.NewCredential(cloud.AccessKeyAuthType, nil),
    33  			"paul":  cloud.NewCredential(cloud.AccessKeyAuthType, nil),
    34  		},
    35  	}
    36  }
    37  
    38  func (s *CredentialsSuite) TestCredentialForCloudNoFile(c *gc.C) {
    39  	found, err := s.store.CredentialForCloud(s.cloudName)
    40  	c.Assert(err, gc.ErrorMatches, "credentials for cloud testcloud not found")
    41  	c.Assert(found, gc.IsNil)
    42  }
    43  
    44  func (s *CredentialsSuite) TestCredentialForCloudNoneExists(c *gc.C) {
    45  	writeTestCredentialsFile(c)
    46  	found, err := s.store.CredentialForCloud(s.cloudName)
    47  	c.Assert(err, gc.ErrorMatches, "credentials for cloud testcloud not found")
    48  	c.Assert(found, gc.IsNil)
    49  }
    50  
    51  func (s *CredentialsSuite) TestCredentialForCloud(c *gc.C) {
    52  	name := firstTestCloudName(c)
    53  	found, err := s.store.CredentialForCloud(name)
    54  	c.Assert(err, jc.ErrorIsNil)
    55  	expected := s.getCredentials(c)[name]
    56  	c.Assert(found, gc.DeepEquals, &expected)
    57  }
    58  
    59  func (s *CredentialsSuite) TestUpdateCredentialAddFirst(c *gc.C) {
    60  	err := s.store.UpdateCredential(s.cloudName, s.credentials)
    61  	c.Assert(err, jc.ErrorIsNil)
    62  	s.assertUpdateSucceeded(c)
    63  }
    64  
    65  func (s *CredentialsSuite) TestUpdateCredentialAddNew(c *gc.C) {
    66  	s.assertCredentialsNotExists(c)
    67  	err := s.store.UpdateCredential(s.cloudName, s.credentials)
    68  	c.Assert(err, jc.ErrorIsNil)
    69  	s.assertUpdateSucceeded(c)
    70  }
    71  
    72  func (s *CredentialsSuite) TestUpdateCredential(c *gc.C) {
    73  	s.cloudName = firstTestCloudName(c)
    74  
    75  	err := s.store.UpdateCredential(s.cloudName, s.credentials)
    76  	c.Assert(err, jc.ErrorIsNil)
    77  	s.assertUpdateSucceeded(c)
    78  }
    79  
    80  func (s *CredentialsSuite) TestUpdateCredentialRemovesDefaultIfNecessary(c *gc.C) {
    81  	s.cloudName = firstTestCloudName(c)
    82  
    83  	store := jujuclient.NewFileCredentialStore()
    84  	err := store.UpdateCredential(s.cloudName, s.credentials)
    85  	c.Assert(err, jc.ErrorIsNil)
    86  	newCreds := s.credentials
    87  	// "peter" is the default credential
    88  	delete(newCreds.AuthCredentials, "peter")
    89  	err = store.UpdateCredential(s.cloudName, newCreds)
    90  	c.Assert(err, jc.ErrorIsNil)
    91  	creds, err := store.AllCredentials()
    92  	c.Assert(err, jc.ErrorIsNil)
    93  	c.Assert(creds[s.cloudName].DefaultCredential, gc.Equals, "")
    94  }
    95  
    96  func (s *CredentialsSuite) TestUpdateCredentialRemovesCloudWhenNoCredentialLeft(c *gc.C) {
    97  	s.cloudName = firstTestCloudName(c)
    98  
    99  	store := jujuclient.NewFileCredentialStore()
   100  	err := store.UpdateCredential(s.cloudName, s.credentials)
   101  	c.Assert(err, jc.ErrorIsNil)
   102  
   103  	// delete all
   104  	err = store.UpdateCredential(s.cloudName, cloud.CloudCredential{})
   105  	c.Assert(err, jc.ErrorIsNil)
   106  
   107  	creds, err := store.AllCredentials()
   108  	c.Assert(err, jc.ErrorIsNil)
   109  
   110  	_, exists := creds[s.cloudName]
   111  	c.Assert(exists, jc.IsFalse)
   112  }
   113  
   114  func (s *CredentialsSuite) assertCredentialsNotExists(c *gc.C) {
   115  	all := writeTestCredentialsFile(c)
   116  	_, exists := all[s.cloudName]
   117  	c.Assert(exists, jc.IsFalse)
   118  }
   119  
   120  func (s *CredentialsSuite) assertUpdateSucceeded(c *gc.C) {
   121  	c.Assert(s.getCredentials(c)[s.cloudName], gc.DeepEquals, s.credentials)
   122  }
   123  
   124  func (s *CredentialsSuite) getCredentials(c *gc.C) map[string]cloud.CloudCredential {
   125  	credentials, err := s.store.AllCredentials()
   126  	c.Assert(err, jc.ErrorIsNil)
   127  	return credentials
   128  }
   129  
   130  func firstTestCloudName(c *gc.C) string {
   131  	all := writeTestCredentialsFile(c)
   132  	for key := range all {
   133  		return key
   134  	}
   135  	return ""
   136  }