github.com/lino-network/lino@v0.6.11/x/post/manager/event_test.go (about)

     1  package manager
     2  
     3  import (
     4  	"github.com/stretchr/testify/mock"
     5  
     6  	linotypes "github.com/lino-network/lino/types"
     7  	types "github.com/lino-network/lino/x/post/types"
     8  )
     9  
    10  func (suite *PostManagerTestSuite) TestExecRewardEvent() {
    11  	user1 := suite.user1
    12  	user2 := suite.user2
    13  	app1 := suite.app1
    14  	postID := "post1"
    15  	err := suite.pm.CreatePost(suite.Ctx, user1, postID, app1, "content", "title")
    16  	suite.Require().Nil(err)
    17  
    18  	// fixed pool in this test.
    19  	suite.am.On("GetPool", mock.Anything, linotypes.InflationConsumptionPool).Return(
    20  		linotypes.NewCoinFromInt64(10000), nil).Maybe()
    21  
    22  	testCases := []struct {
    23  		testName        string
    24  		event           types.RewardEvent
    25  		consumptionPool linotypes.MiniDollar
    26  		hasDev          bool
    27  		hasPost         bool
    28  		expectedReward  linotypes.Coin
    29  	}{
    30  		{
    31  			testName: "OK",
    32  			event: types.RewardEvent{
    33  				PostAuthor: user1,
    34  				PostID:     postID,
    35  				Consumer:   user2,
    36  				Evaluate:   linotypes.NewMiniDollar(100),
    37  				FromApp:    app1,
    38  			},
    39  			consumptionPool: linotypes.NewMiniDollar(300),
    40  			expectedReward:  linotypes.NewCoinFromInt64(3333),
    41  			hasDev:          true,
    42  			hasPost:         true,
    43  		},
    44  		{
    45  			testName: "PostDeleted",
    46  			event: types.RewardEvent{
    47  				PostAuthor: user1,
    48  				PostID:     "deletedpost",
    49  				Consumer:   user2,
    50  				Evaluate:   linotypes.NewMiniDollar(100),
    51  				FromApp:    app1,
    52  			},
    53  			hasDev:  true,
    54  			hasPost: false,
    55  		},
    56  		{
    57  			testName: "NoDev",
    58  			event: types.RewardEvent{
    59  				PostAuthor: user1,
    60  				PostID:     postID,
    61  				Consumer:   user2,
    62  				Evaluate:   linotypes.NewMiniDollar(100),
    63  				FromApp:    user2,
    64  			},
    65  			consumptionPool: linotypes.NewMiniDollar(300),
    66  			expectedReward:  linotypes.NewCoinFromInt64(3333),
    67  			hasDev:          false,
    68  			hasPost:         true,
    69  		},
    70  	}
    71  
    72  	for _, tc := range testCases {
    73  		suite.pm.postStorage.SetConsumptionWindow(suite.Ctx, tc.consumptionPool)
    74  		if tc.hasPost {
    75  			suite.am.On("MoveFromPool", mock.Anything, linotypes.InflationConsumptionPool,
    76  				linotypes.NewAccOrAddrFromAcc(tc.event.PostAuthor),
    77  				tc.expectedReward).Return(nil).Once()
    78  			if tc.hasDev {
    79  				suite.dev.On(
    80  					"ReportConsumption", mock.Anything,
    81  					tc.event.FromApp, tc.event.Evaluate).Return(nil).Once()
    82  			}
    83  		}
    84  		err := suite.pm.ExecRewardEvent(suite.Ctx, tc.event)
    85  		suite.Nil(err)
    86  		suite.am.AssertExpectations(suite.T())
    87  		suite.dev.AssertExpectations(suite.T())
    88  	}
    89  }
    90  
    91  func (suite *PostManagerTestSuite) TestExecMultipleRewardEvents() {
    92  	user1 := suite.user1
    93  	user2 := suite.user2
    94  	app1 := suite.app1
    95  	postID := "post1"
    96  	err := suite.pm.CreatePost(suite.Ctx, user1, postID, app1, "content", "title")
    97  	suite.Require().Nil(err)
    98  	err = suite.pm.CreatePost(suite.Ctx, user2, postID, app1, "content", "title")
    99  	suite.Require().Nil(err)
   100  
   101  	totalConsumption := linotypes.NewMiniDollar(100)
   102  	totalInflation := linotypes.NewCoinFromInt64(10000)
   103  	suite.pm.postStorage.SetConsumptionWindow(suite.Ctx, totalConsumption)
   104  	events := []types.RewardEvent{
   105  		{
   106  			PostAuthor: user1,
   107  			PostID:     postID,
   108  			Evaluate:   linotypes.NewMiniDollar(20),
   109  			FromApp:    app1,
   110  		},
   111  		{
   112  			PostAuthor: user2,
   113  			PostID:     postID,
   114  			Evaluate:   linotypes.NewMiniDollar(30),
   115  			FromApp:    app1,
   116  		},
   117  		{
   118  			PostAuthor: user2,
   119  			PostID:     postID,
   120  			Evaluate:   linotypes.NewMiniDollar(50),
   121  			FromApp:    app1,
   122  		},
   123  	}
   124  
   125  	for _, e := range events {
   126  		suite.am.On("GetPool", mock.Anything, linotypes.InflationConsumptionPool).Return(
   127  			totalInflation, nil).Once()
   128  		inflation := linotypes.DecToCoin(
   129  			totalInflation.ToDec().Mul(e.Evaluate.ToDec().Quo(totalConsumption.ToDec())))
   130  		totalInflation = totalInflation.Minus(inflation)
   131  		suite.am.On("MoveFromPool", mock.Anything, linotypes.InflationConsumptionPool,
   132  			linotypes.NewAccOrAddrFromAcc(e.PostAuthor), inflation).Return(nil).Once()
   133  		suite.dev.On(
   134  			"ReportConsumption", mock.Anything,
   135  			e.FromApp, e.Evaluate).Return(nil).Once()
   136  		err := suite.pm.ExecRewardEvent(suite.Ctx, e)
   137  		suite.Nil(err)
   138  		totalConsumption = totalConsumption.Minus(e.Evaluate)
   139  	}
   140  	suite.am.AssertExpectations(suite.T())
   141  }