github.com/hamba/avro/v2@v2.22.1-0.20240518180522-aff3955acf7d/codec_convertible_test.go (about)

     1  package avro_test
     2  
     3  import (
     4  	"bytes"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/hamba/avro/v2"
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestDecoder_ConvertiblePtr(t *testing.T) {
    14  	defer ConfigTeardown()
    15  
    16  	data := []byte{0x90, 0xb2, 0xae, 0xc3, 0xec, 0x5b}
    17  	schema := `{"type": "long", "logicalType": "timestamp-millis"}`
    18  	dec, err := avro.NewDecoder(schema, bytes.NewReader(data))
    19  	require.NoError(t, err)
    20  
    21  	var ts TestTimestampPtr
    22  	err = dec.Decode(&ts)
    23  
    24  	require.NoError(t, err)
    25  	want := TestTimestampPtr(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC))
    26  	assert.Equal(t, want, ts)
    27  }
    28  
    29  func TestDecoder_ConvertiblePtrPtr(t *testing.T) {
    30  	defer ConfigTeardown()
    31  
    32  	data := []byte{0x2, 0x90, 0xb2, 0xae, 0xc3, 0xec, 0x5b}
    33  	schema := `{"type" : ["null", {"type": "long", "logicalType": "timestamp-millis"}]}`
    34  	dec, err := avro.NewDecoder(schema, bytes.NewReader(data))
    35  	require.NoError(t, err)
    36  
    37  	var ts *TestTimestampPtr
    38  	err = dec.Decode(&ts)
    39  
    40  	require.NoError(t, err)
    41  	assert.NotNil(t, ts)
    42  	want := TestTimestampPtr(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC))
    43  	assert.Equal(t, want, *ts)
    44  }
    45  
    46  func TestDecoder_ConvertibleError(t *testing.T) {
    47  	defer ConfigTeardown()
    48  
    49  	data := []byte{0x90, 0xb2, 0xae, 0xc3, 0xec, 0x5b}
    50  	schema := `{"type": "long", "logicalType": "timestamp-millis"}`
    51  	dec, err := avro.NewDecoder(schema, bytes.NewReader(data))
    52  	require.NoError(t, err)
    53  
    54  	var ts *TestTimestampError
    55  	err = dec.Decode(&ts)
    56  
    57  	assert.Error(t, err)
    58  }
    59  
    60  func TestEncoder_Convertible(t *testing.T) {
    61  	defer ConfigTeardown()
    62  
    63  	schema := `{"type": "long", "logicalType": "timestamp-millis"}`
    64  	buf := bytes.NewBuffer([]byte{})
    65  	enc, err := avro.NewEncoder(schema, buf)
    66  	require.NoError(t, err)
    67  	ts := TestTimestamp(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC))
    68  
    69  	err = enc.Encode(ts)
    70  
    71  	require.NoError(t, err)
    72  	assert.Equal(t, []byte{0x90, 0xb2, 0xae, 0xc3, 0xec, 0x5b}, buf.Bytes())
    73  }
    74  
    75  func TestEncoder_ConvertiblePtr(t *testing.T) {
    76  	defer ConfigTeardown()
    77  
    78  	schema := `{"type" : ["null", {"type": "long", "logicalType": "timestamp-millis"}]}`
    79  	buf := bytes.NewBuffer([]byte{})
    80  	enc, err := avro.NewEncoder(schema, buf)
    81  	require.NoError(t, err)
    82  	ts := TestTimestampPtr(time.Date(2020, 01, 02, 03, 04, 05, 00, time.UTC))
    83  
    84  	err = enc.Encode(&ts)
    85  
    86  	require.NoError(t, err)
    87  	assert.Equal(t, []byte{0x2, 0x90, 0xb2, 0xae, 0xc3, 0xec, 0x5b}, buf.Bytes())
    88  }
    89  
    90  func TestEncoder_ConvertiblePtrNil(t *testing.T) {
    91  	defer ConfigTeardown()
    92  
    93  	schema := `{"type" : ["null", {"type": "long", "logicalType": "timestamp-millis"}]}`
    94  	buf := bytes.NewBuffer([]byte{})
    95  	enc, err := avro.NewEncoder(schema, buf)
    96  	require.NoError(t, err)
    97  	var ts *TestTimestampPtr
    98  
    99  	err = enc.Encode(ts)
   100  
   101  	require.NoError(t, err)
   102  	assert.Equal(t, []byte{0x00}, buf.Bytes())
   103  }
   104  
   105  func TestEncoder_ConvertibleError(t *testing.T) {
   106  	defer ConfigTeardown()
   107  
   108  	schema := `{"type": "long", "logicalType": "timestamp-millis"}`
   109  	buf := bytes.NewBuffer([]byte{})
   110  	enc, err := avro.NewEncoder(schema, buf)
   111  	require.NoError(t, err)
   112  	ts := TestTimestampError{}
   113  
   114  	err = enc.Encode(&ts)
   115  
   116  	assert.Error(t, err)
   117  }