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