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 }