Skip to content

Commit

Permalink
Add provider events with tests
Browse files Browse the repository at this point in the history
  • Loading branch information
akhilkumarpilli authored and boz committed Jun 18, 2020
1 parent e048e96 commit 211926f
Show file tree
Hide file tree
Showing 6 changed files with 379 additions and 17 deletions.
24 changes: 18 additions & 6 deletions testutil/event.go
Expand Up @@ -7,15 +7,16 @@ import (
"github.com/ovrclk/akash/sdkutil"
dtypes "github.com/ovrclk/akash/x/deployment/types"
mtypes "github.com/ovrclk/akash/x/market/types"
ptypes "github.com/ovrclk/akash/x/provider/types"
"github.com/stretchr/testify/require"
)

func ParseEvent(t testing.TB, events sdk.Events, expectedLen int) sdkutil.Event {
func ParseEvent(t testing.TB, events sdk.Events) sdkutil.Event {
t.Helper()

require.Equal(t, expectedLen, len(events))
require.Equal(t, 1, len(events))

sev := sdk.StringifyEvent(events.ToABCIEvents()[expectedLen-1])
sev := sdk.StringifyEvent(events.ToABCIEvents()[0])
ev, err := sdkutil.ParseEvent(sev)

require.NoError(t, err)
Expand All @@ -26,21 +27,32 @@ func ParseEvent(t testing.TB, events sdk.Events, expectedLen int) sdkutil.Event
func ParseDeploymentEvent(t testing.TB, events sdk.Events) sdkutil.ModuleEvent {
t.Helper()

uev := ParseEvent(t, events, 1)
uev := ParseEvent(t, events)

iev, err := dtypes.ParseEvent(uev)
require.NoError(t, err)

return iev
}

func ParseMarketEvent(t testing.TB, events sdk.Events, expectedLen int) sdkutil.ModuleEvent {
func ParseMarketEvent(t testing.TB, events sdk.Events) sdkutil.ModuleEvent {
t.Helper()

uev := ParseEvent(t, events, expectedLen)
uev := ParseEvent(t, events)

iev, err := mtypes.ParseEvent(uev)
require.NoError(t, err)

return iev
}

func ParseProviderEvent(t testing.TB, events sdk.Events) sdkutil.ModuleEvent {
t.Helper()

uev := ParseEvent(t, events)

iev, err := ptypes.ParseEvent(uev)
require.NoError(t, err)

return iev
}
22 changes: 11 additions & 11 deletions x/market/handler/handler_test.go
Expand Up @@ -100,7 +100,7 @@ func TestCreateBidValid(t *testing.T) {
bid := types.MakeBidID(order.ID(), provider)

t.Run("ensure event created", func(t *testing.T) {
iev := testutil.ParseMarketEvent(t, res.Events, 2)
iev := testutil.ParseMarketEvent(t, res.Events[2:])
require.IsType(t, types.EventBidCreated{}, iev)

dev := iev.(types.EventBidCreated)
Expand Down Expand Up @@ -271,7 +271,7 @@ func TestCloseOrderWithoutLease(t *testing.T) {
func TestCloseOrderValid(t *testing.T) {
suite := setupTestSuite(t)

lid, _, order := suite.createLease()
_, _, order := suite.createLease()

msg := types.MsgCloseOrder{
OrderID: order.ID(),
Expand All @@ -282,12 +282,12 @@ func TestCloseOrderValid(t *testing.T) {
require.NoError(t, err)

t.Run("ensure event created", func(t *testing.T) {
iev := testutil.ParseMarketEvent(t, res.Events, 5)
require.IsType(t, types.EventLeaseClosed{}, iev)
iev := testutil.ParseMarketEvent(t, res.Events[3:4])
require.IsType(t, types.EventOrderClosed{}, iev)

dev := iev.(types.EventLeaseClosed)
dev := iev.(types.EventOrderClosed)

require.Equal(t, lid, dev.ID)
require.Equal(t, msg.OrderID, dev.ID)
})
}

Expand Down Expand Up @@ -324,7 +324,7 @@ func TestCloseBidUnknownLease(t *testing.T) {
func TestCloseBidValid(t *testing.T) {
suite := setupTestSuite(t)

_, bid, order := suite.createLease()
_, bid, _ := suite.createLease()

msg := types.MsgCloseBid{
BidID: bid.ID(),
Expand All @@ -335,12 +335,12 @@ func TestCloseBidValid(t *testing.T) {
require.NoError(t, err)

t.Run("ensure event created", func(t *testing.T) {
iev := testutil.ParseMarketEvent(t, res.Events, 6)
require.IsType(t, types.EventOrderClosed{}, iev)
iev := testutil.ParseMarketEvent(t, res.Events[3:4])
require.IsType(t, types.EventBidClosed{}, iev)

dev := iev.(types.EventOrderClosed)
dev := iev.(types.EventBidClosed)

require.Equal(t, order.ID(), dev.ID)
require.Equal(t, msg.BidID, dev.ID)
})
}

Expand Down
35 changes: 35 additions & 0 deletions x/provider/handler/handler_test.go
Expand Up @@ -76,6 +76,16 @@ func TestProviderCreate(t *testing.T) {
require.NotNil(t, res)
require.NoError(t, err)

t.Run("ensure event created", func(t *testing.T) {

iev := testutil.ParseProviderEvent(t, res.Events)
require.IsType(t, types.EventProviderCreate{}, iev)

dev := iev.(types.EventProviderCreate)

require.Equal(t, msg.Owner, dev.Owner)
})

res, err = suite.handler(suite.ctx, msg)
require.Nil(t, res)
require.Error(t, err)
Expand Down Expand Up @@ -103,6 +113,17 @@ func TestProviderUpdateExisting(t *testing.T) {
require.NoError(t, err)

res, err := suite.handler(suite.ctx, updateMsg)

t.Run("ensure event created", func(t *testing.T) {

iev := testutil.ParseProviderEvent(t, res.Events[1:])
require.IsType(t, types.EventProviderUpdate{}, iev)

dev := iev.(types.EventProviderUpdate)

require.Equal(t, updateMsg.Owner, dev.Owner)
})

require.NoError(t, err)
require.NotNil(t, res)
}
Expand Down Expand Up @@ -159,6 +180,16 @@ func TestProviderUpdateAttributes(t *testing.T) {
require.NoError(t, err)
require.NotNil(t, res)

t.Run("ensure event created", func(t *testing.T) {

iev := testutil.ParseProviderEvent(t, res.Events[4:])
require.IsType(t, types.EventProviderUpdate{}, iev)

dev := iev.(types.EventProviderUpdate)

require.Equal(t, updateMsg.Owner, dev.Owner)
})

updateMsg.Attributes = nil
res, err = suite.handler(suite.ctx, updateMsg)
require.Error(t, err, types.ErrIncompatibleAttributes.Error())
Expand Down Expand Up @@ -186,6 +217,10 @@ func TestProviderDeleteExisting(t *testing.T) {
require.Nil(t, res)
require.EqualError(t, err, handler.ErrInternal.Error()+": NOTIMPLEMENTED")
require.True(t, errors.Is(err, handler.ErrInternal))

t.Run("ensure event created", func(t *testing.T) {
// TODO: this should emit a ProviderDelete
})
}

func TestProviderDeleteNonExisting(t *testing.T) {
Expand Down
10 changes: 10 additions & 0 deletions x/provider/keeper/keeper.go
Expand Up @@ -51,6 +51,11 @@ func (k Keeper) Create(ctx sdk.Context, provider types.Provider) error {
}

store.Set(key, k.cdc.MustMarshalBinaryBare(provider))

ctx.EventManager().EmitEvent(
types.EventProviderCreate{Owner: provider.Owner}.ToSDKEvent(),
)

return nil
}

Expand All @@ -76,6 +81,11 @@ func (k Keeper) Update(ctx sdk.Context, provider types.Provider) error {
return types.ErrProviderNotFound
}
store.Set(key, k.cdc.MustMarshalBinaryBare(provider))

ctx.EventManager().EmitEvent(
types.EventProviderUpdate{Owner: provider.Owner}.ToSDKEvent(),
)

return nil
}

Expand Down
108 changes: 108 additions & 0 deletions x/provider/types/event.go
@@ -0,0 +1,108 @@
package types

import (
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/ovrclk/akash/sdkutil"
)

const (
evActionProviderCreate = "provider-create"
evActionProviderUpdate = "provider-update"
evActionProviderDelete = "provider-delete"
evOwnerKey = "owner"
)

// EventProviderCreate struct
type EventProviderCreate struct {
Owner sdk.AccAddress
}

// ToSDKEvent method creates new sdk event for EventProviderCreate struct
func (ev EventProviderCreate) ToSDKEvent() sdk.Event {
return sdk.NewEvent(sdkutil.EventTypeMessage,
append([]sdk.Attribute{
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
sdk.NewAttribute(sdk.AttributeKeyAction, evActionProviderCreate),
}, ProviderEVAttributes(ev.Owner)...)...,
)
}

// EventProviderUpdate struct
type EventProviderUpdate struct {
Owner sdk.AccAddress
}

// ToSDKEvent method creates new sdk event for EventProviderUpdate struct
func (ev EventProviderUpdate) ToSDKEvent() sdk.Event {
return sdk.NewEvent(sdkutil.EventTypeMessage,
append([]sdk.Attribute{
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
sdk.NewAttribute(sdk.AttributeKeyAction, evActionProviderUpdate),
}, ProviderEVAttributes(ev.Owner)...)...,
)
}

// EventProviderDelete struct
type EventProviderDelete struct {
Owner sdk.AccAddress
}

// ToSDKEvent method creates new sdk event for EventProviderDelete struct
func (ev EventProviderDelete) ToSDKEvent() sdk.Event {
return sdk.NewEvent(sdkutil.EventTypeMessage,
append([]sdk.Attribute{
sdk.NewAttribute(sdk.AttributeKeyModule, ModuleName),
sdk.NewAttribute(sdk.AttributeKeyAction, evActionProviderDelete),
}, ProviderEVAttributes(ev.Owner)...)...,
)
}

// ProviderEVAttributes returns event attribues for given Provider
func ProviderEVAttributes(owner sdk.AccAddress) []sdk.Attribute {
return []sdk.Attribute{
sdk.NewAttribute(evOwnerKey, owner.String()),
}
}

// ParseEVProvider returns provider details for given event attributes
func ParseEVProvider(attrs []sdk.Attribute) (sdk.AccAddress, error) {
owner, err := sdkutil.GetAccAddress(attrs, evOwnerKey)
if err != nil {
return sdk.AccAddress{}, err
}

return owner, nil
}

// ParseEvent parses event and returns details of event and error if occurred
// TODO: Enable returning actual events.
func ParseEvent(ev sdkutil.Event) (sdkutil.ModuleEvent, error) {
if ev.Type != sdkutil.EventTypeMessage {
return nil, sdkutil.ErrUnknownType
}
if ev.Module != ModuleName {
return nil, sdkutil.ErrUnknownModule
}
switch ev.Action {
case evActionProviderCreate:
owner, err := ParseEVProvider(ev.Attributes)
if err != nil {
return nil, err
}
return EventProviderCreate{Owner: owner}, nil
case evActionProviderUpdate:
owner, err := ParseEVProvider(ev.Attributes)
if err != nil {
return nil, err
}
return EventProviderUpdate{Owner: owner}, nil
case evActionProviderDelete:
owner, err := ParseEVProvider(ev.Attributes)
if err != nil {
return nil, err
}
return EventProviderDelete{Owner: owner}, nil
default:
return nil, sdkutil.ErrUnknownAction
}
}

0 comments on commit 211926f

Please sign in to comment.