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 }