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 }