frameproto.ActionBody (for the data that is POSTed it)
parent
c2efb1b7b7
commit
20689a3369
|
@ -0,0 +1,45 @@
|
|||
package frameproto
|
||||
|
||||
import (
|
||||
"sourcecode.social/reiver/go-opt"
|
||||
)
|
||||
|
||||
// ActionBody represents the data sent to a Frame-Protocol's (i.e., Farcaster Frame's) application when it is POSTed to.
|
||||
//
|
||||
// Example usage:
|
||||
//
|
||||
// p, err := io.ReadAll(request.Body)
|
||||
// if nil != err {
|
||||
// return err
|
||||
// }
|
||||
//
|
||||
// var actionBody frameproto.ActionBody
|
||||
//
|
||||
// err := json.Unmarshal(p, &actionBody)
|
||||
// if nil != err {
|
||||
// return err
|
||||
// }
|
||||
type ActionBody struct {
|
||||
UntrustedData ActionBodyUntrustedData `json:"untrustedData"`
|
||||
TrustedData ActionBodyTrustedData `json:"trustedData"`
|
||||
}
|
||||
|
||||
type ActionBodyUntrustedData struct {
|
||||
FID opt.Optional[uint64] `json:"fid"`
|
||||
URL opt.Optional[string] `json:"url"`
|
||||
MessageHash opt.Optional[string] `json:"messageHash"`
|
||||
Timestamp opt.Optional[int64] `json:"timestamp"`
|
||||
Network opt.Optional[uint64] `json:"network"`
|
||||
ButtonIndex opt.Optional[uint64] `json:"buttonIndex"`
|
||||
InputText opt.Optional[string] `json:"inputText"`
|
||||
CastID ActionBodyCastID `json:"castId"`
|
||||
}
|
||||
|
||||
type ActionBodyTrustedData struct {
|
||||
MessageBytes opt.Optional[string]
|
||||
}
|
||||
|
||||
type ActionBodyCastID struct {
|
||||
FID opt.Optional[uint64] `json:"fid"`
|
||||
Hash opt.Optional[string] `json:"hash"`
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
package frameproto
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"encoding/json"
|
||||
|
||||
"sourcecode.social/reiver/go-opt"
|
||||
)
|
||||
|
||||
func TestActionBody(t *testing.T) {
|
||||
|
||||
tests := []struct{
|
||||
JSON string
|
||||
Expected ActionBody
|
||||
}{
|
||||
{
|
||||
JSON:
|
||||
`
|
||||
{
|
||||
"untrustedData": {
|
||||
"fid": 2,
|
||||
"url": "https://fcpolls.com/polls/1",
|
||||
"messageHash": "0xd2b1ddc6c88e865a33cb1a565e0058d757042974",
|
||||
"timestamp": 1706243218,
|
||||
"network": 1,
|
||||
"buttonIndex": 2,
|
||||
"inputText": "hello world",
|
||||
"castId": {
|
||||
"fid": 226,
|
||||
"hash": "0xa48dd46161d8e57725f5e26e34ec19c13ff7f3b9"
|
||||
}
|
||||
},
|
||||
"trustedData": {
|
||||
"messageBytes": "d2b1ddc6c88e865a33cb1a565e0058d757042974..."
|
||||
}
|
||||
}
|
||||
`,
|
||||
Expected: ActionBody{
|
||||
ActionBodyUntrustedData{
|
||||
FID: opt.Something(uint64(2)),
|
||||
URL: opt.Something("https://fcpolls.com/polls/1"),
|
||||
MessageHash: opt.Something("0xd2b1ddc6c88e865a33cb1a565e0058d757042974"),
|
||||
Timestamp: opt.Something(int64(1706243218)),
|
||||
Network: opt.Something(uint64(1)),
|
||||
ButtonIndex: opt.Something(uint64(2)),
|
||||
InputText: opt.Something("hello world"),
|
||||
CastID: ActionBodyCastID{
|
||||
FID: opt.Something(uint64(226)),
|
||||
Hash: opt.Something("0xa48dd46161d8e57725f5e26e34ec19c13ff7f3b9"),
|
||||
},
|
||||
},
|
||||
ActionBodyTrustedData{
|
||||
MessageBytes: opt.Something("d2b1ddc6c88e865a33cb1a565e0058d757042974..."),
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for testNumber, test := range tests {
|
||||
|
||||
var p []byte = []byte(test.JSON)
|
||||
|
||||
var actual ActionBody
|
||||
|
||||
err := json.Unmarshal(p, &actual)
|
||||
|
||||
if nil != err {
|
||||
t.Errorf("For test #%d, did not expect to get an error but actually got one.", testNumber)
|
||||
t.Logf("ERROR: (%T) %s", err, err)
|
||||
t.Logf("JSON:\n%s", test.JSON)
|
||||
continue
|
||||
}
|
||||
|
||||
{
|
||||
expected := test.Expected
|
||||
|
||||
if expected != actual {
|
||||
t.Errorf("For test #%d, the actual value is not what wa expected.", testNumber)
|
||||
t.Logf("EXPECTED: %#v", expected)
|
||||
t.Logf("ACTUAL: %#v", actual)
|
||||
t.Logf("JSON:\n%s", test.JSON)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue