112 lines
3.2 KiB
Go
112 lines
3.2 KiB
Go
package list
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/anyproto/any-sync/commonspace/object/accountdata"
|
|
"github.com/anyproto/any-sync/commonspace/object/acl/aclrecordproto"
|
|
"github.com/anyproto/any-sync/util/cidutil"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func wrapRecord(rawRec *aclrecordproto.RawAclRecord) *aclrecordproto.RawAclRecordWithId {
|
|
payload, err := rawRec.Marshal()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
id, err := cidutil.NewCidFromBytes(payload)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return &aclrecordproto.RawAclRecordWithId{
|
|
Payload: payload,
|
|
Id: id,
|
|
}
|
|
}
|
|
|
|
type aclFixture struct {
|
|
ownerKeys *accountdata.AccountKeys
|
|
accountKeys *accountdata.AccountKeys
|
|
ownerAcl *aclList
|
|
accountAcl *aclList
|
|
spaceId string
|
|
}
|
|
|
|
func newFixture(t *testing.T) *aclFixture {
|
|
ownerKeys, err := accountdata.NewRandom()
|
|
require.NoError(t, err)
|
|
accountKeys, err := accountdata.NewRandom()
|
|
require.NoError(t, err)
|
|
spaceId := "spaceId"
|
|
ownerAcl, err := NewTestDerivedAcl(spaceId, ownerKeys)
|
|
require.NoError(t, err)
|
|
accountAcl, err := NewTestAclWithRoot(accountKeys, ownerAcl.Root())
|
|
require.NoError(t, err)
|
|
return &aclFixture{
|
|
ownerKeys: ownerKeys,
|
|
accountKeys: accountKeys,
|
|
ownerAcl: ownerAcl.(*aclList),
|
|
accountAcl: accountAcl.(*aclList),
|
|
spaceId: spaceId,
|
|
}
|
|
}
|
|
|
|
func TestAclList_BuildRoot(t *testing.T) {
|
|
randomKeys, err := accountdata.NewRandom()
|
|
require.NoError(t, err)
|
|
randomAcl, err := NewTestDerivedAcl("spaceId", randomKeys)
|
|
require.NoError(t, err)
|
|
fmt.Println(randomAcl.Id())
|
|
}
|
|
|
|
func TestAclList_InvitePipeline(t *testing.T) {
|
|
fx := newFixture(t)
|
|
var (
|
|
ownerAcl = fx.ownerAcl
|
|
ownerState = fx.ownerAcl.aclState
|
|
accountAcl = fx.accountAcl
|
|
accountState = fx.accountAcl.aclState
|
|
)
|
|
// building invite
|
|
inv, err := ownerAcl.RecordBuilder().BuildInvite()
|
|
require.NoError(t, err)
|
|
inviteRec := wrapRecord(inv.InviteRec)
|
|
err = ownerAcl.AddRawRecord(inviteRec)
|
|
require.NoError(t, err)
|
|
err = accountAcl.AddRawRecord(inviteRec)
|
|
require.NoError(t, err)
|
|
|
|
// building request join
|
|
requestJoin, err := accountAcl.RecordBuilder().BuildRequestJoin(RequestJoinPayload{
|
|
InviteRecordId: inviteRec.Id,
|
|
InviteKey: inv.InviteKey,
|
|
})
|
|
require.NoError(t, err)
|
|
requestJoinRec := wrapRecord(requestJoin)
|
|
err = ownerAcl.AddRawRecord(requestJoinRec)
|
|
require.NoError(t, err)
|
|
err = accountAcl.AddRawRecord(requestJoinRec)
|
|
require.NoError(t, err)
|
|
|
|
// building request accept
|
|
requestAccept, err := ownerAcl.RecordBuilder().BuildRequestAccept(RequestAcceptPayload{
|
|
RequestRecordId: requestJoinRec.Id,
|
|
Permissions: AclPermissions(aclrecordproto.AclUserPermissions_Writer),
|
|
})
|
|
require.NoError(t, err)
|
|
requestAcceptRec := wrapRecord(requestAccept)
|
|
err = ownerAcl.AddRawRecord(requestAcceptRec)
|
|
require.NoError(t, err)
|
|
err = accountAcl.AddRawRecord(requestAcceptRec)
|
|
require.NoError(t, err)
|
|
|
|
// checking acl state
|
|
require.True(t, ownerState.Permissions(ownerState.pubKey).IsOwner())
|
|
require.True(t, ownerState.Permissions(accountState.pubKey).CanWrite())
|
|
require.Equal(t, 0, len(ownerState.pendingRequests))
|
|
require.Equal(t, 0, len(accountState.pendingRequests))
|
|
require.True(t, accountState.Permissions(ownerState.pubKey).IsOwner())
|
|
require.True(t, accountState.Permissions(accountState.pubKey).CanWrite())
|
|
}
|