code.vegaprotocol.io/vega@v0.79.0/datanode/sqlstore/vesting_stats_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 sqlstore_test
    17  
    18  import (
    19  	"testing"
    20  	"time"
    21  
    22  	"code.vegaprotocol.io/vega/datanode/entities"
    23  	"code.vegaprotocol.io/vega/datanode/sqlstore"
    24  	"code.vegaprotocol.io/vega/libs/num"
    25  
    26  	"github.com/stretchr/testify/assert"
    27  	"github.com/stretchr/testify/require"
    28  )
    29  
    30  func setupVestingStatsTest(t *testing.T) (*sqlstore.Blocks, *sqlstore.VestingStats) {
    31  	t.Helper()
    32  	bs := sqlstore.NewBlocks(connectionSource)
    33  	plbs := sqlstore.NewVestingStats(connectionSource)
    34  
    35  	return bs, plbs
    36  }
    37  
    38  func TestVestingStats(t *testing.T) {
    39  	_, vs := setupVestingStatsTest(t)
    40  
    41  	const (
    42  		party1 = "70432aa1dc6bc20a9b404d30f23e6a8def11a1692609dcef0ad8dc558d9df7db"
    43  		party2 = "a696300fec90755c90e2489af68fe2dfede5744184711ea3acde0ca55ae19585"
    44  	)
    45  
    46  	ctx := tempTransaction(t)
    47  
    48  	t.Run("return error if do not exists", func(t *testing.T) {
    49  		_, err := vs.GetByPartyID(ctx, party1)
    50  		require.EqualError(t, err, "no resource corresponding to this id")
    51  		_, err = vs.GetByPartyID(ctx, party2)
    52  		require.EqualError(t, err, "no resource corresponding to this id")
    53  	})
    54  
    55  	now := time.Now().Truncate(time.Millisecond)
    56  
    57  	t.Run("can insert successfully", func(t *testing.T) {
    58  		w := entities.VestingStatsUpdated{
    59  			AtEpoch:  1,
    60  			VegaTime: now,
    61  			PartyVestingStats: []*entities.PartyVestingStats{
    62  				{
    63  					PartyID:                     entities.PartyID(party1),
    64  					RewardBonusMultiplier:       num.MustDecimalFromString("0.5"),
    65  					QuantumBalance:              num.MustDecimalFromString("10001"),
    66  					SummedRewardBonusMultiplier: num.MustDecimalFromString("0.5"),
    67  					SummedQuantumBalance:        num.MustDecimalFromString("10001"),
    68  					VegaTime:                    now,
    69  					AtEpoch:                     1,
    70  				},
    71  				{
    72  					PartyID:                     entities.PartyID(party2),
    73  					RewardBonusMultiplier:       num.MustDecimalFromString("1.5"),
    74  					QuantumBalance:              num.MustDecimalFromString("20001"),
    75  					SummedRewardBonusMultiplier: num.MustDecimalFromString("1.5"),
    76  					SummedQuantumBalance:        num.MustDecimalFromString("20001"),
    77  					VegaTime:                    now,
    78  					AtEpoch:                     1,
    79  				},
    80  			},
    81  		}
    82  
    83  		assert.NoError(t, vs.Add(ctx, &w))
    84  
    85  		pvs1, err := vs.GetByPartyID(ctx, party1)
    86  		require.NoError(t, err)
    87  		require.Equal(t, *w.PartyVestingStats[0], pvs1)
    88  		pvs2, err := vs.GetByPartyID(ctx, party2)
    89  		require.NoError(t, err)
    90  		require.Equal(t, *w.PartyVestingStats[1], pvs2)
    91  	})
    92  
    93  	now = now.Add(24 * time.Hour).Truncate(time.Millisecond)
    94  
    95  	t.Run("can replace exisisting values", func(t *testing.T) {
    96  		w := entities.VestingStatsUpdated{
    97  			AtEpoch:  2,
    98  			VegaTime: now,
    99  			PartyVestingStats: []*entities.PartyVestingStats{
   100  				{
   101  					PartyID:                     entities.PartyID(party1),
   102  					RewardBonusMultiplier:       num.MustDecimalFromString("1"),
   103  					QuantumBalance:              num.MustDecimalFromString("12001"),
   104  					SummedRewardBonusMultiplier: num.MustDecimalFromString("1"),
   105  					SummedQuantumBalance:        num.MustDecimalFromString("12001"),
   106  					VegaTime:                    now,
   107  					AtEpoch:                     2,
   108  				},
   109  				{
   110  					PartyID:                     entities.PartyID(party2),
   111  					RewardBonusMultiplier:       num.MustDecimalFromString("2"),
   112  					QuantumBalance:              num.MustDecimalFromString("30001"),
   113  					SummedRewardBonusMultiplier: num.MustDecimalFromString("2"),
   114  					SummedQuantumBalance:        num.MustDecimalFromString("30001"),
   115  					VegaTime:                    now,
   116  					AtEpoch:                     2,
   117  				},
   118  			},
   119  		}
   120  
   121  		assert.NoError(t, vs.Add(ctx, &w))
   122  
   123  		pvs1, err := vs.GetByPartyID(ctx, party1)
   124  		require.NoError(t, err)
   125  		require.Equal(t, *w.PartyVestingStats[0], pvs1)
   126  		pvs2, err := vs.GetByPartyID(ctx, party2)
   127  		require.NoError(t, err)
   128  		require.Equal(t, *w.PartyVestingStats[1], pvs2)
   129  	})
   130  }