package main import ( "bytes" "encoding/json" "strings" "testing" ) func TestRunVersionJSON(t *testing.T) { var stdout bytes.Buffer var stderr bytes.Buffer if err := runWithIO(t.Context(), []string{"version", "-json"}, &stdout, &stderr); err != nil { t.Fatalf("runWithIO() error = %v; stderr = %s", err, stderr.String()) } var output versionOutput if err := json.Unmarshal(stdout.Bytes(), &output); err != nil { t.Fatalf("parse JSON: %v", err) } if output.GatewayProtocolVersion == 0 || output.WorkerProtocolVersion == 0 { t.Fatalf("protocol versions were not populated: %+v", output) } } func TestCommonOptionsRedactsAPIKey(t *testing.T) { options, err := (&commonOptions{ Endpoint: "localhost:5000", APIKey: "mxgw_super_secret", Plaintext: true, CallTimeout: "2s", }).resolved() if err != nil { t.Fatalf("resolved() error = %v", err) } data, err := json.Marshal(options) if err != nil { t.Fatalf("marshal options: %v", err) } if strings.Contains(string(data), "super_secret") { t.Fatalf("redacted JSON leaked API key: %s", data) } if !strings.Contains(string(data), "mxgw") { t.Fatalf("redacted JSON did not preserve key shape: %s", data) } } func TestRunBatchEmitsEORAfterVersion(t *testing.T) { var stdout bytes.Buffer var stderr bytes.Buffer in := strings.NewReader("version --json\n") if err := runBatch(t.Context(), in, &stdout, &stderr); err != nil { t.Fatalf("runBatch() error = %v; stderr = %s", err, stderr.String()) } out := stdout.String() if !strings.Contains(out, "\n"+batchEOR+"\n") && !strings.HasSuffix(out, batchEOR+"\n") { t.Fatalf("expected EOR marker %q in stdout; got: %q", batchEOR, out) } idx := strings.Index(out, batchEOR) if idx <= 0 { t.Fatalf("EOR marker not found or appeared before any output: %q", out) } payload := out[:idx] var output versionOutput if err := json.Unmarshal([]byte(payload), &output); err != nil { t.Fatalf("parse JSON block before EOR: %v (payload=%q)", err, payload) } if output.GatewayProtocolVersion == 0 || output.WorkerProtocolVersion == 0 { t.Fatalf("protocol versions were not populated: %+v", output) } } func TestParseValueBuildsTypedValue(t *testing.T) { value, err := parseValue("int32", "123") if err != nil { t.Fatalf("parseValue() error = %v", err) } if got := value.GetInt32Value(); got != 123 { t.Fatalf("int32 value = %d, want 123", got) } }