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  }