- Introduced CORS configuration options in config.example.yaml, allowing specification of allowed origins for cross-origin requests. - Enhanced the aggregate handler to support response caching with a configurable TTL, improving performance for repeated requests. - Updated the aggregate API to return a structured response indicating whether any upstream requests failed, enhancing error handling and response clarity. - Modified documentation in AGGREGATE.md and README.md to reflect the new CORS and caching features. - Added tests to validate the new functionality in the aggregate handler.
117 lines
2.3 KiB
Go
117 lines
2.3 KiB
Go
package config
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestLoadExample(t *testing.T) {
|
|
dir := t.TempDir()
|
|
p := filepath.Join(dir, "cfg.yaml")
|
|
if err := os.WriteFile(p, []byte(`
|
|
listen: ":0"
|
|
allow_all: true
|
|
servers:
|
|
- alias: main_srv
|
|
base_url: http://127.0.0.1:9091
|
|
`), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
c, err := Load(p)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if c.Listen != ":0" {
|
|
t.Fatalf("listen: %q", c.Listen)
|
|
}
|
|
_, err = c.Parse()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestParseCIDRorIP(t *testing.T) {
|
|
for _, tc := range []struct {
|
|
in string
|
|
want string
|
|
}{
|
|
{"87.103.241.8", "87.103.241.8/32"},
|
|
{"87.103.241.8/32", "87.103.241.8/32"},
|
|
{"10.0.0.0/8", "10.0.0.0/8"},
|
|
{"2001:db8::1", "2001:db8::1/128"},
|
|
} {
|
|
p, err := parseCIDROrIP(tc.in)
|
|
if err != nil {
|
|
t.Fatalf("%q: %v", tc.in, err)
|
|
}
|
|
if p.String() != tc.want {
|
|
t.Fatalf("%q: got %s want %s", tc.in, p, tc.want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestValidateDuplicateAlias(t *testing.T) {
|
|
c := &Config{
|
|
Servers: []Server{
|
|
{Alias: "a", BaseURL: "http://x:1"},
|
|
{Alias: "a", BaseURL: "http://y:2"},
|
|
},
|
|
}
|
|
if err := c.Validate(); err == nil {
|
|
t.Fatal("expected error")
|
|
}
|
|
}
|
|
|
|
func TestValidateReservedAggAlias(t *testing.T) {
|
|
c := &Config{
|
|
Servers: []Server{
|
|
{Alias: "agg", BaseURL: "http://x:1"},
|
|
},
|
|
}
|
|
if err := c.Validate(); err == nil {
|
|
t.Fatal("expected error for reserved alias agg")
|
|
}
|
|
}
|
|
|
|
func TestValidateAggregateIncludeAliases(t *testing.T) {
|
|
c := &Config{
|
|
Servers: []Server{
|
|
{Alias: "a", BaseURL: "http://x:1"},
|
|
},
|
|
Aggregate: &AggregateConfig{
|
|
IncludeAliases: []string{"a"},
|
|
},
|
|
}
|
|
if err := c.Validate(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
c2 := &Config{
|
|
Servers: []Server{
|
|
{Alias: "a", BaseURL: "http://x:1"},
|
|
},
|
|
Aggregate: &AggregateConfig{
|
|
IncludeAliases: []string{"nope"},
|
|
},
|
|
}
|
|
if err := c2.Validate(); err == nil {
|
|
t.Fatal("expected error for unknown include alias")
|
|
}
|
|
}
|
|
|
|
func TestValidateAggregateCacheTTL(t *testing.T) {
|
|
c := &Config{
|
|
Servers: []Server{
|
|
{Alias: "a", BaseURL: "http://x:1"},
|
|
},
|
|
Aggregate: &AggregateConfig{CacheTTLMs: 60001},
|
|
}
|
|
if err := c.Validate(); err == nil {
|
|
t.Fatal("expected error for cache_ttl_ms > 60000")
|
|
}
|
|
c.Aggregate.CacheTTLMs = 1000
|
|
if err := c.Validate(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|