package config import ( "os" "path/filepath" "strings" "testing" "logging-system/logsys" "logging-system/sink" ) func TestLoadEnvOverridesFile(t *testing.T) { dir := t.TempDir() path := filepath.Join(dir, "log.json") raw := []byte(`{ "service": "from-file", "level": "debug", "modules": {"engine": "trace"}, "redaction": {"enabled": true}, "sinks": [{"type": "console", "format": "json", "level": "warn"}] }`) if err := os.WriteFile(path, raw, 0o644); err != nil { t.Fatal(err) } t.Setenv("LOGSYS_LEVEL", "error") t.Setenv("LOGSYS_SERVICE", "from-env") t.Setenv("LOGSYS_REDACT", "off") cfg, err := Load(path) if err != nil { t.Fatal(err) } if cfg.Level != "error" || cfg.Service != "from-env" || cfg.Redaction.Enabled { t.Fatalf("%+v", cfg) } if cfg.Modules["engine"] != "trace" || cfg.Trace.Header != "X-Trace-Id" { t.Fatalf("%+v", cfg) } log, err := Build(cfg) if err != nil { t.Fatal(err) } mem := &sink.Memory{} log2 := logsys.New(logsys.Options{Service: cfg.Service, Level: logsys.LevelError, Sinks: []logsys.Sink{mem}}) log2.Info("skip") log2.Error("keep", nil) if len(mem.Snapshot()) != 1 { t.Fatal(mem.Snapshot()) } if err := log.Close(); err != nil { t.Fatal(err) } } func TestBuildFileSink(t *testing.T) { dir := t.TempDir() cfg := Defaults() cfg.Sinks = []SinkConfig{{ Type: "file", Path: filepath.Join(dir, "app.jsonl"), Format: "json", Rotation: &RotationConfig{MaxBytes: 1024, Keep: 2}, }} log, err := Build(cfg) if err != nil { t.Fatal(err) } log.Info("hello", "token", "sk-abcdefghijklmnopqrstuvwxyz") if err := log.Sync(); err != nil { t.Fatal(err) } if err := log.Close(); err != nil { t.Fatal(err) } data, err := os.ReadFile(filepath.Join(dir, "app.jsonl")) if err != nil { t.Fatal(err) } if string(data) == "" || strings.Contains(string(data), "sk-abcdefghijklmnopqrstuvwxyz") { t.Fatalf("redaction failed: %s", data) } }