github.com/anthropics/anthropic-sdk-go@v1.70.1/internal/apijson/decodecustom_test.go (about)

     1  package apijson_test
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  
     7  	"github.com/anthropics/anthropic-sdk-go/internal/apijson"
     8  )
     9  
    10  // A type that looks apijson-native but opts out via UnmarshalAPIJSON,
    11  // so its custom UnmarshalJSON must run even when nested.
    12  type optedOut struct {
    13  	Name string `json:"name"`
    14  	ran  bool
    15  	paramObject
    16  }
    17  
    18  func (o *optedOut) UnmarshalAPIJSON(data []byte) error { return o.UnmarshalJSON(data) }
    19  func (o *optedOut) UnmarshalJSON(data []byte) error {
    20  	o.ran = true
    21  	return apijson.UnmarshalRoot(data, o)
    22  }
    23  
    24  type optedOutHolder struct {
    25  	Inner optedOut `json:"inner"`
    26  	paramObject
    27  }
    28  
    29  func (h *optedOutHolder) UnmarshalJSON(data []byte) error { return apijson.UnmarshalRoot(data, h) }
    30  
    31  func TestCustomUnmarshalerRunsWhenNested(t *testing.T) {
    32  	var h optedOutHolder
    33  	if err := json.Unmarshal([]byte(`{"inner":{"name":"x"}}`), &h); err != nil {
    34  		t.Fatal(err)
    35  	}
    36  	if !h.Inner.ran || h.Inner.Name != "x" {
    37  		t.Fatalf("nested UnmarshalJSON was bypassed despite the UnmarshalAPIJSON opt-out: %#v", h.Inner)
    38  	}
    39  }