github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/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/juju/osenv"
    12  	"github.com/juju/juju/jujuclient"
    13  	"github.com/juju/juju/testing"
    14  )
    15  
    16  type CredentialsSuite struct {
    17  	testing.FakeJujuXDGDataHomeSuite
    18  	store       jujuclient.CredentialStore
    19  	cloudName   string
    20  	credentials cloud.CloudCredential
    21  }
    22  
    23  var _ = gc.Suite(&CredentialsSuite{})
    24  
    25  func (s *CredentialsSuite) SetUpTest(c *gc.C) {
    26  	s.FakeJujuXDGDataHomeSuite.SetUpTest(c)
    27  	s.store = jujuclient.NewFileCredentialStore()
    28  	s.cloudName = "testcloud"
    29  	s.credentials = cloud.CloudCredential{
    30  		DefaultCredential: "peter",
    31  		DefaultRegion:     "east",
    32  		AuthCredentials: map[string]cloud.Credential{
    33  			"peter": cloud.NewCredential(cloud.AccessKeyAuthType, nil),
    34  			"paul":  cloud.NewCredential(cloud.AccessKeyAuthType, nil),
    35  		},
    36  	}
    37  }
    38  
    39  func (s *CredentialsSuite) TestCredentialForCloudNoFile(c *gc.C) {
    40  	found, err := s.store.CredentialForCloud(s.cloudName)
    41  	c.Assert(err, gc.ErrorMatches, "credentials for cloud testcloud not found")
    42  	c.Assert(found, gc.IsNil)
    43  }
    44  
    45  func (s *CredentialsSuite) TestCredentialForCloudNoneExists(c *gc.C) {
    46  	writeTestCredentialsFile(c)
    47  	found, err := s.store.CredentialForCloud(s.cloudName)
    48  	c.Assert(err, gc.ErrorMatches, "credentials for cloud testcloud not found")
    49  	c.Assert(found, gc.IsNil)
    50  }
    51  
    52  func (s *CredentialsSuite) TestCredentialForCloud(c *gc.C) {
    53  	name := firstTestCloudName(c)
    54  	found, err := s.store.CredentialForCloud(name)
    55  	c.Assert(err, jc.ErrorIsNil)
    56  	expected := s.getCredentials(c)[name]
    57  	c.Assert(found, gc.DeepEquals, &expected)
    58  }
    59  
    60  func (s *CredentialsSuite) TestUpdateCredentialAddFirst(c *gc.C) {
    61  	err := s.store.UpdateCredential(s.cloudName, s.credentials)
    62  	c.Assert(err, jc.ErrorIsNil)
    63  	s.assertUpdateSucceeded(c)
    64  }
    65  
    66  func (s *CredentialsSuite) TestUpdateCredentialAddNew(c *gc.C) {
    67  	s.assertCredentialsNotExists(c)
    68  	err := s.store.UpdateCredential(s.cloudName, s.credentials)
    69  	c.Assert(err, jc.ErrorIsNil)
    70  	s.assertUpdateSucceeded(c)
    71  }
    72  
    73  func (s *CredentialsSuite) TestUpdateCredential(c *gc.C) {
    74  	s.cloudName = firstTestCloudName(c)
    75  
    76  	err := s.store.UpdateCredential(s.cloudName, s.credentials)
    77  	c.Assert(err, jc.ErrorIsNil)
    78  	s.assertUpdateSucceeded(c)
    79  }
    80  
    81  func (s *CredentialsSuite) TestUpdateCredentialRemovesDefaultIfNecessary(c *gc.C) {
    82  	origHome := osenv.SetJujuXDGDataHome(c.MkDir())
    83  	s.AddCleanup(func(*gc.C) { osenv.SetJujuXDGDataHome(origHome) })
    84  
    85  	s.cloudName = firstTestCloudName(c)
    86  
    87  	store := jujuclient.NewFileCredentialStore()
    88  	err := store.UpdateCredential(s.cloudName, s.credentials)
    89  	c.Assert(err, jc.ErrorIsNil)
    90  	newCreds := s.credentials
    91  	// "peter" is the default credential
    92  	delete(newCreds.AuthCredentials, "peter")
    93  	err = store.UpdateCredential(s.cloudName, newCreds)
    94  	c.Assert(err, jc.ErrorIsNil)
    95  	creds, err := store.AllCredentials()
    96  	c.Assert(err, jc.ErrorIsNil)
    97  	c.Assert(creds[s.cloudName].DefaultCredential, gc.Equals, "")
    98  }
    99  
   100  func (s *CredentialsSuite) assertCredentialsNotExists(c *gc.C) {
   101  	all := writeTestCredentialsFile(c)
   102  	_, exists := all[s.cloudName]
   103  	c.Assert(exists, jc.IsFalse)
   104  }
   105  
   106  func (s *CredentialsSuite) assertUpdateSucceeded(c *gc.C) {
   107  	c.Assert(s.getCredentials(c)[s.cloudName], gc.DeepEquals, s.credentials)
   108  }
   109  
   110  func (s *CredentialsSuite) getCredentials(c *gc.C) map[string]cloud.CloudCredential {
   111  	credentials, err := s.store.AllCredentials()
   112  	c.Assert(err, jc.ErrorIsNil)
   113  	return credentials
   114  }
   115  
   116  func firstTestCloudName(c *gc.C) string {
   117  	all := writeTestCredentialsFile(c)
   118  	for key, _ := range all {
   119  		return key
   120  	}
   121  	return ""
   122  }