package config import ( "flag" "testing" ) func bind(t *testing.T, args ...string) (*Config, error) { t.Helper() fs := flag.NewFlagSet("t", flag.ContinueOnError) c, err := Bind(fs) if err != nil { return nil, err } if err := fs.Parse(args); err != nil { t.Fatal(err) } return c, nil } func TestBindDefaults(t *testing.T) { c, err := bind(t) if err != nil || *c != Default() { t.Fatalf("got %+v, %v", c, err) } } func TestBindEnvAndFlagPrecedence(t *testing.T) { t.Setenv("WH_SEED", "42") t.Setenv("WH_TICKS_PER_DAY", "720") t.Setenv("WH_ASTEROIDS", "60") c, err := bind(t) if err != nil { t.Fatal(err) } if c.Seed != 42 || c.TicksPerDay != 720 || c.AsteroidCount != 60 || c.CyclesPerTick != Default().CyclesPerTick { t.Fatalf("env not applied: %+v", c) } if err := c.Validate(); err != nil { t.Fatal(err) } c, err = bind(t, "-seed", "7") if err != nil || c.Seed != 7 || c.TicksPerDay != 720 { t.Fatalf("flag should override env only for itself: %+v, %v", c, err) } } func TestBindRejectsBadEnv(t *testing.T) { for _, v := range []string{"lots", "-3", "1.5"} { t.Setenv("WH_SEED", v) if _, err := bind(t); err == nil { t.Errorf("WH_SEED=%q should be rejected", v) } } t.Setenv("WH_SEED", "") t.Setenv("WH_COMM_BYTES", "big") if _, err := bind(t); err == nil { t.Error("WH_COMM_BYTES=big should be rejected") } } func TestDatabaseURL(t *testing.T) { t.Setenv("DATABASE_URL", "") if DatabaseURL() != "sqlite:wh.db" { t.Fatal("default") } t.Setenv("DATABASE_URL", "postgres://x") if DatabaseURL() != "postgres://x" { t.Fatal("env") } }