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  }