119 lines
3.2 KiB
Go
119 lines
3.2 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestLoadReadsAdminAuthFromDotEnv(t *testing.T) {
|
|
restoreEnv := clearAdminEnv(t)
|
|
restoreWorkingDir := chdir(t, t.TempDir())
|
|
t.Cleanup(restoreEnv)
|
|
t.Cleanup(restoreWorkingDir)
|
|
|
|
if err := os.WriteFile(".env", []byte("GUAHAO_ADMIN_AUTH_MODE=none\nGUAHAO_ADMIN_PASSWORD_CHANGE_REDIRECT_URL=https://gh.yqbmb.com/admin/price-inquiries\nGUAHAO_OIDC_CLIENT_SECRET='local-secret'\n"), 0o600); err != nil {
|
|
t.Fatalf("write .env: %v", err)
|
|
}
|
|
|
|
cfg := Load()
|
|
if cfg.AdminAuthMode != "none" {
|
|
t.Fatalf("AdminAuthMode = %q, want none", cfg.AdminAuthMode)
|
|
}
|
|
if cfg.OIDCClientSecret != "local-secret" {
|
|
t.Fatalf("OIDCClientSecret = %q, want local-secret", cfg.OIDCClientSecret)
|
|
}
|
|
if cfg.AdminPasswordChangeRedirectURL != "https://gh.yqbmb.com/admin/price-inquiries" {
|
|
t.Fatalf("AdminPasswordChangeRedirectURL = %q, want production price inquiries URL", cfg.AdminPasswordChangeRedirectURL)
|
|
}
|
|
}
|
|
|
|
func TestValidateAdminAuthNoneDoesNotRequireOIDC(t *testing.T) {
|
|
restoreEnv := clearAdminEnv(t)
|
|
restoreWorkingDir := chdir(t, t.TempDir())
|
|
t.Cleanup(restoreEnv)
|
|
t.Cleanup(restoreWorkingDir)
|
|
|
|
cfg := Config{AdminAuthMode: AdminAuthModeNone}
|
|
if err := cfg.ValidateAdminAuth(); err != nil {
|
|
t.Fatalf("ValidateAdminAuth() error = %v, want nil", err)
|
|
}
|
|
}
|
|
|
|
func TestValidateAdminAuthOIDCRequiresConfiguration(t *testing.T) {
|
|
cfg := Config{AdminAuthMode: AdminAuthModeOIDC}
|
|
if err := cfg.ValidateAdminAuth(); err == nil {
|
|
t.Fatal("ValidateAdminAuth() error = nil, want missing OIDC configuration error")
|
|
}
|
|
|
|
cfg = Config{
|
|
AdminAuthMode: AdminAuthModeOIDC,
|
|
AdminSessionSecret: "session-secret",
|
|
OIDCIssuer: "https://auth.example.com/oidc",
|
|
OIDCClientID: "client-id",
|
|
OIDCClientSecret: "client-secret",
|
|
OIDCRedirectURI: "http://127.0.0.1:9800/admin/oidc/callback",
|
|
}
|
|
if err := cfg.ValidateAdminAuth(); err != nil {
|
|
t.Fatalf("ValidateAdminAuth() error = %v, want nil", err)
|
|
}
|
|
}
|
|
|
|
func clearAdminEnv(t *testing.T) func() {
|
|
t.Helper()
|
|
keys := []string{
|
|
"GUAHAO_ADMIN_AUTH_MODE",
|
|
"GUAHAO_ADMIN_SESSION_SECRET",
|
|
"GUAHAO_ADMIN_PASSWORD_CHANGE_REDIRECT_URL",
|
|
"GUAHAO_WECHAT_APPID",
|
|
"GUAHAO_WECHAT_SECRET",
|
|
"GUAHAO_WECHAT_API_BASE",
|
|
"GUAHAO_OIDC_ISSUER",
|
|
"GUAHAO_OIDC_CLIENT_ID",
|
|
"GUAHAO_OIDC_CLIENT_SECRET",
|
|
"GUAHAO_OIDC_REDIRECT_URI",
|
|
"GUAHAO_OIDC_SCOPES",
|
|
"GUAHAO_ENV_FILE",
|
|
}
|
|
type previous struct {
|
|
value string
|
|
ok bool
|
|
}
|
|
previousValues := make(map[string]previous, len(keys))
|
|
for _, key := range keys {
|
|
value, ok := os.LookupEnv(key)
|
|
previousValues[key] = previous{value: value, ok: ok}
|
|
if err := os.Unsetenv(key); err != nil {
|
|
t.Fatalf("unset %s: %v", key, err)
|
|
}
|
|
}
|
|
return func() {
|
|
for _, key := range keys {
|
|
prev := previousValues[key]
|
|
if prev.ok {
|
|
_ = os.Setenv(key, prev.value)
|
|
} else {
|
|
_ = os.Unsetenv(key)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func chdir(t *testing.T, dir string) func() {
|
|
t.Helper()
|
|
abs, err := filepath.Abs(dir)
|
|
if err != nil {
|
|
t.Fatalf("resolve temp dir: %v", err)
|
|
}
|
|
previous, err := os.Getwd()
|
|
if err != nil {
|
|
t.Fatalf("get working dir: %v", err)
|
|
}
|
|
if err := os.Chdir(abs); err != nil {
|
|
t.Fatalf("chdir: %v", err)
|
|
}
|
|
return func() {
|
|
_ = os.Chdir(previous)
|
|
}
|
|
}
|