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 }