package main import ( "os" "strings" "testing" "lingniu-vehicle-ingest/go/vehicle-gateway/internal/envelope" ) func TestNATSSinkConfigFromEnvUsesExplicitSubjects(t *testing.T) { t.Setenv("NATS_URL", "nats://172.17.111.56:4222") t.Setenv("NATS_SUBJECT_GB32960_RAW", "custom.raw.gb32960") t.Setenv("NATS_SUBJECT_JT808_RAW", "custom.raw.jt808") t.Setenv("NATS_SUBJECT_YUTONG_MQTT_RAW", "custom.raw.yutong") t.Setenv("NATS_SUBJECT_UNIFIED", "custom.unified") cfg := natsSinkConfigFromEnv() if got, want := cfg.URL, "nats://172.17.111.56:4222"; got != want { t.Fatalf("URL = %q, want %q", got, want) } if got, want := cfg.RawSubjects[envelope.ProtocolGB32960], "custom.raw.gb32960"; got != want { t.Fatalf("gb32960 subject = %q, want %q", got, want) } if got, want := cfg.RawSubjects[envelope.ProtocolJT808], "custom.raw.jt808"; got != want { t.Fatalf("jt808 subject = %q, want %q", got, want) } if got, want := cfg.RawSubjects[envelope.ProtocolYutongMQTT], "custom.raw.yutong"; got != want { t.Fatalf("yutong subject = %q, want %q", got, want) } if got, want := cfg.UnifiedSubject, "custom.unified"; got != want { t.Fatalf("unified subject = %q, want %q", got, want) } } func TestGatewayConfiguresIdentityLookupCacheTTL(t *testing.T) { source, err := os.ReadFile("main.go") if err != nil { t.Fatalf("read main.go: %v", err) } for _, want := range []string{"LookupCacheTTL", "IDENTITY_LOOKUP_CACHE_TTL_SECONDS"} { if !strings.Contains(string(source), want) { t.Fatalf("gateway should expose identity lookup cache ttl, missing %s", want) } } } func TestGatewayDefaultsTo100KConnectionCeiling(t *testing.T) { source, err := os.ReadFile("main.go") if err != nil { t.Fatalf("read main.go: %v", err) } if !strings.Contains(string(source), `envInt("TCP_MAX_CONNECTIONS", 120_000)`) { t.Fatal("gateway should default TCP_MAX_CONNECTIONS to a 100K-ready ceiling") } } func TestGatewayPassesMetricsRegistryToAsyncSink(t *testing.T) { source, err := os.ReadFile("main.go") if err != nil { t.Fatalf("read main.go: %v", err) } for _, want := range []string{ "buildSink(ctx, logger, registry)", "Metrics: registry", `Name: "nats"`, `Name: "kafka"`, } { if !strings.Contains(string(source), want) { t.Fatalf("gateway async sink metrics wiring missing %s", want) } } } func TestNATSSinkConfigFromEnvDefaultsToGoSubjects(t *testing.T) { t.Setenv("NATS_URL", "nats://172.17.111.56:4222") cfg := natsSinkConfigFromEnv() if got, want := cfg.RawSubjects[envelope.ProtocolGB32960], "vehicle.raw.go.gb32960.v1"; got != want { t.Fatalf("gb32960 subject = %q, want %q", got, want) } if got, want := cfg.RawSubjects[envelope.ProtocolJT808], "vehicle.raw.go.jt808.v1"; got != want { t.Fatalf("jt808 subject = %q, want %q", got, want) } if got, want := cfg.RawSubjects[envelope.ProtocolYutongMQTT], "vehicle.raw.go.yutong-mqtt.v1"; got != want { t.Fatalf("yutong subject = %q, want %q", got, want) } if got, want := cfg.UnifiedSubject, "vehicle.event.go.unified.v1"; got != want { t.Fatalf("unified subject = %q, want %q", got, want) } }