mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-28 05:46:36 +08:00
208 lines
5.4 KiB
Go
208 lines
5.4 KiB
Go
// Copyright 2026 Arctel.net
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
package config_test
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"Wavelet/plugins/infra/config"
|
|
)
|
|
|
|
const sampleYAML = "" +
|
|
"app:\n addr: \":8000\"\n node_id: 1\n" +
|
|
"database:\n enabled: false\n port: 5432\n slow_threshold: 200ms\n" +
|
|
"redis:\n addrs:\n - \"127.0.0.1:6379\"\n"
|
|
|
|
func writeConfig(t *testing.T, body string) string {
|
|
t.Helper()
|
|
|
|
path := filepath.Join(t.TempDir(), "config.yaml")
|
|
require.NoError(t, os.WriteFile(path, []byte(body), 0o600))
|
|
return path
|
|
}
|
|
|
|
func TestSourceLooksUpNestedPaths(t *testing.T) {
|
|
src, err := config.NewSource(config.WithPath(writeConfig(t, sampleYAML)))
|
|
require.NoError(t, err)
|
|
|
|
value, ok := src.Lookup("database.port")
|
|
require.True(t, ok)
|
|
assert.Equal(t, 5432, value)
|
|
|
|
_, ok = src.Lookup("database.missing")
|
|
assert.False(t, ok)
|
|
}
|
|
|
|
func TestSourceKeepsZeroValuedKeysDistinctFromMissing(t *testing.T) {
|
|
src, err := config.NewSource(config.WithPath(writeConfig(t, sampleYAML)))
|
|
require.NoError(t, err)
|
|
|
|
value, ok := src.Lookup("database.enabled")
|
|
require.True(t, ok, "an explicitly set false must not look like a missing key")
|
|
assert.Equal(t, false, value)
|
|
}
|
|
|
|
func TestSourceTreatsUnsetFileAsEnvOnly(t *testing.T) {
|
|
missing := filepath.Join(t.TempDir(), "absent.yaml")
|
|
|
|
src, err := config.NewSource(config.WithPath(missing))
|
|
require.NoError(t, err, "a missing configuration file must fall back to environment values")
|
|
|
|
_, ok := src.Lookup("app.addr")
|
|
assert.False(t, ok)
|
|
assert.Equal(t, config.EnvOnlyOrigin, src.Describe())
|
|
}
|
|
|
|
func TestSourceRejectsMalformedFile(t *testing.T) {
|
|
src, err := config.NewSource(config.WithPath(writeConfig(t, "app: [unclosed\n")))
|
|
|
|
assert.Nil(t, src)
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "infra/config")
|
|
}
|
|
|
|
func TestSourceLookupEnvReadsProcessEnvironment(t *testing.T) {
|
|
t.Setenv("WAVELET_SOURCE_PROBE", "present")
|
|
|
|
src, err := config.NewSource(config.WithPath(writeConfig(t, sampleYAML)))
|
|
require.NoError(t, err)
|
|
|
|
value, ok := src.LookupEnv("WAVELET_SOURCE_PROBE")
|
|
require.True(t, ok)
|
|
assert.Equal(t, "present", value)
|
|
|
|
_, ok = src.LookupEnv("WAVELET_SOURCE_ABSENT")
|
|
assert.False(t, ok)
|
|
}
|
|
|
|
func TestSourcePrefersConfigPathEnvironmentVariable(t *testing.T) {
|
|
t.Setenv("CONFIG_PATH", writeConfig(t, "app:\n addr: \":9100\"\n"))
|
|
|
|
src, err := config.NewSource()
|
|
require.NoError(t, err)
|
|
|
|
value, ok := src.Lookup("app.addr")
|
|
require.True(t, ok)
|
|
assert.Equal(t, ":9100", value)
|
|
}
|
|
|
|
func TestSourceFindsManifestConfigInParentDirectory(t *testing.T) {
|
|
tempRoot := t.TempDir()
|
|
manifestConfigDir := filepath.Join(tempRoot, "manifest", "config")
|
|
require.NoError(t, os.MkdirAll(manifestConfigDir, 0o755))
|
|
require.NoError(t, os.WriteFile(
|
|
filepath.Join(manifestConfigDir, "config.yaml"),
|
|
[]byte("app:\n addr: \":9200\"\n"),
|
|
0o600,
|
|
))
|
|
|
|
subDir := filepath.Join(tempRoot, "backend", "cmd")
|
|
require.NoError(t, os.MkdirAll(subDir, 0o755))
|
|
|
|
origWd, err := os.Getwd()
|
|
require.NoError(t, err)
|
|
require.NoError(t, os.Chdir(subDir))
|
|
t.Cleanup(func() {
|
|
_ = os.Chdir(origWd)
|
|
})
|
|
|
|
t.Setenv("CONFIG_PATH", "")
|
|
|
|
src, err := config.NewSource()
|
|
require.NoError(t, err)
|
|
value, ok := src.Lookup("app.addr")
|
|
require.True(t, ok)
|
|
assert.Equal(t, ":9200", value)
|
|
}
|
|
|
|
func TestSourceDefaultConfigMergedWithOverride(t *testing.T) {
|
|
tempRoot := t.TempDir()
|
|
manifestConfigDir := filepath.Join(tempRoot, "manifest", "config")
|
|
require.NoError(t, os.MkdirAll(manifestConfigDir, 0o755))
|
|
|
|
// 1. Write default configuration
|
|
require.NoError(t, os.WriteFile(
|
|
filepath.Join(manifestConfigDir, "config.default.yaml"),
|
|
[]byte("app:\n addr: \":8000\"\n node_id: 1\n env: \"development\"\n"),
|
|
0o600,
|
|
))
|
|
|
|
// 2. Write override configuration (only overrides addr)
|
|
require.NoError(t, os.WriteFile(
|
|
filepath.Join(manifestConfigDir, "config.yaml"),
|
|
[]byte("app:\n addr: \":9500\"\n"),
|
|
0o600,
|
|
))
|
|
|
|
subDir := filepath.Join(tempRoot, "backend")
|
|
require.NoError(t, os.MkdirAll(subDir, 0o755))
|
|
|
|
origWd, err := os.Getwd()
|
|
require.NoError(t, err)
|
|
require.NoError(t, os.Chdir(subDir))
|
|
t.Cleanup(func() {
|
|
_ = os.Chdir(origWd)
|
|
})
|
|
|
|
t.Setenv("CONFIG_PATH", "")
|
|
|
|
src, err := config.NewSource()
|
|
require.NoError(t, err)
|
|
|
|
// Overridden by config.yaml
|
|
addr, ok := src.Lookup("app.addr")
|
|
require.True(t, ok)
|
|
assert.Equal(t, ":9500", addr)
|
|
|
|
// Retained from config.default.yaml
|
|
nodeID, ok := src.Lookup("app.node_id")
|
|
require.True(t, ok)
|
|
assert.Equal(t, 1, nodeID)
|
|
|
|
envVal, ok := src.Lookup("app.env")
|
|
require.True(t, ok)
|
|
assert.Equal(t, "development", envVal)
|
|
}
|
|
|
|
func TestSourceDefaultConfigUsedWhenOverrideAbsent(t *testing.T) {
|
|
tempRoot := t.TempDir()
|
|
manifestConfigDir := filepath.Join(tempRoot, "manifest", "config")
|
|
require.NoError(t, os.MkdirAll(manifestConfigDir, 0o755))
|
|
|
|
// Write only default configuration
|
|
require.NoError(t, os.WriteFile(
|
|
filepath.Join(manifestConfigDir, "config.default.yaml"),
|
|
[]byte("app:\n addr: \":8080\"\n env: \"testing\"\n"),
|
|
0o600,
|
|
))
|
|
|
|
subDir := filepath.Join(tempRoot, "backend")
|
|
require.NoError(t, os.MkdirAll(subDir, 0o755))
|
|
|
|
origWd, err := os.Getwd()
|
|
require.NoError(t, err)
|
|
require.NoError(t, os.Chdir(subDir))
|
|
t.Cleanup(func() {
|
|
_ = os.Chdir(origWd)
|
|
})
|
|
|
|
t.Setenv("CONFIG_PATH", "")
|
|
|
|
src, err := config.NewSource()
|
|
require.NoError(t, err)
|
|
|
|
addr, ok := src.Lookup("app.addr")
|
|
require.True(t, ok)
|
|
assert.Equal(t, ":8080", addr)
|
|
|
|
envVal, ok := src.Lookup("app.env")
|
|
require.True(t, ok)
|
|
assert.Equal(t, "testing", envVal)
|
|
}
|