Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package config | |
import ( | |
"fmt" | |
"os" | |
"testing" | |
"github.com/stretchr/testify/assert" | |
"github.com/stretchr/testify/require" | |
) | |
func TestConfig(t *testing.T) { | |
t.Run("invalid DefaultVectorDistanceMetric", func(t *testing.T) { | |
moduleProvider := &fakeModuleProvider{ | |
valid: []string{"text2vec-contextionary"}, | |
} | |
config := Config{ | |
DefaultVectorizerModule: "text2vec-contextionary", | |
DefaultVectorDistanceMetric: "euclidean", | |
} | |
err := config.Validate(moduleProvider) | |
assert.EqualError( | |
t, | |
err, | |
"default vector distance metric: must be one of [\"cosine\", \"dot\", \"l2-squared\", \"manhattan\",\"hamming\"]", | |
) | |
}) | |
t.Run("invalid DefaultVectorizerModule", func(t *testing.T) { | |
moduleProvider := &fakeModuleProvider{ | |
valid: []string{"text2vec-contextionary"}, | |
} | |
config := Config{ | |
DefaultVectorizerModule: "contextionary", | |
DefaultVectorDistanceMetric: "cosine", | |
} | |
err := config.Validate(moduleProvider) | |
assert.EqualError( | |
t, | |
err, | |
"default vectorizer module: invalid vectorizer \"contextionary\"", | |
) | |
}) | |
t.Run("all valid configurations", func(t *testing.T) { | |
moduleProvider := &fakeModuleProvider{ | |
valid: []string{"text2vec-contextionary"}, | |
} | |
config := Config{ | |
DefaultVectorizerModule: "text2vec-contextionary", | |
DefaultVectorDistanceMetric: "l2-squared", | |
} | |
err := config.Validate(moduleProvider) | |
assert.Nil(t, err, "should not error") | |
}) | |
t.Run("without DefaultVectorDistanceMetric", func(t *testing.T) { | |
moduleProvider := &fakeModuleProvider{ | |
valid: []string{"text2vec-contextionary"}, | |
} | |
config := Config{ | |
DefaultVectorizerModule: "text2vec-contextionary", | |
} | |
err := config.Validate(moduleProvider) | |
assert.Nil(t, err, "should not error") | |
}) | |
t.Run("with none DefaultVectorizerModule", func(t *testing.T) { | |
moduleProvider := &fakeModuleProvider{ | |
valid: []string{"text2vec-contextionary"}, | |
} | |
config := Config{ | |
DefaultVectorizerModule: "none", | |
} | |
err := config.Validate(moduleProvider) | |
assert.Nil(t, err, "should not error") | |
}) | |
t.Run("parse config.yaml file", func(t *testing.T) { | |
configFileName := "config.yaml" | |
configYaml := `authentication: | |
apikey: | |
enabled: true | |
allowed_keys: | |
- api-key-1 | |
users: | |
- [email protected]` | |
filepath := fmt.Sprintf("%s/%s", t.TempDir(), configFileName) | |
f, err := os.Create(filepath) | |
require.Nil(t, err) | |
defer f.Close() | |
_, err2 := f.WriteString(configYaml) | |
require.Nil(t, err2) | |
file, err := os.ReadFile(filepath) | |
require.Nil(t, err) | |
weaviateConfig := &WeaviateConfig{} | |
config, err := weaviateConfig.parseConfigFile(file, configFileName) | |
require.Nil(t, err) | |
assert.True(t, config.Authentication.APIKey.Enabled) | |
assert.ElementsMatch(t, []string{"api-key-1"}, config.Authentication.APIKey.AllowedKeys) | |
assert.ElementsMatch(t, []string{"[email protected]"}, config.Authentication.APIKey.Users) | |
}) | |
t.Run("parse config.yaml file with admin_list and read_only_users", func(t *testing.T) { | |
configFileName := "config.yaml" | |
configYaml := `authorization: | |
admin_list: | |
enabled: true | |
users: | |
- userA | |
read_only_users: | |
- [email protected] | |
- [email protected]` | |
filepath := fmt.Sprintf("%s/%s", t.TempDir(), configFileName) | |
f, err := os.Create(filepath) | |
require.Nil(t, err) | |
defer f.Close() | |
_, err2 := f.WriteString(configYaml) | |
require.Nil(t, err2) | |
file, err := os.ReadFile(filepath) | |
require.Nil(t, err) | |
weaviateConfig := &WeaviateConfig{} | |
config, err := weaviateConfig.parseConfigFile(file, configFileName) | |
require.Nil(t, err) | |
assert.True(t, config.Authorization.AdminList.Enabled) | |
assert.ElementsMatch(t, []string{"userA"}, config.Authorization.AdminList.Users) | |
assert.ElementsMatch(t, []string{"[email protected]", "[email protected]"}, config.Authorization.AdminList.ReadOnlyUsers) | |
}) | |
t.Run("parse config.yaml file multiple keys and users", func(t *testing.T) { | |
configFileName := "config.yaml" | |
configYaml := `authentication: | |
apikey: | |
enabled: true | |
allowed_keys: | |
- api-key-1 | |
- api-key-2 | |
- api-key-3 | |
users: | |
- [email protected] | |
- [email protected]` | |
filepath := fmt.Sprintf("%s/%s", t.TempDir(), configFileName) | |
f, err := os.Create(filepath) | |
require.Nil(t, err) | |
defer f.Close() | |
_, err2 := f.WriteString(configYaml) | |
require.Nil(t, err2) | |
file, err := os.ReadFile(filepath) | |
require.Nil(t, err) | |
weaviateConfig := &WeaviateConfig{} | |
config, err := weaviateConfig.parseConfigFile(file, configFileName) | |
require.Nil(t, err) | |
assert.True(t, config.Authentication.APIKey.Enabled) | |
assert.ElementsMatch(t, []string{"api-key-1", "api-key-2", "api-key-3"}, config.Authentication.APIKey.AllowedKeys) | |
assert.ElementsMatch(t, []string{"[email protected]", "[email protected]"}, config.Authentication.APIKey.Users) | |
}) | |
} | |