github.com/Finschia/finschia-sdk@v0.48.1/x/upgrade/keeper/grpc_query_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	gocontext "context"
     5  	"fmt"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/suite"
     9  	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
    10  
    11  	"github.com/Finschia/finschia-sdk/baseapp"
    12  	"github.com/Finschia/finschia-sdk/simapp"
    13  	sdk "github.com/Finschia/finschia-sdk/types"
    14  	"github.com/Finschia/finschia-sdk/types/module"
    15  	"github.com/Finschia/finschia-sdk/x/upgrade/types"
    16  )
    17  
    18  type UpgradeTestSuite struct {
    19  	suite.Suite
    20  
    21  	app         *simapp.SimApp
    22  	ctx         sdk.Context
    23  	queryClient types.QueryClient
    24  }
    25  
    26  func (suite *UpgradeTestSuite) SetupTest() {
    27  	suite.app = simapp.Setup(false)
    28  	suite.ctx = suite.app.BaseApp.NewContext(false, tmproto.Header{})
    29  
    30  	queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry())
    31  	types.RegisterQueryServer(queryHelper, suite.app.UpgradeKeeper)
    32  	suite.queryClient = types.NewQueryClient(queryHelper)
    33  }
    34  
    35  func (suite *UpgradeTestSuite) TestQueryCurrentPlan() {
    36  	var (
    37  		req         *types.QueryCurrentPlanRequest
    38  		expResponse types.QueryCurrentPlanResponse
    39  	)
    40  
    41  	testCases := []struct {
    42  		msg      string
    43  		malleate func()
    44  		expPass  bool
    45  	}{
    46  		{
    47  			"without current upgrade plan",
    48  			func() {
    49  				req = &types.QueryCurrentPlanRequest{}
    50  				expResponse = types.QueryCurrentPlanResponse{}
    51  			},
    52  			true,
    53  		},
    54  		{
    55  			"with current upgrade plan",
    56  			func() {
    57  				plan := types.Plan{Name: "test-plan", Height: 5}
    58  				suite.app.UpgradeKeeper.ScheduleUpgrade(suite.ctx, plan)
    59  
    60  				req = &types.QueryCurrentPlanRequest{}
    61  				expResponse = types.QueryCurrentPlanResponse{Plan: &plan}
    62  			},
    63  			true,
    64  		},
    65  	}
    66  
    67  	for _, tc := range testCases {
    68  		suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
    69  			suite.SetupTest() // reset
    70  
    71  			tc.malleate()
    72  
    73  			res, err := suite.queryClient.CurrentPlan(gocontext.Background(), req)
    74  
    75  			if tc.expPass {
    76  				suite.Require().NoError(err)
    77  				suite.Require().NotNil(res)
    78  				suite.Require().Equal(&expResponse, res)
    79  			} else {
    80  				suite.Require().Error(err)
    81  			}
    82  		})
    83  	}
    84  }
    85  
    86  func (suite *UpgradeTestSuite) TestAppliedCurrentPlan() {
    87  	var (
    88  		req       *types.QueryAppliedPlanRequest
    89  		expHeight int64
    90  	)
    91  
    92  	testCases := []struct {
    93  		msg      string
    94  		malleate func()
    95  		expPass  bool
    96  	}{
    97  		{
    98  			"with non-existent upgrade plan",
    99  			func() {
   100  				req = &types.QueryAppliedPlanRequest{Name: "foo"}
   101  			},
   102  			true,
   103  		},
   104  		{
   105  			"with applied upgrade plan",
   106  			func() {
   107  				expHeight = 5
   108  
   109  				planName := "test-plan"
   110  				plan := types.Plan{Name: planName, Height: expHeight}
   111  				suite.app.UpgradeKeeper.ScheduleUpgrade(suite.ctx, plan)
   112  
   113  				suite.ctx = suite.ctx.WithBlockHeight(expHeight)
   114  				suite.app.UpgradeKeeper.SetUpgradeHandler(planName, func(ctx sdk.Context, plan types.Plan, vm module.VersionMap) (module.VersionMap, error) {
   115  					return vm, nil
   116  				})
   117  				suite.app.UpgradeKeeper.ApplyUpgrade(suite.ctx, plan)
   118  
   119  				req = &types.QueryAppliedPlanRequest{Name: planName}
   120  			},
   121  			true,
   122  		},
   123  	}
   124  
   125  	for _, tc := range testCases {
   126  		suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
   127  			suite.SetupTest() // reset
   128  
   129  			tc.malleate()
   130  
   131  			res, err := suite.queryClient.AppliedPlan(gocontext.Background(), req)
   132  
   133  			if tc.expPass {
   134  				suite.Require().NoError(err)
   135  				suite.Require().NotNil(res)
   136  				suite.Require().Equal(expHeight, res.Height)
   137  			} else {
   138  				suite.Require().Error(err)
   139  			}
   140  		})
   141  	}
   142  }
   143  
   144  func (suite *UpgradeTestSuite) TestModuleVersions() {
   145  	testCases := []struct {
   146  		msg     string
   147  		req     types.QueryModuleVersionsRequest
   148  		single  bool
   149  		expPass bool
   150  	}{
   151  		{
   152  			msg:     "test full query",
   153  			req:     types.QueryModuleVersionsRequest{},
   154  			single:  false,
   155  			expPass: true,
   156  		},
   157  		{
   158  			msg:     "test single module",
   159  			req:     types.QueryModuleVersionsRequest{ModuleName: "bank"},
   160  			single:  true,
   161  			expPass: true,
   162  		},
   163  		{
   164  			msg:     "test non-existent module",
   165  			req:     types.QueryModuleVersionsRequest{ModuleName: "abcdefg"},
   166  			single:  true,
   167  			expPass: false,
   168  		},
   169  	}
   170  
   171  	vm := suite.app.UpgradeKeeper.GetModuleVersionMap(suite.ctx)
   172  	mv := suite.app.UpgradeKeeper.GetModuleVersions(suite.ctx)
   173  
   174  	for _, tc := range testCases {
   175  		suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
   176  			suite.SetupTest() // reset
   177  
   178  			res, err := suite.queryClient.ModuleVersions(gocontext.Background(), &tc.req)
   179  
   180  			if tc.expPass {
   181  				suite.Require().NoError(err)
   182  				suite.Require().NotNil(res)
   183  
   184  				if tc.single {
   185  					// test that the single module response is valid
   186  					suite.Require().Len(res.ModuleVersions, 1)
   187  					// make sure we got the right values
   188  					suite.Require().Equal(vm[tc.req.ModuleName], res.ModuleVersions[0].Version)
   189  					suite.Require().Equal(tc.req.ModuleName, res.ModuleVersions[0].Name)
   190  				} else {
   191  					// check that the full response is valid
   192  					suite.Require().NotEmpty(res.ModuleVersions)
   193  					suite.Require().Equal(len(mv), len(res.ModuleVersions))
   194  					for i, v := range res.ModuleVersions {
   195  						suite.Require().Equal(mv[i].Version, v.Version)
   196  						suite.Require().Equal(mv[i].Name, v.Name)
   197  					}
   198  				}
   199  			} else {
   200  				suite.Require().Error(err)
   201  			}
   202  		})
   203  	}
   204  }
   205  
   206  func TestUpgradeTestSuite(t *testing.T) {
   207  	suite.Run(t, new(UpgradeTestSuite))
   208  }