Skip to content

Commit

Permalink
Add events from nba api with unit tests (#128)
Browse files Browse the repository at this point in the history
* validate event type

* upgrade flow and cadence

* add events from nba-api repo

* add testify package

* add unit tests

* add event validation to momentDestroyed event

* add unit test for moment destroyed

* cleanup

* use validate method and return error

* clean up
  • Loading branch information
Deewai authored Sep 28, 2021
1 parent 49cd3ff commit 26101e5
Show file tree
Hide file tree
Showing 20 changed files with 1,019 additions and 30 deletions.
15 changes: 14 additions & 1 deletion lib/go/events/deposit.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package events

import (
"fmt"
"github.com/onflow/cadence"
jsoncdc "github.com/onflow/cadence/encoding/json"
"github.com/onflow/flow-go-sdk"
Expand Down Expand Up @@ -37,10 +38,22 @@ func (evt depositEvent) Owner() string {
return evt.To()
}

func (evt depositEvent) validate() error {
if evt.EventType.QualifiedIdentifier != EventDeposit{
return fmt.Errorf("error validating event: event is not a valid moment destroyed event, expected type %s, got %s",
EventDeposit, evt.EventType.QualifiedIdentifier)
}
return nil
}

func DecodeDepositEvent(b []byte) (DepositEvent, error) {
value, err := jsoncdc.Decode(b)
if err != nil {
return nil, err
}
return depositEvent(value.(cadence.Event)), nil
event := depositEvent(value.(cadence.Event))
if err := event.validate(); err != nil{
return nil, fmt.Errorf("error decoding event: %w", err)
}
return event, nil
}
48 changes: 48 additions & 0 deletions lib/go/events/deposit_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package events

import (
"github.com/onflow/flow-go-sdk"
"github.com/stretchr/testify/require"
"testing"

"github.com/onflow/cadence"
jsoncdc "github.com/onflow/cadence/encoding/json"
"github.com/onflow/cadence/runtime/tests/utils"
"github.com/stretchr/testify/assert"
)

func TestCadenceEvents_Deposit(t *testing.T) {
id := uint64(1234)
address := flow.HexToAddress("0x12345678")
to := [8]byte(address)

depositEventType := cadence.EventType{
Location: utils.TestLocation,
QualifiedIdentifier: "TopShot.Deposit",
Fields: []cadence.Field{
{
Identifier: "id",
Type: cadence.UInt64Type{},
},
{
Identifier: "to",
Type: cadence.OptionalType{},
},
},
Initializer: []cadence.Parameter{},
}

depositEvent := cadence.NewEvent([]cadence.Value{
cadence.NewUInt64(id),
cadence.NewOptional(cadence.NewAddress(to)),
}).WithType(&depositEventType)

payload, err := jsoncdc.Encode(depositEvent)
require.NoError(t, err, "failed to encode deposit cadence event")

decodedDepositEventType, err := DecodeDepositEvent(payload)
require.NoError(t, err, "failed to decode deposit cadence event")

assert.Equal(t, id, decodedDepositEventType.Id())
assert.Equal(t, address.String(), decodedDepositEventType.To())
}
19 changes: 16 additions & 3 deletions lib/go/events/destroy.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package events

import (
"fmt"
"github.com/onflow/cadence"
jsoncdc "github.com/onflow/cadence/encoding/json"
)
Expand All @@ -15,14 +16,26 @@ type MomentDestroyedEvent interface {

type momentDestroyedEvent cadence.Event

func (a momentDestroyedEvent) Id() uint64 {
return uint64(a.Fields[0].(cadence.UInt64))
func (evt momentDestroyedEvent) Id() uint64 {
return uint64(evt.Fields[0].(cadence.UInt64))
}

func (evt momentDestroyedEvent) validate() error {
if evt.EventType.QualifiedIdentifier != EventMomentDestroyed{
return fmt.Errorf("error validating event: event is not a valid moment destroyed event, expected type %s, got %s",
EventMomentDestroyed, evt.EventType.QualifiedIdentifier)
}
return nil
}

func DecodeMomentDestroyedEvent(b []byte) (MomentDestroyedEvent, error) {
value, err := jsoncdc.Decode(b)
if err != nil {
return nil, err
}
return momentDestroyedEvent(value.(cadence.Event)), nil
event := momentDestroyedEvent(value.(cadence.Event))
if err := event.validate(); err != nil{
return nil, fmt.Errorf("error decoding event: %w", err)
}
return event, nil
}
38 changes: 38 additions & 0 deletions lib/go/events/destroy_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package events

import (
"github.com/stretchr/testify/require"
"testing"

"github.com/onflow/cadence"
jsoncdc "github.com/onflow/cadence/encoding/json"
"github.com/onflow/cadence/runtime/tests/utils"
"github.com/stretchr/testify/assert"
)

func TestCadenceEvents_MomentDestroyed(t *testing.T) {
id := uint64(1234)

momentDestroyedEventType := cadence.EventType{
Location: utils.TestLocation,
QualifiedIdentifier: "TopShot.MomentDestroyed",
Fields: []cadence.Field{
{
Identifier: "setID",
Type: cadence.UInt64Type{},
},
},
}

momentDestroyedEvent := cadence.NewEvent([]cadence.Value{
cadence.NewUInt64(id),
}).WithType(&momentDestroyedEventType)

payload, err := jsoncdc.Encode(momentDestroyedEvent)
require.NoError(t, err, "failed to encode moment destroyed cadence event")

decodeSetLockPurchasedEvent, err := DecodeMomentDestroyedEvent(payload)
require.NoError(t, err, "failed to decode moment destroyed cadence event")

assert.Equal(t, id, decodeSetLockPurchasedEvent.Id())
}
5 changes: 3 additions & 2 deletions lib/go/events/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module github.com/dapperlabs/nba-smart-contracts/lib/go/events
go 1.16

require (
github.com/onflow/cadence v0.4.0
github.com/onflow/flow-go-sdk v0.4.1
github.com/onflow/cadence v0.18.0
github.com/onflow/flow-go-sdk v0.20.0
github.com/stretchr/testify v1.7.0
)
Loading

0 comments on commit 26101e5

Please sign in to comment.