107 lines
2.2 KiB
Go
107 lines
2.2 KiB
Go
|
package typeddata
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
func TestUnmarshalFull(t *testing.T) {
|
||
|
data := `
|
||
|
{
|
||
|
"types": {
|
||
|
"EIP712Domain": [
|
||
|
{
|
||
|
"name": "name",
|
||
|
"type": "string"
|
||
|
},
|
||
|
{
|
||
|
"name": "version",
|
||
|
"type": "string"
|
||
|
},
|
||
|
{
|
||
|
"name": "chainId",
|
||
|
"type": "uint256"
|
||
|
},
|
||
|
{
|
||
|
"name": "verifyingContract",
|
||
|
"type": "address"
|
||
|
}
|
||
|
],
|
||
|
"Person": [
|
||
|
{
|
||
|
"name": "name",
|
||
|
"type": "string"
|
||
|
},
|
||
|
{
|
||
|
"name": "wallet",
|
||
|
"type": "address"
|
||
|
}
|
||
|
],
|
||
|
"Mail": [
|
||
|
{
|
||
|
"name": "from",
|
||
|
"type": "Person"
|
||
|
},
|
||
|
{
|
||
|
"name": "to",
|
||
|
"type": "Person"
|
||
|
},
|
||
|
{
|
||
|
"name": "contents",
|
||
|
"type": "string"
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
"primaryType": "Mail",
|
||
|
"domain": {
|
||
|
"name": "Ether Mail",
|
||
|
"version": "1",
|
||
|
"chainId": 1,
|
||
|
"verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"
|
||
|
},
|
||
|
"message": {
|
||
|
"from": {
|
||
|
"name": "Cow",
|
||
|
"wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826"
|
||
|
},
|
||
|
"to": {
|
||
|
"name": "Bob",
|
||
|
"wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"
|
||
|
},
|
||
|
"contents": "Hello, Bob!"
|
||
|
}
|
||
|
}
|
||
|
`
|
||
|
var typed TypedData
|
||
|
require.NoError(t, json.Unmarshal([]byte(data), &typed))
|
||
|
}
|
||
|
|
||
|
func TestValidateField(t *testing.T) {
|
||
|
f := Field{}
|
||
|
require.EqualError(t, f.Validate(), "`name` is required")
|
||
|
f.Name = "name"
|
||
|
require.EqualError(t, f.Validate(), "`type` is required")
|
||
|
f.Type = "type"
|
||
|
require.NoError(t, f.Validate())
|
||
|
}
|
||
|
|
||
|
func TestValidateTypedData(t *testing.T) {
|
||
|
d := TypedData{Types: Types{}}
|
||
|
require.EqualError(t, d.Validate(), "`EIP712Domain` must be in `types`")
|
||
|
d.Types[eip712Domain] = []Field{}
|
||
|
require.EqualError(t, d.Validate(), "`primaryType` is required")
|
||
|
d.PrimaryType = "primary"
|
||
|
d.Types[d.PrimaryType] = []Field{}
|
||
|
require.EqualError(t, d.Validate(), "`domain` is required")
|
||
|
d.Domain = map[string]json.RawMessage{}
|
||
|
require.EqualError(t, d.Validate(), "`message` is required")
|
||
|
d.Message = map[string]json.RawMessage{}
|
||
|
require.NoError(t, d.Validate())
|
||
|
d.Types[d.PrimaryType] = append(d.Types[d.PrimaryType], Field{Name: "name"})
|
||
|
require.EqualError(t, d.Validate(), "field 0 from type `primary` is invalid: `type` is required")
|
||
|
d.Types[d.PrimaryType][0].Type = "tttt"
|
||
|
require.NoError(t, d.Validate())
|
||
|
}
|