Skip to content

Commit

Permalink
feat: add ClientCredentialError
Browse files Browse the repository at this point in the history
  • Loading branch information
Quentin Brosse committed Nov 5, 2019
1 parent 2afa274 commit 4175976
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 42 deletions.
2 changes: 1 addition & 1 deletion internal/e2e/errors_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
)

func TestStandardErrors(t *testing.T) {
client, _, err := newE2EClient(true)
client, _, _, err := newE2EClient(true)
testhelpers.AssertNoError(t, err)

t.Run("not found", func(t *testing.T) {
Expand Down
16 changes: 8 additions & 8 deletions internal/e2e/human_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,46 +8,46 @@ import (
"github.com/scaleway/scaleway-sdk-go/scw"
)

func newE2EClient(withAuthInClient bool) (*test.API, string, error) {
func newE2EClient(withAuthInClient bool) (*test.API, string, string, error) {
client, err := scw.NewClient(
scw.WithoutAuth(),
scw.WithDefaultRegion(scw.RegionFrPar),
scw.WithUserAgent("sdk-e2e-test"),
)
if err != nil {
return nil, "", err
return nil, "", "", err
}
testClient := test.NewAPI(client)

registerResponse, err := testClient.Register(&test.RegisterRequest{
Username: "sidi",
})
if err != nil {
return nil, "", err
return nil, "", "", err
}
if withAuthInClient {
client, err = scw.NewClient(
scw.WithDefaultRegion(scw.RegionFrPar),
scw.WithAuth("", registerResponse.SecretKey),
scw.WithAuth(registerResponse.AccessKey, registerResponse.SecretKey),
scw.WithUserAgent("sdk-e2e-test"),
)
testClient = test.NewAPI(client)
}

return testClient, registerResponse.SecretKey, err
return testClient, registerResponse.AccessKey, registerResponse.SecretKey, err
}

func TestAuthInRequest(t *testing.T) {
client, secretKey, err := newE2EClient(false)
client, accessKey, secretKey, err := newE2EClient(false)
testhelpers.AssertNoError(t, err)

requestWithAuth := scw.WithAuthRequest("", secretKey)
requestWithAuth := scw.WithAuthRequest(accessKey, secretKey)
_, err = client.CreateHuman(&test.CreateHumanRequest{}, requestWithAuth)
testhelpers.AssertNoError(t, err)
}

func TestHuman(t *testing.T) {
client, _, err := newE2EClient(true)
client, _, _, err := newE2EClient(true)
testhelpers.AssertNoError(t, err)

// create
Expand Down
11 changes: 10 additions & 1 deletion scw/client_option.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,16 @@ func (s *settings) apply(opts []ClientOption) {
func (s *settings) validate() error {
var err error
if s.token == nil {
return errors.New("no credential option provided")
return &ClientCredentialError{Type: clientCredentialError_NoOption}
}

if token, isToken := s.token.(*auth.Token); isToken {
if token.AccessKey == "" {
return &ClientCredentialError{Type: clientCredentialError_EmptyAccessKey}
}
if token.SecretKey == "" {
return &ClientCredentialError{Type: clientCredentialError_EmptySecreyKey}
}
}

_, err = url.Parse(s.apiURL)
Expand Down
80 changes: 48 additions & 32 deletions scw/client_option_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ const (

var (
defaultOrganizationID = "6170692e-7363-616c-6577-61792e636f6d" // hint: | xxd -ps -r
defaultRegion = RegionNlAms
defaultZone = ZoneNlAms1
defaultRegion = RegionNlAms
defaultZone = ZoneNlAms1
)

func TestClientOptions(t *testing.T) {
Expand All @@ -37,12 +37,28 @@ func TestClientOptions(t *testing.T) {
},
},
{
name: "Should throw an credential error",
name: "Should throw a no credential option provided",
clientOption: func(s *settings) {
s.apiURL = apiURL
},
errStr: "scaleway-sdk-go: no credential option provided",
},
{
name: "Should throw a access key error",
clientOption: func(s *settings) {
s.apiURL = apiURL
s.token = auth.NewToken("", testSecretKey)
},
errStr: "scaleway-sdk-go: access key cannot be empty",
},
{
name: "Should throw a secret key error",
clientOption: func(s *settings) {
s.apiURL = apiURL
s.token = auth.NewToken(testSecretKey, "")
},
errStr: "scaleway-sdk-go: secret key cannot be empty",
},
{
name: "Should throw an url error",
clientOption: func(s *settings) {
Expand Down Expand Up @@ -107,56 +123,56 @@ func TestCombinedClientOptions(t *testing.T) {
env map[string]string
files map[string]string

expectedError string
expectedAccessKey string
expectedSecretKey string
expectedAPIURL string
expectedError string
expectedAccessKey string
expectedSecretKey string
expectedAPIURL string
expectedDefaultOrganizationID *string
expectedDefaultRegion *Region
expectedDefaultZone *Zone
expectedDefaultRegion *Region
expectedDefaultZone *Zone
}{
{
name: "Complete config file with env variables",
env: map[string]string{
"HOME": "{HOME}",
scwAccessKeyEnv: v2ValidAccessKey2,
scwSecretKeyEnv: v2ValidSecretKey2,
scwAPIURLEnv: v2ValidAPIURL2,
"HOME": "{HOME}",
scwAccessKeyEnv: v2ValidAccessKey2,
scwSecretKeyEnv: v2ValidSecretKey2,
scwAPIURLEnv: v2ValidAPIURL2,
scwDefaultOrganizationIDEnv: v2ValidDefaultOrganizationID2,
scwDefaultRegionEnv: v2ValidDefaultRegion2,
scwDefaultZoneEnv: v2ValidDefaultZone2,
scwDefaultRegionEnv: v2ValidDefaultRegion2,
scwDefaultZoneEnv: v2ValidDefaultZone2,
},
files: map[string]string{
".config/scw/config.yaml": v2CompleteValidConfigFile,
},
expectedAccessKey: v2ValidAccessKey2,
expectedSecretKey: v2ValidSecretKey2,
expectedAPIURL: v2ValidAPIURL2,
expectedAccessKey: v2ValidAccessKey2,
expectedSecretKey: v2ValidSecretKey2,
expectedAPIURL: v2ValidAPIURL2,
expectedDefaultOrganizationID: s(v2ValidDefaultOrganizationID2),
expectedDefaultRegion: r(Region(v2ValidDefaultRegion2)),
expectedDefaultZone: z(Zone(v2ValidDefaultZone2)),
expectedDefaultRegion: r(Region(v2ValidDefaultRegion2)),
expectedDefaultZone: z(Zone(v2ValidDefaultZone2)),
},
{
name: "Complete config with active profile env variable and all env variables",
env: map[string]string{
"HOME": "{HOME}",
scwActiveProfileEnv: v2ValidProfile,
scwAccessKeyEnv: v2ValidAccessKey,
scwSecretKeyEnv: v2ValidSecretKey,
scwAPIURLEnv: v2ValidAPIURL,
"HOME": "{HOME}",
scwActiveProfileEnv: v2ValidProfile,
scwAccessKeyEnv: v2ValidAccessKey,
scwSecretKeyEnv: v2ValidSecretKey,
scwAPIURLEnv: v2ValidAPIURL,
scwDefaultOrganizationIDEnv: v2ValidDefaultOrganizationID,
scwDefaultRegionEnv: v2ValidDefaultRegion,
scwDefaultZoneEnv: v2ValidDefaultZone,
scwDefaultRegionEnv: v2ValidDefaultRegion,
scwDefaultZoneEnv: v2ValidDefaultZone,
},
files: map[string]string{
".config/scw/config.yaml": v2CompleteValidConfigFile,
},
expectedAccessKey: v2ValidAccessKey,
expectedSecretKey: v2ValidSecretKey,
expectedAPIURL: v2ValidAPIURL,
expectedAccessKey: v2ValidAccessKey,
expectedSecretKey: v2ValidSecretKey,
expectedAPIURL: v2ValidAPIURL,
expectedDefaultOrganizationID: s(v2ValidDefaultOrganizationID),
expectedDefaultRegion: r(Region(v2ValidDefaultRegion)),
expectedDefaultZone: z(Zone(v2ValidDefaultZone)),
expectedDefaultRegion: r(Region(v2ValidDefaultRegion)),
expectedDefaultZone: z(Zone(v2ValidDefaultZone)),
},
}

Expand Down
19 changes: 19 additions & 0 deletions scw/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,3 +255,22 @@ func (e *OutOfStockError) Error() string {
func (e *OutOfStockError) GetRawBody() json.RawMessage {
return e.RawBody
}

type clientCredentialErrorType string

const (
clientCredentialError_NoOption = clientCredentialErrorType("no credential option provided")
clientCredentialError_EmptyAccessKey = clientCredentialErrorType("access key cannot be empty")
clientCredentialError_EmptySecreyKey = clientCredentialErrorType("secret key cannot be empty")
)

// clientCredentialError indicates that credentials have been badly provided for the client creation.
type ClientCredentialError struct {
Type clientCredentialErrorType
}

// IsScwSdkError implements the SdkError interface
func (e ClientCredentialError) IsScwSdkError() {}
func (e ClientCredentialError) Error() string {
return fmt.Sprintf("scaleway-sdk-go: %s", e.Type)
}

0 comments on commit 4175976

Please sign in to comment.