github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/sugar/query_iterators_test.go (about) 1 //go:build go1.23 2 3 package sugar_test 4 5 import ( 6 "errors" 7 "io" 8 "testing" 9 10 "github.com/stretchr/testify/require" 11 12 internalQuery "github.com/ydb-platform/ydb-go-sdk/v3/internal/query" 13 "github.com/ydb-platform/ydb-go-sdk/v3/internal/xiter" 14 "github.com/ydb-platform/ydb-go-sdk/v3/query" 15 "github.com/ydb-platform/ydb-go-sdk/v3/sugar" 16 ) 17 18 func TestUnmarshalRows(t *testing.T) { 19 rows := []*internalQuery.Row{ 20 newRow(432, "test-1"), 21 newRow(22, "2-test"), 22 } 23 24 expected := []rowTestStruct{ 25 { 26 ID: 432, 27 Str: "test-1", 28 }, 29 { 30 ID: 22, 31 Str: "2-test", 32 }, 33 } 34 35 t.Run("OK", func(t *testing.T) { 36 rowsIter := xiter.Seq2[query.Row, error](func(yield func(query.Row, error) bool) { 37 if !yield(rows[0], nil) { 38 return 39 } 40 if !yield(rows[1], nil) { 41 return 42 } 43 }) 44 index := 0 45 for row, err := range sugar.UnmarshalRows[rowTestStruct](rowsIter) { 46 require.Equal(t, expected[index], row) 47 require.NoError(t, err) // unmarshaler must hide io.EOF error - it is signal about all row readed 48 index++ 49 } 50 require.Equal(t, 2, index) 51 }) 52 t.Run("OK_EOF", func(t *testing.T) { 53 rowsIter := xiter.Seq2[query.Row, error](func(yield func(query.Row, error) bool) { 54 if !yield(rows[0], nil) { 55 return 56 } 57 if !yield(rows[1], nil) { 58 return 59 } 60 if !yield(nil, io.EOF) { 61 return 62 } 63 }) 64 index := 0 65 for row, err := range sugar.UnmarshalRows[rowTestStruct](rowsIter) { 66 require.Equal(t, expected[index], row) 67 require.NoError(t, err) 68 index++ 69 } 70 require.Equal(t, 2, index) 71 }) 72 t.Run("Error", func(t *testing.T) { 73 testErr := errors.New("test") 74 rowsIter := xiter.Seq2[query.Row, error](func(yield func(query.Row, error) bool) { 75 if !yield(rows[0], nil) { 76 return 77 } 78 if !yield(rows[1], nil) { 79 return 80 } 81 if !yield(nil, testErr) { 82 return 83 } 84 85 t.Fatal("unmarshaler must be stop after first error") 86 }) 87 index := 0 88 errorCount := 0 89 var resErr error 90 for row, err := range sugar.UnmarshalRows[rowTestStruct](rowsIter) { 91 if err == nil { 92 require.Equal(t, expected[index], row) 93 index++ 94 } else { 95 errorCount++ 96 resErr = err 97 } 98 } 99 require.Equal(t, 2, index) 100 require.Equal(t, 1, errorCount) // unmarhaler must stop after first error 101 require.ErrorIs(t, resErr, testErr) 102 }) 103 }