package gemini import ( "fmt" "testing" "github.com/tidwall/gjson" ) func TestConvertGeminiRequestToAntigravity_PreserveValidSignature(t *testing.T) { // Valid signature on functionCall should be preserved validSignature := "abc123validSignature1234567890123456789012345678901234567890" inputJSON := []byte(fmt.Sprintf(`{ "model": "gemini-3-pro-preview", "contents": [ { "role": "model", "parts": [ {"functionCall": {"name": "test_tool", "args": {}}, "thoughtSignature": "%s"} ] } ] }`, validSignature)) output := ConvertGeminiRequestToAntigravity("gemini-3-pro-preview", inputJSON, false) outputStr := string(output) // Check that valid thoughtSignature is preserved parts := gjson.Get(outputStr, "request.contents.0.parts").Array() if len(parts) != 1 { t.Fatalf("Expected 1 part, got %d", len(parts)) } sig := parts[0].Get("thoughtSignature").String() if sig != validSignature { t.Errorf("Expected thoughtSignature '%s', got '%s'", validSignature, sig) } } func TestConvertGeminiRequestToAntigravity_AddSkipSentinelToFunctionCall(t *testing.T) { // functionCall without signature should get skip_thought_signature_validator inputJSON := []byte(`{ "model": "gemini-3-pro-preview", "contents": [ { "role": "model", "parts": [ {"functionCall": {"name": "test_tool", "args": {}}} ] } ] }`) output := ConvertGeminiRequestToAntigravity("gemini-3-pro-preview", inputJSON, false) outputStr := string(output) // Check that skip_thought_signature_validator is added to functionCall sig := gjson.Get(outputStr, "request.contents.0.parts.0.thoughtSignature").String() expectedSig := "skip_thought_signature_validator" if sig != expectedSig { t.Errorf("Expected skip sentinel '%s', got '%s'", expectedSig, sig) } } func TestConvertGeminiRequestToAntigravity_ParallelFunctionCalls(t *testing.T) { // Multiple functionCalls should all get skip_thought_signature_validator inputJSON := []byte(`{ "model": "gemini-3-pro-preview", "contents": [ { "role": "model", "parts": [ {"functionCall": {"name": "tool_one", "args": {"a": "1"}}}, {"functionCall": {"name": "tool_two", "args": {"b": "2"}}} ] } ] }`) output := ConvertGeminiRequestToAntigravity("gemini-3-pro-preview", inputJSON, false) outputStr := string(output) parts := gjson.Get(outputStr, "request.contents.0.parts").Array() if len(parts) != 2 { t.Fatalf("Expected 2 parts, got %d", len(parts)) } expectedSig := "skip_thought_signature_validator" for i, part := range parts { sig := part.Get("thoughtSignature").String() if sig != expectedSig { t.Errorf("Part %d: Expected '%s', got '%s'", i, expectedSig, sig) } } }