github.com/cosmos/cosmos-sdk@v0.50.10/x/gov/keeper/hooks_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/cosmos/cosmos-sdk/codec/address"
    11  	simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
    12  	sdk "github.com/cosmos/cosmos-sdk/types"
    13  	"github.com/cosmos/cosmos-sdk/x/gov"
    14  	"github.com/cosmos/cosmos-sdk/x/gov/keeper"
    15  	"github.com/cosmos/cosmos-sdk/x/gov/types"
    16  	v1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1"
    17  )
    18  
    19  var _ types.GovHooks = &MockGovHooksReceiver{}
    20  
    21  // GovHooks event hooks for governance proposal object (noalias)
    22  type MockGovHooksReceiver struct {
    23  	AfterProposalSubmissionValid        bool
    24  	AfterProposalDepositValid           bool
    25  	AfterProposalVoteValid              bool
    26  	AfterProposalFailedMinDepositValid  bool
    27  	AfterProposalVotingPeriodEndedValid bool
    28  }
    29  
    30  func (h *MockGovHooksReceiver) AfterProposalSubmission(ctx context.Context, proposalID uint64) error {
    31  	h.AfterProposalSubmissionValid = true
    32  	return nil
    33  }
    34  
    35  func (h *MockGovHooksReceiver) AfterProposalDeposit(ctx context.Context, proposalID uint64, depositorAddr sdk.AccAddress) error {
    36  	h.AfterProposalDepositValid = true
    37  	return nil
    38  }
    39  
    40  func (h *MockGovHooksReceiver) AfterProposalVote(ctx context.Context, proposalID uint64, voterAddr sdk.AccAddress) error {
    41  	h.AfterProposalVoteValid = true
    42  	return nil
    43  }
    44  
    45  func (h *MockGovHooksReceiver) AfterProposalFailedMinDeposit(ctx context.Context, proposalID uint64) error {
    46  	h.AfterProposalFailedMinDepositValid = true
    47  	return nil
    48  }
    49  
    50  func (h *MockGovHooksReceiver) AfterProposalVotingPeriodEnded(ctx context.Context, proposalID uint64) error {
    51  	h.AfterProposalVotingPeriodEndedValid = true
    52  	return nil
    53  }
    54  
    55  func TestHooks(t *testing.T) {
    56  	minDeposit := v1.DefaultParams().MinDeposit
    57  	govKeeper, authKeeper, bankKeeper, stakingKeeper, _, _, ctx := setupGovKeeper(t)
    58  	addrs := simtestutil.AddTestAddrs(bankKeeper, stakingKeeper, ctx, 1, minDeposit[0].Amount)
    59  
    60  	authKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec("cosmos")).AnyTimes()
    61  	stakingKeeper.EXPECT().ValidatorAddressCodec().Return(address.NewBech32Codec("cosmosvaloper")).AnyTimes()
    62  
    63  	govHooksReceiver := MockGovHooksReceiver{}
    64  
    65  	keeper.UnsafeSetHooks(
    66  		govKeeper, types.NewMultiGovHooks(&govHooksReceiver),
    67  	)
    68  
    69  	require.False(t, govHooksReceiver.AfterProposalSubmissionValid)
    70  	require.False(t, govHooksReceiver.AfterProposalDepositValid)
    71  	require.False(t, govHooksReceiver.AfterProposalVoteValid)
    72  	require.False(t, govHooksReceiver.AfterProposalFailedMinDepositValid)
    73  	require.False(t, govHooksReceiver.AfterProposalVotingPeriodEndedValid)
    74  
    75  	tp := TestProposal
    76  	_, err := govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false)
    77  	require.NoError(t, err)
    78  	require.True(t, govHooksReceiver.AfterProposalSubmissionValid)
    79  
    80  	params, _ := govKeeper.Params.Get(ctx)
    81  	newHeader := ctx.BlockHeader()
    82  	newHeader.Time = ctx.BlockHeader().Time.Add(*params.MaxDepositPeriod).Add(time.Duration(1) * time.Second)
    83  	ctx = ctx.WithBlockHeader(newHeader)
    84  	gov.EndBlocker(ctx, govKeeper)
    85  
    86  	require.True(t, govHooksReceiver.AfterProposalFailedMinDepositValid)
    87  
    88  	p2, err := govKeeper.SubmitProposal(ctx, tp, "", "test", "summary", sdk.AccAddress("cosmos1ghekyjucln7y67ntx7cf27m9dpuxxemn4c8g4r"), false)
    89  	require.NoError(t, err)
    90  
    91  	activated, err := govKeeper.AddDeposit(ctx, p2.Id, addrs[0], minDeposit)
    92  	require.True(t, activated)
    93  	require.NoError(t, err)
    94  	require.True(t, govHooksReceiver.AfterProposalDepositValid)
    95  
    96  	err = govKeeper.AddVote(ctx, p2.Id, addrs[0], v1.NewNonSplitVoteOption(v1.OptionYes), "")
    97  	require.NoError(t, err)
    98  	require.True(t, govHooksReceiver.AfterProposalVoteValid)
    99  
   100  	newHeader = ctx.BlockHeader()
   101  	newHeader.Time = ctx.BlockHeader().Time.Add(*params.VotingPeriod).Add(time.Duration(1) * time.Second)
   102  	ctx = ctx.WithBlockHeader(newHeader)
   103  	gov.EndBlocker(ctx, govKeeper)
   104  	require.True(t, govHooksReceiver.AfterProposalVotingPeriodEndedValid)
   105  }