code.vegaprotocol.io/vega@v0.79.0/core/governance/engine_freeform_test.go (about)

     1  // Copyright (C) 2023 Gobalsky Labs Limited
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15  
    16  package governance_test
    17  
    18  import (
    19  	"context"
    20  	"testing"
    21  	"time"
    22  
    23  	"code.vegaprotocol.io/vega/core/governance"
    24  	vgrand "code.vegaprotocol.io/vega/libs/rand"
    25  
    26  	"github.com/stretchr/testify/assert"
    27  	"github.com/stretchr/testify/require"
    28  )
    29  
    30  func TestFreeformProposal(t *testing.T) {
    31  	t.Run("Submitting a freeform proposal succeeds", testSubmittingFreeformProposalSucceeds)
    32  	t.Run("Freeform proposal does not wait for enactment timestamp", testFreeformProposalDoesNotWaitToEnact)
    33  }
    34  
    35  func testSubmittingFreeformProposalSucceeds(t *testing.T) {
    36  	eng := getTestEngine(t, time.Now())
    37  
    38  	// given
    39  	party := eng.newValidParty("a-valid-party", 123456789)
    40  	proposal := eng.newFreeformProposal(party.Id, eng.tsvc.GetTimeNow().Add(48*time.Hour))
    41  
    42  	// setup
    43  	eng.expectOpenProposalEvent(t, party.Id, proposal.ID)
    44  
    45  	// when
    46  	toSubmit, err := eng.submitProposal(t, proposal)
    47  
    48  	// then
    49  	require.NoError(t, err)
    50  	require.NotNil(t, toSubmit)
    51  }
    52  
    53  func testFreeformProposalDoesNotWaitToEnact(t *testing.T) {
    54  	eng := getTestEngine(t, time.Now())
    55  
    56  	// when
    57  	proposer := vgrand.RandomStr(5)
    58  	proposal := eng.newFreeformProposal(proposer, eng.tsvc.GetTimeNow().Add(48*time.Hour))
    59  
    60  	// setup
    61  	eng.ensureStakingAssetTotalSupply(t, 9)
    62  	eng.ensureAllAssetEnabled(t)
    63  	eng.ensureTokenBalanceForParty(t, proposer, 1)
    64  
    65  	// expect
    66  	eng.expectOpenProposalEvent(t, proposer, proposal.ID)
    67  
    68  	// when
    69  	_, err := eng.submitProposal(t, proposal)
    70  
    71  	// then
    72  	require.NoError(t, err)
    73  
    74  	// given
    75  	voter1 := vgrand.RandomStr(5)
    76  
    77  	// setup
    78  	eng.ensureTokenBalanceForParty(t, voter1, 7)
    79  
    80  	// expect
    81  	eng.expectVoteEvent(t, voter1, proposal.ID)
    82  
    83  	// then
    84  	err = eng.addYesVote(t, voter1, proposal.ID)
    85  
    86  	// then
    87  	require.NoError(t, err)
    88  
    89  	// given
    90  	afterClosing := time.Unix(proposal.Terms.ClosingTimestamp, 0).Add(time.Second)
    91  
    92  	// setup
    93  	eng.ensureTokenBalanceForParty(t, voter1, 7)
    94  
    95  	// expect
    96  	eng.expectPassedProposalEvent(t, proposal.ID)
    97  	eng.expectTotalGovernanceTokenFromVoteEvents(t, "1", "7")
    98  	eng.expectGetMarketState(t, proposal.ID)
    99  
   100  	// when the proposal is closed, it is enacted immediately
   101  	toBeEnacted, _ := eng.OnTick(context.Background(), afterClosing)
   102  
   103  	// then
   104  	require.Len(t, toBeEnacted, 1)
   105  	assert.Equal(t, proposal.ID, toBeEnacted[0].Proposal().ID)
   106  
   107  	// given
   108  	voter2 := vgrand.RandomStr(5)
   109  
   110  	// when
   111  	err = eng.addNoVote(t, voter2, proposal.ID)
   112  
   113  	// then
   114  	require.Error(t, err)
   115  	assert.EqualError(t, err, governance.ErrProposalDoesNotExist.Error())
   116  }