Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update test/msg server complete execution early test #672

Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 62 additions & 23 deletions x/pylons/keeper/msg_server_complete_execution_early_test.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package keeper_test

import (
sdk "github.com/cosmos/cosmos-sdk/types"

"fmt"
"github.com/Pylons-tech/pylons/x/pylons/keeper"
"github.com/Pylons-tech/pylons/x/pylons/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)

func (suite *IntegrationTestSuite) TestCompleteExecutionEarly() {
Expand All @@ -18,6 +18,10 @@ func (suite *IntegrationTestSuite) TestCompleteExecutionEarly() {

amountToPay := sdk.NewCoins(sdk.NewCoin(types.PylonsCoinDenom, sdk.NewInt(10)))
creator := types.GenTestBech32FromString("test")

trashStr := types.GenTestBech32FromString("trash")
trashAddress := sdk.MustAccAddressFromBech32(trashStr)

cookbookMsg := &types.MsgCreateCookbook{
Creator: creator,
Id: "testCookbookID",
Expand Down Expand Up @@ -47,28 +51,63 @@ func (suite *IntegrationTestSuite) TestCompleteExecutionEarly() {
// create only one pendingExecution
pendingExecution := createNPendingExecutionForSingleRecipe(k, ctx, 1, recipe)[0]

// give coins to requester
requesterAddr, err := sdk.AccAddressFromBech32(pendingExecution.Creator)
require.NoError(err)
err = k.MintCoinsToAddr(ctx, requesterAddr, amountToPay)
require.NoError(err)
for _, tc := range []struct {
desc string
Id string
amountMinted sdk.Coins
valid bool
}{
{
desc: "Cannot find a pending execution with ID given",
Id: "2",
amountMinted: sdk.NewCoins(sdk.NewCoin(types.PylonsCoinDenom, sdk.NewInt(10))),
valid: false,
},
{
desc: "Amout coint of requester is not enough",
Id: pendingExecution.Id,
amountMinted: sdk.NewCoins(sdk.NewCoin(types.PylonsCoinDenom, sdk.NewInt(0))),
valid: false,
},
{
desc: "Valid",
Id: pendingExecution.Id,
amountMinted: sdk.NewCoins(sdk.NewCoin(types.PylonsCoinDenom, sdk.NewInt(10))),
valid: true,
},
} {
suite.Run(fmt.Sprintf("Case %s", tc.desc), func() {

// submit early execution request
completeEarly := &types.MsgCompleteExecutionEarly{
Creator: pendingExecution.Creator,
Id: pendingExecution.Id,
}
resp, err := srv.CompleteExecutionEarly(wctx, completeEarly)
require.NoError(err)
// give coins to requester
requesterAddr, err := sdk.AccAddressFromBech32(pendingExecution.Creator)
require.NoError(err)

// manually trigger complete execution - simulate endBlocker
pendingExecution = k.GetPendingExecution(ctx, resp.Id)
execution, _, _, err := k.CompletePendingExecution(ctx, pendingExecution)
require.NoError(err)
k.ActualizeExecution(ctx, execution)
if bk.SpendableCoins(ctx, requesterAddr) != nil {
suite.pylonsApp.BankKeeper.SendCoins(ctx, requesterAddr, trashAddress, bk.SpendableCoins(ctx, requesterAddr))
}
err = k.MintCoinsToAddr(ctx, requesterAddr, tc.amountMinted)
require.NoError(err)

// submit early execution request
completeEarly := &types.MsgCompleteExecutionEarly{
Creator: pendingExecution.Creator,
Id: tc.Id,
}
resp, err := srv.CompleteExecutionEarly(wctx, completeEarly)
if tc.valid {
require.NoError(err)
pendingExecution = k.GetPendingExecution(ctx, resp.Id)
execution, _, _, err := k.CompletePendingExecution(ctx, pendingExecution)
require.NoError(err)
k.ActualizeExecution(ctx, execution)

// verify execution completion and that requester has no balance left
require.True(k.HasExecution(ctx, resp.Id))
balance := bk.SpendableCoins(ctx, requesterAddr)
require.Nil(balance)
// verify execution completion and that requester has no balance left
require.True(k.HasExecution(ctx, resp.Id))
balance := bk.SpendableCoins(ctx, requesterAddr)
require.Nil(balance)
} else {
suite.Require().Error(err)
}
})
}
}
221 changes: 104 additions & 117 deletions x/pylons/types/execution_test.go
Original file line number Diff line number Diff line change
@@ -1,137 +1,124 @@
package types

import (
"fmt"
"testing"

sdk "github.com/cosmos/cosmos-sdk/types"

"github.com/stretchr/testify/require"
)

// TODO add tests
func TestEntryListsByIDsValid1(t *testing.T) {
entryList := EntriesList{}

recipe := Recipe{
Entries: entryList,
}

idList := []string{}

_, _, _, err := EntryListsByIDs(idList, recipe)
require.NoError(t, err)
}

func TestEntryListsByIDsValid2(t *testing.T) {
entryList := EntriesList{
CoinOutputs: []CoinOutput{
{
Id: "id1",
Coin: sdk.NewInt64Coin("coin", 10),
Program: "",
},
},
ItemOutputs: []ItemOutput{
{
Id: "id2",
},
},
ItemModifyOutputs: []ItemModifyOutput{
{
Id: "id3",
},
},
}

recipe := Recipe{
Entries: entryList,
}

idList := []string{"id1", "id2", "id3"}

coinOutputs, itemOutputs, itemModifyOutputs, err := EntryListsByIDs(idList, recipe)
require.NoError(t, err)
require.Equal(t, entryList.CoinOutputs, coinOutputs)
require.Equal(t, entryList.ItemOutputs[0].Id, itemOutputs[0].Id)
require.Equal(t, entryList.ItemModifyOutputs, itemModifyOutputs)
}

func TestEntryListsByIDsValid3(t *testing.T) {
entryList := EntriesList{
CoinOutputs: []CoinOutput{
{
Id: "id1",
Coin: sdk.NewInt64Coin("coin", 10),
Program: "",
},
func TestEntryListByIDs(t *testing.T) {
for _, tc := range []struct {
desc string
entryList EntriesList
idList []string
valid bool
}{
{
desc: "Lack of Entries",
entryList: EntriesList{},
idList: []string{"id"},
valid: false,
},
ItemOutputs: []ItemOutput{
{
Id: "id2",
{
desc: "Lack of id",
entryList: EntriesList{
CoinOutputs: []CoinOutput{
{
Id: "id0",
Coin: sdk.NewInt64Coin("coin", 10),
Program: "",
},
},
ItemOutputs: []ItemOutput{
{
Id: "id2",
},
},
ItemModifyOutputs: []ItemModifyOutput{
{
Id: "id3",
},
},
},
idList: []string{"id1", "id2", "id3"},
valid: false,
},
ItemModifyOutputs: []ItemModifyOutput{
{
Id: "id3",
},
},
}

recipe := Recipe{
Entries: entryList,
}

idList := []string{"id1", "id3"}

coinOutputs, _, itemModifyOutputs, err := EntryListsByIDs(idList, recipe)
require.NoError(t, err)
require.Equal(t, entryList.CoinOutputs, coinOutputs)
require.Equal(t, entryList.ItemModifyOutputs, itemModifyOutputs)
}

func TestEntryListsByIDsInvalid1(t *testing.T) {
entryList := EntriesList{}

recipe := Recipe{
Entries: entryList,
}

idList := []string{"id"}

_, _, _, err := EntryListsByIDs(idList, recipe)
expected := fmt.Errorf("no entry with the ID %s available", idList[0])
require.Contains(t, err.Error(), expected.Error())
}

func TestEntryListsByIDsInvalid2(t *testing.T) {
entryList := EntriesList{
CoinOutputs: []CoinOutput{
{
Id: "id1",
Coin: sdk.NewInt64Coin("coin", 10),
Program: "",
},
{
desc: "Valid with empty entryList and idList",
entryList: EntriesList{},
idList: []string{},
valid: true,
},
ItemOutputs: []ItemOutput{
{
Id: "id4",
{
desc: "Valid with FULL entryList and idList",
entryList: EntriesList{
CoinOutputs: []CoinOutput{
{
Id: "id1",
Coin: sdk.NewInt64Coin("coin", 10),
Program: "",
},
},
ItemOutputs: []ItemOutput{
{
Id: "id2",
},
},
ItemModifyOutputs: []ItemModifyOutput{
{
Id: "id3",
},
},
},
idList: []string{"id1", "id2", "id3"},
valid: true,
},
ItemModifyOutputs: []ItemModifyOutput{
{
Id: "id3",
{
desc: "Valid with FULL entryList and LACK of one id in idList",
entryList: EntriesList{
CoinOutputs: []CoinOutput{
{
Id: "id1",
Coin: sdk.NewInt64Coin("coin", 10),
Program: "",
},
},
ItemOutputs: []ItemOutput{
{
Id: "id2",
},
},
ItemModifyOutputs: []ItemModifyOutput{
{
Id: "id3",
},
},
},
idList: []string{"id1", "id2"},
valid: true,
},
} {
recipe := Recipe{
Entries: tc.entryList,
}
idList := tc.idList
coinOutputs, itemOutputs, itemModifyOutputs, err := EntryListsByIDs(idList, recipe)

if tc.valid {
require.NoError(t, err)
if len(coinOutputs) != 0 {
require.Equal(t, tc.entryList.CoinOutputs, coinOutputs)
}
if len(itemOutputs) != 0 {
require.Equal(t, tc.entryList.ItemOutputs[0].Id, itemOutputs[0].Id)
}
if len(itemModifyOutputs) != 0 {
require.Equal(t, tc.entryList.ItemModifyOutputs, itemModifyOutputs)
}
} else {
require.Error(t, err)
}
}

recipe := Recipe{
Entries: entryList,
}

idList := []string{"id1", "id2", "id3"}

_, _, _, err := EntryListsByIDs(idList, recipe)
expected := fmt.Errorf("no entry with the ID %s available", idList[1])
require.Contains(t, err.Error(), expected.Error())
}