Skip to content

Commit bbeb145

Browse files
Copilotasmyasnikov
andauthored
Add comprehensive unit tests for internal/value package to increase coverage to 90%+ (#1893)
Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: asmyasnikov <[email protected]> Co-authored-by: Aleksey Myasnikov <[email protected]>
1 parent 0898288 commit bbeb145

File tree

3 files changed

+1583
-0
lines changed

3 files changed

+1583
-0
lines changed

internal/value/nullable_test.go

Lines changed: 363 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package value
22

33
import (
4+
"math/big"
45
"testing"
6+
"time"
57

8+
"github.com/google/uuid"
69
"github.com/stretchr/testify/require"
710

811
"github.com/ydb-platform/ydb-go-sdk/v3/internal/types"
@@ -49,3 +52,363 @@ func TestIsNull(t *testing.T) {
4952
})
5053
}
5154
}
55+
56+
func TestUnwrap(t *testing.T) {
57+
for _, tt := range []struct {
58+
name string
59+
v Value
60+
expected Value
61+
}{
62+
{
63+
name: "nil value",
64+
v: nil,
65+
expected: nil,
66+
},
67+
{
68+
name: "optional with value",
69+
v: OptionalValue(Uint32Value(42)),
70+
expected: Uint32Value(42),
71+
},
72+
{
73+
name: "optional with null",
74+
v: NullValue(types.Date),
75+
expected: nil,
76+
},
77+
{
78+
name: "non-optional value",
79+
v: Int64Value(123),
80+
expected: Int64Value(123),
81+
},
82+
{
83+
name: "nested optional",
84+
v: OptionalValue(OptionalValue(TextValue("test"))),
85+
expected: OptionalValue(TextValue("test")),
86+
},
87+
} {
88+
t.Run(tt.name, func(t *testing.T) {
89+
result := Unwrap(tt.v)
90+
if tt.expected == nil {
91+
require.Nil(t, result)
92+
} else {
93+
require.Equal(t, tt.expected.Yql(), result.Yql())
94+
}
95+
})
96+
}
97+
}
98+
99+
func TestNullableDecimalValue(t *testing.T) {
100+
t.Run("nil value", func(t *testing.T) {
101+
v := NullableDecimalValue(nil, 22, 9)
102+
require.True(t, IsNull(v))
103+
// Check that the inner type is decimal
104+
optType, ok := v.Type().(types.Optional)
105+
require.True(t, ok)
106+
decType, ok := optType.InnerType().(*types.Decimal)
107+
require.True(t, ok)
108+
require.Equal(t, uint32(22), decType.Precision())
109+
require.Equal(t, uint32(9), decType.Scale())
110+
})
111+
112+
t.Run("non-nil value", func(t *testing.T) {
113+
val := [16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
114+
v := NullableDecimalValue(&val, 22, 9)
115+
require.False(t, IsNull(v))
116+
})
117+
}
118+
119+
func TestNullableDecimalValueFromBigInt(t *testing.T) {
120+
t.Run("nil value", func(t *testing.T) {
121+
v := NullableDecimalValueFromBigInt(nil, 22, 9)
122+
require.True(t, IsNull(v))
123+
// Check that the inner type is decimal
124+
optType, ok := v.Type().(types.Optional)
125+
require.True(t, ok)
126+
decType, ok := optType.InnerType().(*types.Decimal)
127+
require.True(t, ok)
128+
require.Equal(t, uint32(22), decType.Precision())
129+
require.Equal(t, uint32(9), decType.Scale())
130+
})
131+
132+
t.Run("non-nil value", func(t *testing.T) {
133+
bigInt := big.NewInt(12345)
134+
v := NullableDecimalValueFromBigInt(bigInt, 22, 9)
135+
require.False(t, IsNull(v))
136+
})
137+
}
138+
139+
func TestNullableUUIDValueWithIssue1501(t *testing.T) {
140+
t.Run("nil value", func(t *testing.T) {
141+
v := NullableUUIDValueWithIssue1501(nil)
142+
require.True(t, IsNull(v))
143+
// Check that the inner type is UUID
144+
optType, ok := v.Type().(types.Optional)
145+
require.True(t, ok)
146+
require.Equal(t, types.UUID, optType.InnerType())
147+
})
148+
149+
t.Run("non-nil value", func(t *testing.T) {
150+
uuidBytes := [16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
151+
v := NullableUUIDValueWithIssue1501(&uuidBytes)
152+
require.False(t, IsNull(v))
153+
})
154+
}
155+
156+
func TestNullableUuidValue(t *testing.T) {
157+
t.Run("nil value", func(t *testing.T) {
158+
v := NullableUuidValue(nil)
159+
require.True(t, IsNull(v))
160+
// Check that the inner type is UUID
161+
optType, ok := v.Type().(types.Optional)
162+
require.True(t, ok)
163+
require.Equal(t, types.UUID, optType.InnerType())
164+
})
165+
166+
t.Run("non-nil value", func(t *testing.T) {
167+
u := uuid.New()
168+
v := NullableUuidValue(&u)
169+
require.False(t, IsNull(v))
170+
})
171+
}
172+
173+
func TestNullableFromTimeValues(t *testing.T) {
174+
now := time.Now()
175+
176+
t.Run("NullableDateValueFromTime_nil", func(t *testing.T) {
177+
v := NullableDateValueFromTime(nil)
178+
require.True(t, IsNull(v))
179+
})
180+
181+
t.Run("NullableDateValueFromTime_nonNil", func(t *testing.T) {
182+
v := NullableDateValueFromTime(&now)
183+
require.False(t, IsNull(v))
184+
})
185+
186+
t.Run("NullableDatetimeValueFromTime_nil", func(t *testing.T) {
187+
v := NullableDatetimeValueFromTime(nil)
188+
require.True(t, IsNull(v))
189+
})
190+
191+
t.Run("NullableDatetimeValueFromTime_nonNil", func(t *testing.T) {
192+
v := NullableDatetimeValueFromTime(&now)
193+
require.False(t, IsNull(v))
194+
})
195+
196+
t.Run("NullableTzDateValueFromTime_nil", func(t *testing.T) {
197+
v := NullableTzDateValueFromTime(nil)
198+
require.True(t, IsNull(v))
199+
})
200+
201+
t.Run("NullableTzDateValueFromTime_nonNil", func(t *testing.T) {
202+
v := NullableTzDateValueFromTime(&now)
203+
require.False(t, IsNull(v))
204+
})
205+
206+
t.Run("NullableTzDatetimeValueFromTime_nil", func(t *testing.T) {
207+
v := NullableTzDatetimeValueFromTime(nil)
208+
require.True(t, IsNull(v))
209+
})
210+
211+
t.Run("NullableTzDatetimeValueFromTime_nonNil", func(t *testing.T) {
212+
v := NullableTzDatetimeValueFromTime(&now)
213+
require.False(t, IsNull(v))
214+
})
215+
216+
t.Run("NullableTimestampValueFromTime_nil", func(t *testing.T) {
217+
v := NullableTimestampValueFromTime(nil)
218+
require.True(t, IsNull(v))
219+
})
220+
221+
t.Run("NullableTimestampValueFromTime_nonNil", func(t *testing.T) {
222+
v := NullableTimestampValueFromTime(&now)
223+
require.False(t, IsNull(v))
224+
})
225+
226+
t.Run("NullableTzTimestampValueFromTime_nil", func(t *testing.T) {
227+
v := NullableTzTimestampValueFromTime(nil)
228+
require.True(t, IsNull(v))
229+
})
230+
231+
t.Run("NullableTzTimestampValueFromTime_nonNil", func(t *testing.T) {
232+
v := NullableTzTimestampValueFromTime(&now)
233+
require.False(t, IsNull(v))
234+
})
235+
}
236+
237+
func TestNullableFromDurationValues(t *testing.T) {
238+
duration := time.Hour
239+
240+
t.Run("NullableIntervalValueFromDuration_nil", func(t *testing.T) {
241+
v := NullableIntervalValueFromDuration(nil)
242+
require.True(t, IsNull(v))
243+
})
244+
245+
t.Run("NullableIntervalValueFromDuration_nonNil", func(t *testing.T) {
246+
v := NullableIntervalValueFromDuration(&duration)
247+
require.False(t, IsNull(v))
248+
})
249+
}
250+
251+
func TestNullableBytesAndStringValues(t *testing.T) {
252+
t.Run("NullableBytesValue_nil", func(t *testing.T) {
253+
v := NullableBytesValue(nil)
254+
require.True(t, IsNull(v))
255+
})
256+
257+
t.Run("NullableBytesValue_nonNil", func(t *testing.T) {
258+
bytes := []byte("test")
259+
v := NullableBytesValue(&bytes)
260+
require.False(t, IsNull(v))
261+
})
262+
263+
t.Run("NullableYSONValueFromBytes_nil", func(t *testing.T) {
264+
v := NullableYSONValueFromBytes(nil)
265+
require.True(t, IsNull(v))
266+
})
267+
268+
t.Run("NullableYSONValueFromBytes_nonNil", func(t *testing.T) {
269+
bytes := []byte(`{"key": "value"}`)
270+
v := NullableYSONValueFromBytes(&bytes)
271+
require.False(t, IsNull(v))
272+
})
273+
274+
t.Run("NullableJSONValueFromBytes_nil", func(t *testing.T) {
275+
v := NullableJSONValueFromBytes(nil)
276+
require.True(t, IsNull(v))
277+
})
278+
279+
t.Run("NullableJSONValueFromBytes_nonNil", func(t *testing.T) {
280+
bytes := []byte(`{"key": "value"}`)
281+
v := NullableJSONValueFromBytes(&bytes)
282+
require.False(t, IsNull(v))
283+
})
284+
285+
t.Run("NullableUUIDValue_nil", func(t *testing.T) {
286+
v := NullableUUIDValue(nil)
287+
require.True(t, IsNull(v))
288+
})
289+
290+
t.Run("NullableUUIDValue_nonNil", func(t *testing.T) {
291+
uuidBytes := [16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
292+
v := NullableUUIDValue(&uuidBytes)
293+
require.False(t, IsNull(v))
294+
})
295+
296+
t.Run("NullableJSONDocumentValueFromBytes_nil", func(t *testing.T) {
297+
v := NullableJSONDocumentValueFromBytes(nil)
298+
require.True(t, IsNull(v))
299+
})
300+
301+
t.Run("NullableJSONDocumentValueFromBytes_nonNil", func(t *testing.T) {
302+
bytes := []byte(`{"key": "value"}`)
303+
v := NullableJSONDocumentValueFromBytes(&bytes)
304+
require.False(t, IsNull(v))
305+
})
306+
}
307+
308+
func TestNullableWithVariousTypes(t *testing.T) {
309+
t.Run("Float", func(t *testing.T) {
310+
val := float32(1.23)
311+
v := Nullable(types.Float, &val)
312+
require.False(t, IsNull(v))
313+
})
314+
315+
t.Run("FloatNil", func(t *testing.T) {
316+
v := Nullable(types.Float, (*float32)(nil))
317+
require.True(t, IsNull(v))
318+
})
319+
320+
t.Run("Double", func(t *testing.T) {
321+
val := float64(1.23)
322+
v := Nullable(types.Double, &val)
323+
require.False(t, IsNull(v))
324+
})
325+
326+
t.Run("DoubleNil", func(t *testing.T) {
327+
v := Nullable(types.Double, (*float64)(nil))
328+
require.True(t, IsNull(v))
329+
})
330+
331+
t.Run("Date", func(t *testing.T) {
332+
val := uint32(18000)
333+
v := Nullable(types.Date, &val)
334+
require.False(t, IsNull(v))
335+
})
336+
337+
t.Run("Datetime", func(t *testing.T) {
338+
val := uint32(1234567890)
339+
v := Nullable(types.Datetime, &val)
340+
require.False(t, IsNull(v))
341+
})
342+
343+
t.Run("Timestamp", func(t *testing.T) {
344+
val := uint64(1234567890)
345+
v := Nullable(types.Timestamp, &val)
346+
require.False(t, IsNull(v))
347+
})
348+
349+
t.Run("Interval", func(t *testing.T) {
350+
val := int64(1000000)
351+
v := Nullable(types.Interval, &val)
352+
require.False(t, IsNull(v))
353+
})
354+
355+
t.Run("TzDate", func(t *testing.T) {
356+
val := "2020-01-01,UTC"
357+
v := Nullable(types.TzDate, &val)
358+
require.False(t, IsNull(v))
359+
})
360+
361+
t.Run("TzDatetime", func(t *testing.T) {
362+
val := "2020-01-01T12:00:00,UTC"
363+
v := Nullable(types.TzDatetime, &val)
364+
require.False(t, IsNull(v))
365+
})
366+
367+
t.Run("TzTimestamp", func(t *testing.T) {
368+
val := "2020-01-01T12:00:00.123456,UTC"
369+
v := Nullable(types.TzTimestamp, &val)
370+
require.False(t, IsNull(v))
371+
})
372+
373+
t.Run("Text", func(t *testing.T) {
374+
val := "test"
375+
v := Nullable(types.Text, &val)
376+
require.False(t, IsNull(v))
377+
})
378+
379+
t.Run("Bytes", func(t *testing.T) {
380+
val := []byte("test")
381+
v := Nullable(types.Bytes, &val)
382+
require.False(t, IsNull(v))
383+
})
384+
385+
t.Run("YSON", func(t *testing.T) {
386+
val := "{}"
387+
v := Nullable(types.YSON, &val)
388+
require.False(t, IsNull(v))
389+
})
390+
391+
t.Run("JSON", func(t *testing.T) {
392+
val := "{}"
393+
v := Nullable(types.JSON, &val)
394+
require.False(t, IsNull(v))
395+
})
396+
397+
t.Run("UUID", func(t *testing.T) {
398+
val := [16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
399+
v := Nullable(types.UUID, &val)
400+
require.False(t, IsNull(v))
401+
})
402+
403+
t.Run("JSONDocument", func(t *testing.T) {
404+
val := "{}"
405+
v := Nullable(types.JSONDocument, &val)
406+
require.False(t, IsNull(v))
407+
})
408+
409+
t.Run("DyNumber", func(t *testing.T) {
410+
val := "123.456"
411+
v := Nullable(types.DyNumber, &val)
412+
require.False(t, IsNull(v))
413+
})
414+
}

0 commit comments

Comments
 (0)