76 lines
2.8 KiB
Go
76 lines
2.8 KiB
Go
package config_test
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.yuntuo.hk/k2safe/go-omni/config"
|
|
apierrors "git.yuntuo.hk/k2safe/go-omni/errors"
|
|
"git.yuntuo.hk/k2safe/go-omni/logx"
|
|
)
|
|
|
|
func TestCatalogConfigFiles(t *testing.T) {
|
|
for _, file := range []struct{ name, body string }{
|
|
{"server.json", `{"response":{"codeType":"int64","successCode":0,"errorCode":9999},"errors":{"defaultStatus":200,"definitions":{"LIMIT":{"code":9223372036854775807,"message":"limit"}}}}`},
|
|
{"server.yaml", "response:\n codeType: int64\n successCode: 0\n errorCode: 9999\nerrors:\n defaultStatus: 200\n definitions:\n LIMIT:\n code: 9223372036854775807\n message: limit\n"},
|
|
} {
|
|
t.Run(file.name, func(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), file.name)
|
|
if err := os.WriteFile(path, []byte(file.body), 0600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
cfg, err := config.LoadFile(path, "CATALOG_FIXTURE_")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
e := apierrors.MustRegistry(cfg.Errors).Resolve(apierrors.ByCode("LIMIT"))
|
|
if e.Status != 200 || e.BusinessCode != int64(9223372036854775807) {
|
|
t.Fatal(e)
|
|
}
|
|
})
|
|
}
|
|
for _, body := range []string{
|
|
`{"errors":{"definitions":{"A":{"message":"a","code":1},"A":{"message":"b","code":2}}}}`,
|
|
`{"response":{"codeType":"int32","successCode":0,"errorCode":99},"errors":{"definitions":{"A":{"message":"a","code":2147483648}}}}`,
|
|
`{"errors":{"definitions":{"A":{"message":"a","code":"a","status":204}}}}`,
|
|
} {
|
|
path := filepath.Join(t.TempDir(), "bad.json")
|
|
if err := os.WriteFile(path, []byte(body), 0600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, err := config.LoadFile(path, "CATALOG_FIXTURE_"); err == nil {
|
|
t.Fatal("accepted invalid catalog", body)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestCatalogReloadSnapshotIsolation(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "config.json")
|
|
original := `{"errors":{"defaultStatus":200,"definitions":{"invalid":{"code":"invalid","message":"original"}}}}`
|
|
if err := os.WriteFile(path, []byte(original), 0600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
logger, err := logx.New(logx.Default())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer logger.Close()
|
|
reloader, err := config.NewReloader(path, "CATALOG_RELOAD_", logger)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
snapshot := reloader.Snapshot()
|
|
snapshot.Errors.Definitions["invalid"] = apierrors.Definition{Message: "changed"}
|
|
if reloader.Snapshot().Errors.Definitions["invalid"].Message != "original" {
|
|
t.Fatal("snapshot changed live catalog")
|
|
}
|
|
if err := os.WriteFile(path, []byte(strings.Replace(original, "original", "new message", 1)), 0600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := reloader.Reload(); err == nil || reloader.Snapshot().Errors.Definitions["invalid"].Message != "original" {
|
|
t.Fatal("catalog changed without restart", err)
|
|
}
|
|
}
|