Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package apikey | |
import ( | |
"testing" | |
"github.com/stretchr/testify/assert" | |
"github.com/stretchr/testify/require" | |
"github.com/weaviate/weaviate/usecases/config" | |
) | |
func Test_APIKeyClient(t *testing.T) { | |
type test struct { | |
name string | |
config config.APIKey | |
expectConfigErr bool | |
expectConfigErrMsg string | |
validate func(t *testing.T, c *Client) | |
} | |
tests := []test{ | |
{ | |
name: "not enabled", | |
config: config.APIKey{ | |
Enabled: false, | |
}, | |
expectConfigErr: false, | |
}, | |
{ | |
name: "key, but no user", | |
config: config.APIKey{ | |
Enabled: true, | |
AllowedKeys: []string{"secret-key"}, | |
Users: []string{}, | |
}, | |
expectConfigErr: true, | |
expectConfigErrMsg: "need at least one user", | |
}, | |
{ | |
name: "zero length key", | |
config: config.APIKey{ | |
Enabled: true, | |
AllowedKeys: []string{""}, | |
Users: []string{"gooduser"}, | |
}, | |
expectConfigErr: true, | |
expectConfigErrMsg: "keys cannot have length 0", | |
}, | |
{ | |
name: "user, but no key", | |
config: config.APIKey{ | |
Enabled: true, | |
AllowedKeys: []string{}, | |
Users: []string{"johnnyBeAllowed"}, | |
}, | |
expectConfigErr: true, | |
expectConfigErrMsg: "need at least one valid allowed key", | |
}, | |
{ | |
name: "zero length user", | |
config: config.APIKey{ | |
Enabled: true, | |
AllowedKeys: []string{"secret-key"}, | |
Users: []string{""}, | |
}, | |
expectConfigErr: true, | |
expectConfigErrMsg: "users cannot have length 0", | |
}, | |
{ | |
name: "one user, one key", | |
config: config.APIKey{ | |
Enabled: true, | |
AllowedKeys: []string{"secret-key"}, | |
Users: []string{"mrRoboto"}, | |
}, | |
expectConfigErr: false, | |
validate: func(t *testing.T, c *Client) { | |
p, err := c.ValidateAndExtract("secret-key", nil) | |
require.Nil(t, err) | |
assert.Equal(t, "mrRoboto", p.Username) | |
_, err = c.ValidateAndExtract("", nil) | |
require.NotNil(t, err) | |
_, err = c.ValidateAndExtract("other-key", nil) | |
require.NotNil(t, err) | |
}, | |
}, | |
{ | |
// this is allowed, this means that all keys point to the same user for | |
// authZ purposes | |
name: "one user, multiple keys", | |
config: config.APIKey{ | |
Enabled: true, | |
AllowedKeys: []string{"secret-key", "another-secret-key", "third-key"}, | |
Users: []string{"jane"}, | |
}, | |
expectConfigErr: false, | |
validate: func(t *testing.T, c *Client) { | |
p, err := c.ValidateAndExtract("secret-key", nil) | |
require.Nil(t, err) | |
assert.Equal(t, "jane", p.Username) | |
p, err = c.ValidateAndExtract("another-secret-key", nil) | |
require.Nil(t, err) | |
assert.Equal(t, "jane", p.Username) | |
p, err = c.ValidateAndExtract("third-key", nil) | |
require.Nil(t, err) | |
assert.Equal(t, "jane", p.Username) | |
_, err = c.ValidateAndExtract("", nil) | |
require.NotNil(t, err) | |
_, err = c.ValidateAndExtract("other-key", nil) | |
require.NotNil(t, err) | |
}, | |
}, | |
{ | |
// this is allowed, this means that each key at pos i points to user at | |
// pos i for authZ purposes | |
name: "multiple user, multiple keys", | |
config: config.APIKey{ | |
Enabled: true, | |
AllowedKeys: []string{"secret-key", "another-secret-key", "third-key"}, | |
Users: []string{"jane", "jessica", "jennifer"}, | |
}, | |
expectConfigErr: false, | |
validate: func(t *testing.T, c *Client) { | |
p, err := c.ValidateAndExtract("secret-key", nil) | |
require.Nil(t, err) | |
assert.Equal(t, "jane", p.Username) | |
p, err = c.ValidateAndExtract("another-secret-key", nil) | |
require.Nil(t, err) | |
assert.Equal(t, "jessica", p.Username) | |
p, err = c.ValidateAndExtract("third-key", nil) | |
require.Nil(t, err) | |
assert.Equal(t, "jennifer", p.Username) | |
_, err = c.ValidateAndExtract("", nil) | |
require.NotNil(t, err) | |
_, err = c.ValidateAndExtract("other-key", nil) | |
require.NotNil(t, err) | |
}, | |
}, | |
{ | |
// this is invalid, the keys cannot be mapped to the users | |
name: "2 users, 3 keys", | |
config: config.APIKey{ | |
Enabled: true, | |
AllowedKeys: []string{"secret-key", "another-secret-key", "third-key"}, | |
Users: []string{"jane", "jessica"}, | |
}, | |
expectConfigErr: true, | |
expectConfigErrMsg: "length of users and keys must match, alternatively provide single user for all keys", | |
}, | |
} | |
for _, test := range tests { | |
t.Run(test.name, func(t *testing.T) { | |
c, err := New(config.Config{ | |
Authentication: config.Authentication{ | |
APIKey: test.config, | |
}, | |
}) | |
if test.expectConfigErr { | |
require.NotNil(t, err) | |
assert.Contains(t, err.Error(), test.expectConfigErrMsg) | |
return | |
} | |
if test.validate != nil { | |
test.validate(t, c) | |
} | |
}) | |
} | |
} | |