github.com/Finschia/finschia-sdk@v0.49.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  				err := suite.app.UpgradeKeeper.ScheduleUpgrade(suite.ctx, plan)
    59  				suite.Require().NoError(err)
    60  
    61  				req = &types.QueryCurrentPlanRequest{}
    62  				expResponse = types.QueryCurrentPlanResponse{Plan: &plan}
    63  			},
    64  			true,
    65  		},
    66  	}
    67  
    68  	for _, tc := range testCases {
    69  		suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
    70  			suite.SetupTest() // reset
    71  
    72  			tc.malleate()
    73  
    74  			res, err := suite.queryClient.CurrentPlan(gocontext.Background(), req)
    75  
    76  			if tc.expPass {
    77  				suite.Require().NoError(err)
    78  				suite.Require().NotNil(res)
    79  				suite.Require().Equal(&expResponse, res)
    80  			} else {
    81  				suite.Require().Error(err)
    82  			}
    83  		})
    84  	}
    85  }
    86  
    87  func (suite *UpgradeTestSuite) TestAppliedCurrentPlan() {
    88  	var (
    89  		req       *types.QueryAppliedPlanRequest
    90  		expHeight int64
    91  	)
    92  
    93  	testCases := []struct {
    94  		msg      string
    95  		malleate func()
    96  		expPass  bool
    97  	}{
    98  		{
    99  			"with non-existent upgrade plan",
   100  			func() {
   101  				req = &types.QueryAppliedPlanRequest{Name: "foo"}
   102  			},
   103  			true,
   104  		},
   105  		{
   106  			"with applied upgrade plan",
   107  			func() {
   108  				expHeight = 5
   109  
   110  				planName := "test-plan"
   111  				plan := types.Plan{Name: planName, Height: expHeight}
   112  				err := suite.app.UpgradeKeeper.ScheduleUpgrade(suite.ctx, plan)
   113  				suite.Require().NoError(err)
   114  
   115  				suite.ctx = suite.ctx.WithBlockHeight(expHeight)
   116  				suite.app.UpgradeKeeper.SetUpgradeHandler(planName, func(ctx sdk.Context, plan types.Plan, vm module.VersionMap) (module.VersionMap, error) {
   117  					return vm, nil
   118  				})
   119  				suite.app.UpgradeKeeper.ApplyUpgrade(suite.ctx, plan)
   120  
   121  				req = &types.QueryAppliedPlanRequest{Name: planName}
   122  			},
   123  			true,
   124  		},
   125  	}
   126  
   127  	for _, tc := range testCases {
   128  		suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
   129  			suite.SetupTest() // reset
   130  
   131  			tc.malleate()
   132  
   133  			res, err := suite.queryClient.AppliedPlan(gocontext.Background(), req)
   134  
   135  			if tc.expPass {
   136  				suite.Require().NoError(err)
   137  				suite.Require().NotNil(res)
   138  				suite.Require().Equal(expHeight, res.Height)
   139  			} else {
   140  				suite.Require().Error(err)
   141  			}
   142  		})
   143  	}
   144  }
   145  
   146  func (suite *UpgradeTestSuite) TestModuleVersions() {
   147  	testCases := []struct {
   148  		msg     string
   149  		req     types.QueryModuleVersionsRequest
   150  		single  bool
   151  		expPass bool
   152  	}{
   153  		{
   154  			msg:     "test full query",
   155  			req:     types.QueryModuleVersionsRequest{},
   156  			single:  false,
   157  			expPass: true,
   158  		},
   159  		{
   160  			msg:     "test single module",
   161  			req:     types.QueryModuleVersionsRequest{ModuleName: "bank"},
   162  			single:  true,
   163  			expPass: true,
   164  		},
   165  		{
   166  			msg:     "test non-existent module",
   167  			req:     types.QueryModuleVersionsRequest{ModuleName: "abcdefg"},
   168  			single:  true,
   169  			expPass: false,
   170  		},
   171  	}
   172  
   173  	vm := suite.app.UpgradeKeeper.GetModuleVersionMap(suite.ctx)
   174  	mv := suite.app.UpgradeKeeper.GetModuleVersions(suite.ctx)
   175  
   176  	for _, tc := range testCases {
   177  		suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
   178  			suite.SetupTest() // reset
   179  
   180  			res, err := suite.queryClient.ModuleVersions(gocontext.Background(), &tc.req)
   181  
   182  			if tc.expPass {
   183  				suite.Require().NoError(err)
   184  				suite.Require().NotNil(res)
   185  
   186  				if tc.single {
   187  					// test that the single module response is valid
   188  					suite.Require().Len(res.ModuleVersions, 1)
   189  					// make sure we got the right values
   190  					suite.Require().Equal(vm[tc.req.ModuleName], res.ModuleVersions[0].Version)
   191  					suite.Require().Equal(tc.req.ModuleName, res.ModuleVersions[0].Name)
   192  				} else {
   193  					// check that the full response is valid
   194  					suite.Require().NotEmpty(res.ModuleVersions)
   195  					suite.Require().Equal(len(mv), len(res.ModuleVersions))
   196  					for i, v := range res.ModuleVersions {
   197  						suite.Require().Equal(mv[i].Version, v.Version)
   198  						suite.Require().Equal(mv[i].Name, v.Name)
   199  					}
   200  				}
   201  			} else {
   202  				suite.Require().Error(err)
   203  			}
   204  		})
   205  	}
   206  }
   207  
   208  func TestUpgradeTestSuite(t *testing.T) {
   209  	suite.Run(t, new(UpgradeTestSuite))
   210  }