Files
Olares/cli/pkg/web5/vc/vc_test.go

99 lines
2.8 KiB
Go

package vc_test
import (
"slices"
"testing"
"time"
"github.com/beclab/Olares/cli/pkg/web5/dids/didkey"
"github.com/beclab/Olares/cli/pkg/web5/vc"
"github.com/alecthomas/assert/v2"
)
func TestCreate_Defaults(t *testing.T) {
cred := vc.Create(vc.Claims{"id": "1234"})
assert.Equal(t, 1, len(cred.Context))
assert.Equal(t, vc.BaseContext, cred.Context[0])
assert.Equal(t, 1, len(cred.Type))
assert.Equal(t, vc.BaseType, cred.Type[0])
assert.Contains(t, cred.ID, "urn:vc:uuid:")
assert.NotZero(t, cred.IssuanceDate)
_, err := time.Parse(time.RFC3339, cred.IssuanceDate)
assert.NoError(t, err)
assert.Equal(t, "1234", cred.CredentialSubject["id"])
}
func TestCreate_Options(t *testing.T) {
claims := vc.Claims{"id": "1234"}
issuanceDate := time.Now().UTC().Add(10 * time.Hour)
expirationDate := issuanceDate.Add(30 * time.Hour)
cred := vc.Create(
claims,
vc.ID("hehecustomid"),
vc.Contexts("https://nocontextisbestcontext.gov"),
vc.Types("StreetCredential"),
vc.IssuanceDate(issuanceDate),
vc.ExpirationDate(expirationDate),
vc.Schemas("https://example.org/examples/degree.json"),
vc.Evidences(vc.Evidence{
ID: "evidenceID",
Type: "Insufficient",
AdditionalFields: map[string]interface{}{
"kind": "circumstantial",
"checks": []string{"motive", "cell_tower_logs"},
},
}),
)
assert.Equal(t, 2, len(cred.Context))
assert.True(t, slices.Contains(cred.Context, "https://nocontextisbestcontext.gov"))
assert.True(t, slices.Contains(cred.Context, vc.BaseContext))
assert.Equal(t, 2, len(cred.Type))
assert.True(t, slices.Contains(cred.Type, "StreetCredential"))
assert.True(t, slices.Contains(cred.Type, vc.BaseType))
assert.Equal(t, "hehecustomid", cred.ID)
assert.NotZero(t, cred.ExpirationDate)
assert.Equal(t, 1, len(cred.CredentialSchema))
assert.Equal(t, "https://example.org/examples/degree.json", cred.CredentialSchema[0].ID)
assert.Equal(t, "JsonSchema", cred.CredentialSchema[0].Type)
assert.Equal(t, 1, len(cred.Evidence))
assert.Equal(t, "evidenceID", cred.Evidence[0].ID)
assert.Equal(t, "Insufficient", cred.Evidence[0].Type)
assert.Equal(t, "circumstantial", cred.Evidence[0].AdditionalFields["kind"])
assert.Equal(t, []string{"motive", "cell_tower_logs"}, cred.Evidence[0].AdditionalFields["checks"].([]string)) // nolint:forcetypeassert
}
func TestSign(t *testing.T) {
issuer, err := didkey.Create()
assert.NoError(t, err)
subject, err := didkey.Create()
assert.NoError(t, err)
claims := vc.Claims{"id": subject.URI, "name": "Randy McRando"}
cred := vc.Create(claims)
vcJWT, err := cred.Sign(issuer)
assert.NoError(t, err)
assert.NotZero(t, vcJWT)
// TODO: make test more reliable by not depending on another function in this package (Moe - 2024-02-25)
decoded, err := vc.Verify[vc.Claims](vcJWT)
assert.NoError(t, err)
assert.NotZero(t, decoded)
}