Files
wxapp-guantong/backend/internal/config/config_test.go
T
2026-09-22 22:51:19 +08:00

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)
}
}