github.com/Finschia/finschia-sdk@v0.48.1/x/foundation/keeper/internal/treasury_test.go (about) 1 package internal_test 2 3 import ( 4 sdk "github.com/Finschia/finschia-sdk/types" 5 authtypes "github.com/Finschia/finschia-sdk/x/auth/types" 6 "github.com/Finschia/finschia-sdk/x/foundation" 7 ) 8 9 func (s *KeeperTestSuite) TestCollectFoundationTax() { 10 ctx, _ := s.ctx.CacheContext() 11 12 // empty fee collector first 13 // send the fee to the stranger 14 // and get it back later if the test case requires 15 collector := authtypes.NewModuleAddress(authtypes.FeeCollectorName) 16 fees := s.bankKeeper.GetAllBalances(ctx, collector) 17 s.bankKeeper.SendCoinsFromModuleToAccount(ctx, authtypes.FeeCollectorName, s.stranger, fees) 18 19 for name, tc := range map[string]struct { 20 fee sdk.Int 21 taxRatio sdk.Dec 22 tax sdk.Int 23 valid bool 24 }{ 25 "common": { 26 fee: fees[0].Amount, 27 taxRatio: sdk.MustNewDecFromStr("0.123456789"), 28 tax: sdk.NewInt(121932631), 29 valid: true, 30 }, 31 "zero fee": { 32 fee: sdk.ZeroInt(), 33 taxRatio: sdk.MustNewDecFromStr("0.123456789"), 34 tax: sdk.ZeroInt(), 35 valid: true, 36 }, 37 "zero ratio": { 38 fee: fees[0].Amount, 39 taxRatio: sdk.ZeroDec(), 40 tax: sdk.ZeroInt(), 41 valid: true, 42 }, 43 } { 44 s.Run(name, func() { 45 ctx, _ := ctx.CacheContext() 46 47 // set fee 48 s.bankKeeper.SendCoinsFromAccountToModule(ctx, s.stranger, authtypes.FeeCollectorName, sdk.NewCoins(sdk.NewCoin(fees[0].Denom, tc.fee))) 49 50 // set tax ratio 51 s.impl.SetParams(ctx, foundation.Params{ 52 FoundationTax: tc.taxRatio, 53 }) 54 55 before := s.impl.GetTreasury(ctx) 56 s.Require().Equal(1, len(before)) 57 s.Require().Equal(sdk.NewDecFromInt(s.balance), before[0].Amount) 58 59 tax := sdk.NewDecFromInt(tc.fee).MulTruncate(tc.taxRatio).TruncateInt() 60 // ensure the behavior does not change 61 s.Require().Equal(tc.tax, tax) 62 63 err := s.impl.CollectFoundationTax(ctx) 64 if !tc.valid { 65 s.Require().Error(err) 66 return 67 } 68 s.Require().NoError(err) 69 70 expectedAfter := s.balance.Add(tax) 71 after := s.impl.GetTreasury(ctx) 72 s.Require().Equal(1, len(after)) 73 s.Require().Equal(sdk.NewDecFromInt(expectedAfter), after[0].Amount) 74 }) 75 } 76 } 77 78 func (s *KeeperTestSuite) TestFundTreasury() { 79 testCases := map[string]struct { 80 amount sdk.Int 81 valid bool 82 }{ 83 "valid amount": { 84 amount: s.balance, 85 valid: true, 86 }, 87 "insufficient coins": { 88 amount: s.balance.Add(sdk.OneInt()), 89 }, 90 } 91 92 for name, tc := range testCases { 93 s.Run(name, func() { 94 ctx, _ := s.ctx.CacheContext() 95 96 before := s.impl.GetTreasury(ctx) 97 98 amount := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, tc.amount)) 99 err := s.impl.FundTreasury(ctx, s.stranger, amount) 100 if !tc.valid { 101 s.Require().Error(err) 102 return 103 } 104 s.Require().NoError(err) 105 106 expectedAfter := before.Add(sdk.NewDecCoinsFromCoins(amount...)...) 107 poolAfter := s.impl.GetTreasury(ctx) 108 s.Require().Equal(sdk.NewDecCoins(expectedAfter...), sdk.NewDecCoins(poolAfter...)) 109 balanceAfter := sdk.NewDecCoinsFromCoins(s.bankKeeper.GetAllBalances(ctx, authtypes.NewModuleAddress(foundation.TreasuryName))...) 110 s.Require().Equal(sdk.NewDecCoins(expectedAfter...), sdk.NewDecCoins(balanceAfter...)) 111 }) 112 } 113 } 114 115 func (s *KeeperTestSuite) TestWithdrawFromTreasury() { 116 testCases := map[string]struct { 117 amount sdk.Int 118 valid bool 119 }{ 120 "valid amount": { 121 amount: s.balance, 122 valid: true, 123 }, 124 "insufficient coins": { 125 amount: s.balance.Add(sdk.OneInt()), 126 }, 127 } 128 129 for name, tc := range testCases { 130 s.Run(name, func() { 131 ctx, _ := s.ctx.CacheContext() 132 133 before := s.impl.GetTreasury(ctx) 134 135 amount := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, tc.amount)) 136 err := s.impl.WithdrawFromTreasury(ctx, s.stranger, amount) 137 if !tc.valid { 138 s.Require().Error(err) 139 return 140 } 141 s.Require().NoError(err) 142 143 expectedAfter := before.Sub(sdk.NewDecCoinsFromCoins(amount...)) 144 poolAfter := s.impl.GetTreasury(ctx) 145 s.Require().Equal(sdk.NewDecCoins(expectedAfter...), sdk.NewDecCoins(poolAfter...)) 146 balanceAfter := sdk.NewDecCoinsFromCoins(s.bankKeeper.GetAllBalances(ctx, authtypes.NewModuleAddress(foundation.TreasuryName))...) 147 s.Require().Equal(sdk.NewDecCoins(expectedAfter...), sdk.NewDecCoins(balanceAfter...)) 148 }) 149 } 150 }