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 }