2024-11-05 08:39:43 -05:00
|
|
|
package invocation_test
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
2025-12-04 15:01:15 +01:00
|
|
|
_ "embed"
|
2025-07-31 14:43:42 +02:00
|
|
|
"encoding/base64"
|
2024-11-05 08:39:43 -05:00
|
|
|
"testing"
|
|
|
|
|
|
2025-07-31 14:43:42 +02:00
|
|
|
"github.com/MetaMask/go-did-it/crypto"
|
|
|
|
|
"github.com/MetaMask/go-did-it/crypto/ed25519"
|
2024-11-05 08:39:43 -05:00
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
"github.com/stretchr/testify/require"
|
2024-11-05 17:39:39 +01:00
|
|
|
|
2024-11-05 08:39:43 -05:00
|
|
|
"github.com/ucan-wg/go-ucan/token/internal/envelope"
|
|
|
|
|
"github.com/ucan-wg/go-ucan/token/invocation"
|
|
|
|
|
)
|
|
|
|
|
|
2025-12-04 15:01:15 +01:00
|
|
|
//go:embed testdata/full_example.dagjson
|
|
|
|
|
var fullExampleDagJson []byte
|
|
|
|
|
|
2024-11-05 08:39:43 -05:00
|
|
|
const (
|
2025-07-31 14:43:42 +02:00
|
|
|
issuerPrivKeyCfg = "BeAgktAj8irGgWjp4PGk/fV67e5CcML/KRmmHSldco3etP5lRiuYQ+VVO/39ol3XXruJC8deSuBxoEXzgdYpYw=="
|
2025-12-04 15:01:15 +01:00
|
|
|
fullExampleCID = "zdpuB1NjhETofEUp5iYzoHjSc2KKgZvSoT6FBaLMoVzzsxiR1"
|
2024-11-05 08:39:43 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestSchemaRoundTrip(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
|
|
privKey := privKey(t, issuerPrivKeyCfg)
|
|
|
|
|
|
|
|
|
|
t.Run("via buffers", func(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
|
|
// format: dagJson --> PayloadModel --> dagCbor --> PayloadModel --> dagJson
|
|
|
|
|
// function: DecodeDagJson() Seal() Unseal() EncodeDagJson()
|
|
|
|
|
|
2025-12-04 15:01:15 +01:00
|
|
|
p1, err := invocation.FromDagJson(fullExampleDagJson)
|
2024-11-05 08:39:43 -05:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
cborBytes, id, err := p1.ToSealed(privKey)
|
|
|
|
|
require.NoError(t, err)
|
2025-12-04 15:01:15 +01:00
|
|
|
assert.Equal(t, fullExampleCID, envelope.CIDToBase58BTC(id))
|
2024-11-05 08:39:43 -05:00
|
|
|
|
|
|
|
|
p2, c2, err := invocation.FromSealed(cborBytes)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
assert.Equal(t, id, c2)
|
|
|
|
|
|
|
|
|
|
readJson, err := p2.ToDagJson(privKey)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
2025-12-04 15:01:15 +01:00
|
|
|
assert.JSONEq(t, string(fullExampleDagJson), string(readJson))
|
2024-11-05 08:39:43 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("via streaming", func(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
|
|
|
|
|
2025-12-04 15:01:15 +01:00
|
|
|
buf := bytes.NewBuffer(fullExampleDagJson)
|
2024-11-05 08:39:43 -05:00
|
|
|
|
|
|
|
|
// format: dagJson --> PayloadModel --> dagCbor --> PayloadModel --> dagJson
|
|
|
|
|
// function: DecodeDagJson() Seal() Unseal() EncodeDagJson()
|
|
|
|
|
|
|
|
|
|
p1, err := invocation.FromDagJsonReader(buf)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
cborBytes := &bytes.Buffer{}
|
|
|
|
|
id, err := p1.ToSealedWriter(cborBytes, privKey)
|
|
|
|
|
require.NoError(t, err)
|
2025-12-04 15:01:15 +01:00
|
|
|
assert.Equal(t, fullExampleCID, envelope.CIDToBase58BTC(id))
|
2024-11-05 08:39:43 -05:00
|
|
|
|
|
|
|
|
p2, c2, err := invocation.FromSealedReader(cborBytes)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
assert.Equal(t, envelope.CIDToBase58BTC(id), envelope.CIDToBase58BTC(c2))
|
|
|
|
|
|
|
|
|
|
readJson := &bytes.Buffer{}
|
|
|
|
|
require.NoError(t, p2.ToDagJsonWriter(readJson, privKey))
|
|
|
|
|
|
2025-12-04 15:01:15 +01:00
|
|
|
assert.JSONEq(t, string(fullExampleDagJson), readJson.String())
|
2024-11-25 15:12:29 -05:00
|
|
|
})
|
2024-11-05 08:39:43 -05:00
|
|
|
}
|
2024-11-05 17:39:39 +01:00
|
|
|
|
2025-07-31 14:43:42 +02:00
|
|
|
func privKey(t require.TestingT, privKeyCfg string) crypto.PrivateKeySigningBytes {
|
|
|
|
|
privBytes, err := base64.StdEncoding.DecodeString(privKeyCfg)
|
2024-11-05 08:39:43 -05:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
2025-07-31 14:43:42 +02:00
|
|
|
privKey, err := ed25519.PrivateKeyFromBytes(privBytes)
|
2024-11-05 08:39:43 -05:00
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
return privKey
|
|
|
|
|
}
|