github.com/RevenueMonster/sqlike@v1.0.6/sql/codec/decoder_test.go (about)

     1  package codec
     2  
     3  import (
     4  	"database/sql"
     5  	"encoding/base64"
     6  	"reflect"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestDecodeByte(a *testing.T) {
    14  	var (
    15  		dd  = DefaultDecoders{}
    16  		err error
    17  	)
    18  
    19  	a.Run("Decode Byte with empty value", func(b *testing.T) {
    20  		var raw []byte
    21  		v := reflect.ValueOf(&raw)
    22  		err = dd.DecodeByte(nil, v.Elem())
    23  		require.NoError(b, err)
    24  		require.NotNil(b, b)
    25  		require.True(b, len(raw) == 0)
    26  	})
    27  
    28  	a.Run("Decode Byte with string value", func(b *testing.T) {
    29  		var raw []byte
    30  		v := reflect.ValueOf(&raw)
    31  		name := "john doe"
    32  		b64 := base64.StdEncoding.EncodeToString([]byte(name))
    33  		err = dd.DecodeByte(b64, v.Elem())
    34  		require.NoError(b, err)
    35  		require.Equal(b, name, string(raw))
    36  	})
    37  
    38  	a.Run("Decode Byte with number value", func(b *testing.T) {
    39  		var raw []byte
    40  		v := reflect.ValueOf(&raw)
    41  		num := "88"
    42  		b64 := base64.StdEncoding.EncodeToString([]byte(num))
    43  		err = dd.DecodeByte([]byte(b64), v.Elem())
    44  		require.NoError(b, err)
    45  		require.Equal(b, num, string(raw))
    46  	})
    47  
    48  }
    49  
    50  func TestDecodeRawBytes(a *testing.T) {
    51  	var (
    52  		dd = DefaultDecoders{}
    53  	)
    54  
    55  	a.Run("Decode RawBytes to String", func(b *testing.T) {
    56  		var raw sql.RawBytes
    57  		str := "JOHN Cena"
    58  		v := reflect.ValueOf(&raw)
    59  		err := dd.DecodeRawBytes(str, v.Elem())
    60  		require.NoError(b, err)
    61  		require.Equal(b, sql.RawBytes(str), raw)
    62  	})
    63  
    64  	a.Run("Decode RawBytes to Int64", func(b *testing.T) {
    65  		var raw sql.RawBytes
    66  		v := reflect.ValueOf(&raw)
    67  		i64 := int64(-1231298738213812)
    68  		err := dd.DecodeRawBytes(i64, v.Elem())
    69  		require.NoError(b, err)
    70  		require.Equal(b, sql.RawBytes("-1231298738213812"), raw)
    71  	})
    72  
    73  	a.Run("Decode RawBytes to Uint64", func(b *testing.T) {
    74  		var raw sql.RawBytes
    75  		v := reflect.ValueOf(&raw)
    76  		ui64 := uint64(1231298738213812)
    77  		err := dd.DecodeRawBytes(ui64, v.Elem())
    78  		require.NoError(b, err)
    79  		require.Equal(b, sql.RawBytes("1231298738213812"), raw)
    80  	})
    81  
    82  	a.Run("Decode RawBytes to Boolean", func(b *testing.T) {
    83  		var raw sql.RawBytes
    84  		flag := true
    85  		v := reflect.ValueOf(&raw)
    86  		err := dd.DecodeRawBytes(flag, v.Elem())
    87  		require.NoError(b, err)
    88  		require.Equal(b, sql.RawBytes("true"), raw)
    89  
    90  		flag = false
    91  		err = dd.DecodeRawBytes(flag, v.Elem())
    92  		require.NoError(b, err)
    93  		require.Equal(b, sql.RawBytes("false"), raw)
    94  	})
    95  
    96  	a.Run("Decode RawBytes to Time", func(b *testing.T) {
    97  		var raw sql.RawBytes
    98  		v := reflect.ValueOf(&raw)
    99  		tm := time.Time{}
   100  		err := dd.DecodeRawBytes(tm, v.Elem())
   101  		require.NoError(b, err)
   102  		require.Equal(b, sql.RawBytes("0001-01-01T00:00:00Z"), raw)
   103  	})
   104  }
   105  
   106  func TestDecodeTime(a *testing.T) {
   107  	var (
   108  		tm  time.Time
   109  		err error
   110  	)
   111  
   112  	a.Run("Time with YYYY-MM-DD", func(b *testing.T) {
   113  		tm, err = decodeTime("2021-10-17")
   114  		require.NoError(b, err)
   115  		require.Equal(b, "2021-10-17T00:00:00Z", tm.Format(time.RFC3339Nano))
   116  	})
   117  
   118  	a.Run("Time with 1 digit milliseconds", func(b *testing.T) {
   119  		tm, err = decodeTime("2021-10-17 07:15:04.3")
   120  		require.NoError(b, err)
   121  		require.Equal(b, "2021-10-17T07:15:04.3Z", tm.Format(time.RFC3339Nano))
   122  
   123  		tm, err = decodeTime("2021-10-17 07:15:04.30")
   124  		require.NoError(b, err)
   125  		require.Equal(b, "2021-10-17T07:15:04.3Z", tm.Format(time.RFC3339Nano))
   126  	})
   127  
   128  	a.Run("Time with 2 digit milliseconds", func(b *testing.T) {
   129  		tm, err := decodeTime("2021-10-17 07:15:04.36")
   130  		require.NoError(b, err)
   131  		require.Equal(b, "2021-10-17T07:15:04.36Z", tm.Format(time.RFC3339Nano))
   132  	})
   133  
   134  	a.Run("Time with 3 digit milliseconds", func(b *testing.T) {
   135  		tm, err := decodeTime("2021-10-17 07:15:04.366")
   136  		require.NoError(b, err)
   137  		require.Equal(b, "2021-10-17T07:15:04.366Z", tm.Format(time.RFC3339Nano))
   138  	})
   139  
   140  	a.Run("Time with 4 digit milliseconds", func(b *testing.T) {
   141  		tm, err := decodeTime("2021-10-17 07:15:04.3661")
   142  		require.NoError(b, err)
   143  		require.Equal(b, "2021-10-17T07:15:04.3661Z", tm.Format(time.RFC3339Nano))
   144  	})
   145  
   146  	a.Run("Time with 5 digit milliseconds", func(b *testing.T) {
   147  		tm, err := decodeTime("2021-10-17 07:15:04.36617")
   148  		require.NoError(b, err)
   149  		require.Equal(b, "2021-10-17T07:15:04.36617Z", tm.Format(time.RFC3339Nano))
   150  	})
   151  
   152  	a.Run("Time with 6 digit milliseconds", func(b *testing.T) {
   153  		tm, err = decodeTime("2021-10-17 07:15:04.366170")
   154  		require.NoError(b, err)
   155  		require.Equal(b, "2021-10-17T07:15:04.36617Z", tm.Format(time.RFC3339Nano))
   156  
   157  		tm, err = decodeTime("2021-10-17 07:15:04.366176")
   158  		require.NoError(b, err)
   159  		require.Equal(b, "2021-10-17T07:15:04.366176Z", tm.Format(time.RFC3339Nano))
   160  	})
   161  }
   162  
   163  func TestDecodeTimeLocation(a *testing.T) {
   164  	var (
   165  		dd  = DefaultDecoders{}
   166  		err error
   167  	)
   168  
   169  	a.Run("Decode TimeLocation with empty value", func(b *testing.T) {
   170  		var raw time.Location
   171  		v := reflect.ValueOf(&raw)
   172  		err = dd.DecodeTimeLocation(nil, v.Elem())
   173  		require.NoError(b, err)
   174  		require.NotNil(b, b)
   175  		require.True(b, raw.String() == "")
   176  	})
   177  
   178  	a.Run("Decode TimeLocation with valid string value", func(b *testing.T) {
   179  		var raw time.Location
   180  		v := reflect.ValueOf(&raw)
   181  		err = dd.DecodeTimeLocation("Asia/Kuala_Lumpur", v.Elem())
   182  		require.NoError(b, err)
   183  		require.NotNil(b, b)
   184  		require.True(b, raw.String() == "Asia/Kuala_Lumpur")
   185  	})
   186  
   187  	a.Run("Decode TimeLocation with valid []byte value", func(b *testing.T) {
   188  		var raw time.Location
   189  		v := reflect.ValueOf(&raw)
   190  		err = dd.DecodeTimeLocation([]byte("Asia/Kuala_Lumpur"), v.Elem())
   191  		require.NoError(b, err)
   192  		require.NotNil(b, b)
   193  		require.True(b, raw.String() == "Asia/Kuala_Lumpur")
   194  	})
   195  }