github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/tests/integration/sugar_unmarhall_result_set_test.go (about)

     1  //go:build integration
     2  // +build integration
     3  
     4  package integration
     5  
     6  import (
     7  	"context"
     8  	"os"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/query/scanner"
    14  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/version"
    15  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xtest"
    16  	"github.com/ydb-platform/ydb-go-sdk/v3/sugar"
    17  )
    18  
    19  func TestSugarUnmarshallResultSet(t *testing.T) {
    20  	if version.Lt(os.Getenv("YDB_VERSION"), "24.1") {
    21  		t.Skip("query service not allowed in YDB version '" + os.Getenv("YDB_VERSION") + "'")
    22  	}
    23  
    24  	ctx, cancel := context.WithCancel(xtest.Context(t))
    25  	defer cancel()
    26  
    27  	var (
    28  		scope = newScope(t)
    29  		db    = scope.Driver()
    30  	)
    31  
    32  	t.Run("HappyWay", func(t *testing.T) {
    33  		type myStruct struct {
    34  			ID  int32  `sql:"id"`
    35  			Str string `sql:"myStr"`
    36  		}
    37  
    38  		rows, err := db.Query().QueryResultSet(ctx, `
    39  			SELECT 42 as id, "myStr42" as myStr
    40  			UNION
    41  			SELECT 43 as id, "myStr43" as myStr
    42  			ORDER BY id
    43  		`)
    44  		require.NoError(t, err)
    45  
    46  		many, err := sugar.UnmarshallResultSet[myStruct](rows)
    47  		require.NoError(t, err)
    48  		require.Len(t, many, 2)
    49  		require.NotNil(t, many[0])
    50  		require.NotNil(t, many[1])
    51  		require.EqualValues(t, 42, many[0].ID)
    52  		require.EqualValues(t, "myStr42", many[0].Str)
    53  		require.EqualValues(t, 43, many[1].ID)
    54  		require.EqualValues(t, "myStr43", many[1].Str)
    55  	})
    56  	t.Run("UnexpectedColumn", func(t *testing.T) {
    57  		type myStruct struct {
    58  			ID  int32  `sql:"id"`
    59  			Str string `sql:"myStr"`
    60  		}
    61  
    62  		rows, err := db.Query().QueryResultSet(ctx, `
    63  			SELECT 42 as id, "myStr42" as myStr, 123 as unexpected_column
    64  			UNION
    65  			SELECT 43 as id, "myStr43" as myStr, 123 as unexpected_column
    66  			ORDER BY id
    67  		`)
    68  		require.NoError(t, err)
    69  
    70  		many, err := sugar.UnmarshallResultSet[myStruct](rows)
    71  		require.ErrorIs(t, err, scanner.ErrFieldsNotFoundInStruct)
    72  		require.Empty(t, many)
    73  	})
    74  	t.Run("UnexpectedStructField", func(t *testing.T) {
    75  		type myStruct struct {
    76  			ID              int32  `sql:"id"`
    77  			Str             string `sql:"myStr"`
    78  			UnexpectedField int    `sql:"unexpected_column"`
    79  		}
    80  
    81  		rows, err := db.Query().QueryResultSet(ctx, `
    82  			SELECT 42 as id, "myStr42" as myStr
    83  			UNION
    84  			SELECT 43 as id, "myStr43" as myStr
    85  			ORDER BY id
    86  		`)
    87  
    88  		many, err := sugar.UnmarshallResultSet[myStruct](rows)
    89  		require.ErrorIs(t, err, scanner.ErrColumnsNotFoundInRow)
    90  		require.Empty(t, many)
    91  	})
    92  }