package config_test import ( "os" "path/filepath" "testing" "gitea.auvem.com/go-toolkit/config" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) type testSchema struct { Name string `mapstructure:"name" validate:"required"` Port int `mapstructure:"port" validate:"required,min=1"` Extra string `mapstructure:"extra"` } func writeConfig(t *testing.T, dir, content string) { t.Helper() require.NoError(t, os.WriteFile(filepath.Join(dir, "app.yaml"), []byte(content), 0o644)) } func TestLoadAndC(t *testing.T) { dir := t.TempDir() writeConfig(t, dir, "name: svc\nport: 8080\n") m := config.NewManager[testSchema]("app", "yaml", dir) require.NoError(t, m.Load()) assert.Equal(t, "svc", m.C().Name) assert.Equal(t, 8080, m.Config().Port) } func TestPostLoadRevalidates(t *testing.T) { dir := t.TempDir() writeConfig(t, dir, "name: svc\nport: 8080\nextra: ok\n") m := config.NewManager[testSchema]("app", "yaml", dir).WithOpts(&config.ManagerOpts[testSchema]{ PostLoad: func(cfg *testSchema) error { cfg.Name = "" return nil }, }) err := m.Load() assert.Error(t, err) assert.Contains(t, err.Error(), "post-load") } func TestPostLoadSuccess(t *testing.T) { dir := t.TempDir() writeConfig(t, dir, "name: svc\nport: 8080\n") m := config.NewManager[testSchema]("app", "yaml", dir).WithOpts(&config.ManagerOpts[testSchema]{ PostLoad: func(cfg *testSchema) error { cfg.Extra = "derived" return nil }, }) require.NoError(t, m.Load()) assert.Equal(t, "derived", m.C().Extra) } func TestRootDir(t *testing.T) { dir := t.TempDir() marker := filepath.Join(dir, ".marker") require.NoError(t, os.WriteFile(marker, []byte("x"), 0o644)) orig, err := os.Getwd() require.NoError(t, err) t.Cleanup(func() { _ = os.Chdir(orig) }) sub := filepath.Join(dir, "sub") require.NoError(t, os.Mkdir(sub, 0o755)) require.NoError(t, os.Chdir(sub)) got, err := config.RootDir(".marker", 1) require.NoError(t, err) absDir, err := filepath.EvalSymlinks(dir) require.NoError(t, err) gotEval, err := filepath.EvalSymlinks(got) require.NoError(t, err) assert.Equal(t, absDir, gotEval) } func TestMustRootDirPanics(t *testing.T) { assert.Panics(t, func() { config.MustRootDir("definitely-missing-marker-xyz", 0) }) }