kubo/core/coreiface/tests/object.go

145 lines
3.5 KiB
Go

package tests
import (
"context"
"testing"
dag "github.com/ipfs/boxo/ipld/merkledag"
"github.com/ipfs/boxo/path"
ipld "github.com/ipfs/go-ipld-format"
iface "github.com/ipfs/kubo/core/coreiface"
opt "github.com/ipfs/kubo/core/coreiface/options"
"github.com/stretchr/testify/require"
)
func (tp *TestSuite) TestObject(t *testing.T) {
tp.hasApi(t, func(api iface.CoreAPI) error {
if api.Object() == nil {
return errAPINotImplemented
}
return nil
})
t.Run("TestObjectAddLink", tp.TestObjectAddLink)
t.Run("TestObjectAddLinkCreate", tp.TestObjectAddLinkCreate)
t.Run("TestObjectRmLink", tp.TestObjectRmLink)
t.Run("TestDiffTest", tp.TestDiffTest)
}
func putDagPbNode(t *testing.T, ctx context.Context, api iface.CoreAPI, data string, links []*ipld.Link) path.ImmutablePath {
dagnode := new(dag.ProtoNode)
if data != "" {
dagnode.SetData([]byte(data))
}
if links != nil {
err := dagnode.SetLinks(links)
require.NoError(t, err)
}
err := api.Dag().Add(ctx, dagnode)
require.NoError(t, err)
return path.FromCid(dagnode.Cid())
}
func (tp *TestSuite) TestObjectAddLink(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
api, err := tp.makeAPI(t, ctx)
require.NoError(t, err)
p1 := putDagPbNode(t, ctx, api, "foo", nil)
p2 := putDagPbNode(t, ctx, api, "bazz", []*ipld.Link{
{
Name: "bar",
Cid: p1.RootCid(),
Size: 3,
},
})
p3, err := api.Object().AddLink(ctx, p2, "abc", p2)
require.NoError(t, err)
nd, err := api.Dag().Get(ctx, p3.RootCid())
require.NoError(t, err)
links := nd.Links()
require.Len(t, links, 2)
require.Equal(t, "abc", links[0].Name)
require.Equal(t, "bar", links[1].Name)
}
func (tp *TestSuite) TestObjectAddLinkCreate(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
api, err := tp.makeAPI(t, ctx)
require.NoError(t, err)
p1 := putDagPbNode(t, ctx, api, "foo", nil)
p2 := putDagPbNode(t, ctx, api, "bazz", []*ipld.Link{
{
Name: "bar",
Cid: p1.RootCid(),
Size: 3,
},
})
_, err = api.Object().AddLink(ctx, p2, "abc/d", p2)
require.ErrorContains(t, err, "no link by that name")
p3, err := api.Object().AddLink(ctx, p2, "abc/d", p2, opt.Object.Create(true))
require.NoError(t, err)
nd, err := api.Dag().Get(ctx, p3.RootCid())
require.NoError(t, err)
links := nd.Links()
require.Len(t, links, 2)
require.Equal(t, "abc", links[0].Name)
require.Equal(t, "bar", links[1].Name)
}
func (tp *TestSuite) TestObjectRmLink(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
api, err := tp.makeAPI(t, ctx)
require.NoError(t, err)
p1 := putDagPbNode(t, ctx, api, "foo", nil)
p2 := putDagPbNode(t, ctx, api, "bazz", []*ipld.Link{
{
Name: "bar",
Cid: p1.RootCid(),
Size: 3,
},
})
p3, err := api.Object().RmLink(ctx, p2, "bar")
require.NoError(t, err)
nd, err := api.Dag().Get(ctx, p3.RootCid())
require.NoError(t, err)
links := nd.Links()
require.Len(t, links, 0)
}
func (tp *TestSuite) TestDiffTest(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
api, err := tp.makeAPI(t, ctx)
require.NoError(t, err)
p1 := putDagPbNode(t, ctx, api, "foo", nil)
p2 := putDagPbNode(t, ctx, api, "bar", nil)
changes, err := api.Object().Diff(ctx, p1, p2)
require.NoError(t, err)
require.Len(t, changes, 1)
require.Equal(t, iface.DiffMod, changes[0].Type)
require.Equal(t, p1.String(), changes[0].Before.String())
require.Equal(t, p2.String(), changes[0].After.String())
}