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