github.com/storacha/go-ucanto@v0.7.2/core/schema/mapped_test.go (about)

     1  package schema_test
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  	"testing"
     7  
     8  	"github.com/ipld/go-ipld-prime"
     9  	"github.com/ipld/go-ipld-prime/node/basicnode"
    10  	"github.com/storacha/go-ucanto/core/result/failure"
    11  	"github.com/storacha/go-ucanto/core/schema"
    12  	"github.com/storacha/go-ucanto/testing/helpers"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestReadStruct(t *testing.T) {
    17  	type TestStruct struct {
    18  		Url string
    19  	}
    20  
    21  	ts := helpers.Must(ipld.LoadSchemaBytes([]byte(`
    22  		type TestStruct struct {
    23  			url String
    24  		}
    25  	`)))
    26  
    27  	type URLStruct struct {
    28  		Url url.URL
    29  	}
    30  
    31  	converter := func(ts TestStruct) (URLStruct, failure.Failure) {
    32  		url, err := url.Parse(ts.Url)
    33  		if err != nil {
    34  			return URLStruct{}, failure.FromError(err)
    35  		}
    36  		return URLStruct{Url: *url}, nil
    37  	}
    38  
    39  	t.Run("Success", func(t *testing.T) {
    40  		np := basicnode.Prototype.Any
    41  		nb := np.NewBuilder()
    42  		ma := helpers.Must(nb.BeginMap(2))
    43  		ma.AssembleKey().AssignString("url")
    44  		ma.AssembleValue().AssignString("http://www.yahoo.com")
    45  		ma.Finish()
    46  		nd := nb.Build()
    47  
    48  		res, err := schema.Mapped(schema.Struct[TestStruct](ts.TypeByName("TestStruct"), nil), converter).Read(nd)
    49  		require.NoError(t, err)
    50  		fmt.Printf("%+v\n", res)
    51  		require.Equal(t, res.Url.Host, "www.yahoo.com")
    52  	})
    53  
    54  	t.Run("Failure, underlying reader", func(t *testing.T) {
    55  		np := basicnode.Prototype.Any
    56  		nb := np.NewBuilder()
    57  		ma := helpers.Must(nb.BeginMap(2))
    58  		ma.AssembleKey().AssignString("foo")
    59  		ma.AssembleValue().AssignString("bar")
    60  		ma.Finish()
    61  		nd := nb.Build()
    62  
    63  		_, err := schema.Mapped(schema.Struct[TestStruct](ts.TypeByName("TestStruct"), nil), converter).Read(nd)
    64  		require.Error(t, err)
    65  		fmt.Printf("%+v\n", err)
    66  		require.Equal(t, err.Name(), "SchemaError")
    67  	})
    68  	t.Run("Failure, conversion", func(t *testing.T) {
    69  		np := basicnode.Prototype.Any
    70  		nb := np.NewBuilder()
    71  		ma := helpers.Must(nb.BeginMap(2))
    72  		ma.AssembleKey().AssignString("url")
    73  		ma.AssembleValue().AssignString(":apple")
    74  		ma.Finish()
    75  		nd := nb.Build()
    76  
    77  		_, err := schema.Mapped(schema.Struct[TestStruct](ts.TypeByName("TestStruct"), nil), converter).Read(nd)
    78  		require.Error(t, err)
    79  		fmt.Printf("%+v\n", err)
    80  	})
    81  }