83 lines
2.4 KiB
Go
83 lines
2.4 KiB
Go
package config_test
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"cmbuyer/admin/internal/config"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
func TestLoad(t *testing.T) {
|
|
hash, err := bcrypt.GenerateFromPassword([]byte("test-password"), bcrypt.MinCost)
|
|
if err != nil {
|
|
t.Fatalf("generate bcrypt hash: %v", err)
|
|
}
|
|
|
|
values := map[string]string{
|
|
"CMBUYER_ADMIN_USERNAME": "admin",
|
|
"CMBUYER_ADMIN_PASSWORD_BCRYPT": string(hash),
|
|
"CMBUYER_SESSION_SECRET": strings.Repeat("s", 32),
|
|
"CMBUYER_COOKIE_SECURE": "true",
|
|
}
|
|
|
|
got, err := config.Load(lookup(values))
|
|
if err != nil {
|
|
t.Fatalf("Load: %v", err)
|
|
}
|
|
if got.AdminUsername != "admin" || !got.CookieSecure {
|
|
t.Fatalf("Load returned unexpected public configuration: %#v", got)
|
|
}
|
|
}
|
|
|
|
func TestLoadRejectsMissingOrInvalidConfiguration(t *testing.T) {
|
|
hash, err := bcrypt.GenerateFromPassword([]byte("test-password"), bcrypt.MinCost)
|
|
if err != nil {
|
|
t.Fatalf("generate bcrypt hash: %v", err)
|
|
}
|
|
|
|
base := map[string]string{
|
|
"CMBUYER_ADMIN_USERNAME": "admin",
|
|
"CMBUYER_ADMIN_PASSWORD_BCRYPT": string(hash),
|
|
"CMBUYER_SESSION_SECRET": strings.Repeat("s", 32),
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
mutate func(map[string]string)
|
|
want string
|
|
}{
|
|
{"missing username", func(values map[string]string) { delete(values, "CMBUYER_ADMIN_USERNAME") }, "CMBUYER_ADMIN_USERNAME"},
|
|
{"invalid bcrypt", func(values map[string]string) { values["CMBUYER_ADMIN_PASSWORD_BCRYPT"] = "not-a-bcrypt-hash" }, "CMBUYER_ADMIN_PASSWORD_BCRYPT"},
|
|
{"short secret", func(values map[string]string) { values["CMBUYER_SESSION_SECRET"] = "short" }, "CMBUYER_SESSION_SECRET"},
|
|
{"invalid secure flag", func(values map[string]string) { values["CMBUYER_COOKIE_SECURE"] = "1" }, "CMBUYER_COOKIE_SECURE"},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
values := copyValues(base)
|
|
test.mutate(values)
|
|
_, err := config.Load(lookup(values))
|
|
if err == nil || !strings.Contains(err.Error(), test.want) {
|
|
t.Fatalf("Load error = %v, want mention of %s", err, test.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func lookup(values map[string]string) func(string) (string, bool) {
|
|
return func(key string) (string, bool) {
|
|
value, ok := values[key]
|
|
return value, ok
|
|
}
|
|
}
|
|
|
|
func copyValues(values map[string]string) map[string]string {
|
|
copy := make(map[string]string, len(values))
|
|
for key, value := range values {
|
|
copy[key] = value
|
|
}
|
|
return copy
|
|
}
|